历史上的今天
返回首页

历史上的今天

今天是:2025年08月19日(星期二)

正在发生

2019年08月19日 | STM32学习第一周之 按键矩阵

2019-08-19 来源:eefocus

添加一个矩阵键盘,STM32 检测到不同按键按下,实现不同功能:

键 1-7 按下,依次点亮红、绿、蓝、黄、青、紫、白

键 8-14 按下,依次熄灭红、绿、蓝、黄、青、紫、白

键 15 按下,蜂鸣器响 ; 键 16 按下,蜂鸣器不响


如有好的优化建议,还请不吝赐教


直接上代码

keypad.h


#include "sys.h"


#ifndef _KeyPad_H

#define _KeyPad_H


void KeyInit(void);

//判断是否有键按下u8 

u8 KeyDown(void);

//矩阵按键扫描,返回一个键值

u8 KeyCheck(void);

//功能实现

void KeySwitch(void);


#endif`



keypad.c


#include "keypad.h"

#include "stm32f10x.h"

#include "delay.h"

#include "RGBLED.h"

#include "BEEP.h"

 

void KeyInit(void)//按键初始化

{

GPIO_InitTypeDef GPIO_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;   

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; 

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

}


u8 KeyDown(void)

{

if((GPIO_ReadInputData(GPIOA) & 0xf0) != 0x0)//判断是否有键按下

return 1;//keydown

}

else return 0; 

}


u8 KeyCheck(void)

{

if(KeyDown())

{

delay_ms(10);//消抖10ms


if(KeyDown())

{

u8 KeyValue = 0;

GPIO_SetBits(GPIOA,GPIO_Pin_0);

GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

if (KeyDown())

{

switch(GPIO_ReadInputData(GPIOA) & 0xf0)

{

case (0x10): KeyValue = 1; break;

case (0x20): KeyValue = 4; break;

case (0x40): KeyValue = 7; break;

case (0x80): KeyValue = '*'; break;

}

}

GPIO_SetBits(GPIOA,GPIO_Pin_1);

GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);

if (KeyDown())

{

switch(GPIO_ReadInputData(GPIOA) & 0xf0)

{

case (0x10): KeyValue = 2; break;

case (0x20): KeyValue = 5; break;

case (0x40): KeyValue = 8; break;

case (0x80): KeyValue = 0; break;

}

}

GPIO_SetBits(GPIOA,GPIO_Pin_2);

GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);

if (KeyDown())

{

switch(GPIO_ReadInputData(GPIOA) & 0xf0)

{

case (0x10): KeyValue = 3; break;

case (0x20): KeyValue = 6; break;

case (0x40): KeyValue = 9; break;

case (0x80): KeyValue = '#'; break;

}

}

GPIO_SetBits(GPIOA,GPIO_Pin_3);

GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_0);

if (KeyDown())

{

switch(GPIO_ReadInputData(GPIOA) & 0xf0)

{

case (0x10): KeyValue = 'A'; break;

case (0x20): KeyValue = 'B';   break;

case (0x40): KeyValue = 'C'; break;

case (0x80): KeyValue = 'D'; break;

}

return KeyValue;

}

return 20;   //这里不能返回0,0已经作为按键的返回值

}


void KeySwitch(void)

{

switch(KeyPad_Check())

{

case 1:RGBLED_Display( RED, 1);break;

case 2:RGBLED_Display( GREEN, 1);break;

case 3:RGBLED_Display( BLUE, 1);break;

case 4:RGBLED_Display( YELLOW, 1);break;

case 5:RGBLED_Display( NAVY, 1);break;

case 6:RGBLED_Display( PURPLE, 1);break;

case 7:RGBLED_Display( WHITE, 1);break;

case 8:RGBLED_Display( RED, 0);break;

case 9:RGBLED_Display( GREEN, 0);break;

case '*':RGBLED_Display( BLUE, 0);break;

case 0:  RGBLED_Display( YELLOW, 0);break;

case '#':RGBLED_Display( NAVY, 0);break;

case 'A':RGBLED_Display( PURPLE, 0);break;

case 'B':RGBLED_Display( WHITE, 0);break;

case 'C': BEEP = 0;break;

case 'D': BEEP = 1;break;

}

}


推荐阅读

史海拾趣

ECI公司的发展小趣事

ECI公司深知人才是企业发展的关键因素。因此,公司高度重视人才的引进、培养和激励。公司建立了完善的人才选拔机制,选拔具有潜力和才华的员工进行重点培养。同时,公司还提供了丰富的培训和发展机会,帮助员工提升自身素质和能力。此外,ECI还建立了科学合理的薪酬制度和激励机制,让员工在为公司创造价值的同时也能获得相应的回报。这种对人才的重视和投入让ECI公司汇聚了一批优秀的员工队伍,为公司的发展提供了有力的保障。

Anvo-Systems公司的发展小趣事

Anvo-Systems深知人才是企业发展的核心动力。因此,公司一直注重与高校和研究机构的合作,共同开展电子技术的研发与创新。通过与高校合作开展科研项目、设立奖学金等方式,Anvo-Systems吸引了大批优秀的人才加入公司。同时,公司还建立了完善的培训体系,为员工的职业发展提供了有力支持。这些举措不仅提升了公司的研发实力,也为公司的未来发展储备了丰富的人才资源。

Everbuild公司的发展小趣事

Everbuild公司成立于2005年,创始人李明是一位对电子技术充满热情的年轻人。在创业初期,公司只有几个员工和一间狭小的办公室。李明带领团队日夜兼程地研发电子元器件,但由于资金短缺和市场竞争激烈,产品销量并不理想。然而,他们并没有放弃,通过不断的技术创新和成本控制,终于在一年后推出了一款具有竞争力的电源管理芯片,赢得了市场的认可。

Analog Microwave Design公司的发展小趣事

随着市场的不断变化和客户需求的多样化,Analog Microwave Design公司意识到单一的产品线已经无法满足市场需求。为了丰富和完善产品线,公司开始加大对新产品的研发力度。除了继续深耕微波器件领域外,公司还积极拓展相关领域的产品线,如射频模块、天线等。通过不断推出新产品,公司不仅满足了客户的多样化需求,还进一步巩固了市场地位。

Advanced Semiconductor, Inc.公司的发展小趣事

Advanced Semiconductor, Inc. (简称ASI) 成立于XXXX年,由一群热衷于半导体技术创新的工程师和科学家创立。在创立初期,ASI专注于研发高性能的半导体芯片,以满足当时市场对更快、更稳定电子产品的需求。公司凭借其独特的技术和创新的理念,很快在半导体行业中崭露头角,吸引了众多投资者的关注。

Galaxy Semi-Conductor Co Ltd公司的发展小趣事

山西飞虹光电科技集团有限公司原以煤炭、洗煤和焦化等生产为主,但在响应山西省委、省政府转型跨越发展的号召下,公司于2010年向高科技产业基地转型。在临汾·甘亭新型工业园区投资16.5亿元建设了“山西陆合飞虹光电科技园”,专注于研发和生产化合物半导体外延片、芯片以及大功率半导体激光器等高科技产品。飞虹光电科技集团通过技术创新,在大功率激光外延片、芯片及LED红、蓝、紫光材料等方面填补了山西省的多项空白,并荣获多项国内外专利及科技奖项。

问答坊 | AI 解惑

求助 关于反应速度测试仪的设计 (MCS-51单片机)

希望高手们帮帮忙先谢谢了!要求如下: 1  能够完成一个人反应速度的测试工作,并将结果显示在LED数字显示屏上。 2  程序开始时亮黄灯进入准备状态,被测试者按一次按钮则黄灯灭,开始进行测试。 3  每一个测试完成 ...…

查看全部问答>

发现同一个贴子里多个附件下载的问题

最近在论坛里发现很多帖子的资源包含多个附件,而这些附件都是一个文件分成多个的,下载时会连续扣调芯币,这样的话论坛中大部分人几乎无法负担。 这种情况,建议论坛能不能改一下,在一个帖子里的附件下载只扣一次芯币,其他附件就不用扣了。…

查看全部问答>

大赛B题 声源自制

本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 我原来写过几个简单的小程序 有双音多频 单音多频的 大家可以下载看看 这几个程序使用的是PIC16F54 都是可以直接使用的 大家只要将HEX文件烧录就可以用了  …

查看全部问答>

关于步进电机控制

各位高手:这是两相电机,怎么接线呢?   我接的线不知道是不是不对,还是程序有问题,在软件防真时可以,但是下载到板上时电机就老是抖动,没按照我设计的转一圈转。   我是:2跟5并接12V,然后P0.0接3  P0.1接1  P0.2接4 ...…

查看全部问答>

ISE文件类型说明

在使用ISE进行设计的过程中,会在你的工程目录中生成好多类型的文件,这些文件是什么文件呢?通过自己和网上朋友的经验对ISE的文件类型做一下小小总结: ISE文件类型说明 *.bit  下载配置文件。*.bld  报告文件。*.edn  网表文 ...…

查看全部问答>

请问哪里有无线协议的详细文档下载?

刚学GPRS开发,想找些无线通讯协议看看,google了一下,没找到,所以想请教一下,哪里有这一类的完整文档下载,谢谢!…

查看全部问答>

电感

电感电感在电路中常用“L”加数字表示,如:L6表示编号为6的电感。电感线圈是将绝缘的导线在绝缘的骨架上绕一定的圈数制成。直流可通过线圈,直流电阻就是导线本身的电阻,压降很小;当交流信号通过线圈时,线圈两端将会产生自感电动势,自感电动势 ...…

查看全部问答>

5天学会Protel99SE图文教程下载

虽然这个是老古董了,因为看到,还有朋友再使用和学习protel 99,这份资料不错,相信能给初学者带来帮助。 …

查看全部问答>

《单片机与计算机串口通信实践》

串口通信的第一种实现方案:半双工通信方式;这适用于:下位机需要等待上位机的回复之后,方可继续发送下一个数据包的应用场合。在大多数的串口书籍中,串口通信的具体实现均是采用的该方案;但功能太简化、代码不细致。在本书中,全面考虑了菜单 ...…

查看全部问答>

关于nokia5110显示屏的参数设定

本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 刚刚做了下实验,看看调整供电电压对nokia5110液晶显示屏的影响 这个显示屏由于比较便宜,又是点阵的,所以用的比较多,我虽然老早就用了,但是一直有点疑问放在心上,就是其参数设定问题 1 ...…

查看全部问答>