OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8309|回复: 7

STM32_4*4矩阵按键的实现

[复制链接]

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2016-9-26 17:37:29 | 显示全部楼层 |阅读模式
首先要说明的一点,矩阵键盘的动态扫描确实略显复杂,不可能就是读一个端口数据,然后马上就出来结果。这需要对依次每一行的按键进行扫描、判断,然后得出结果。如上图所示,先扫描第一行,也就是S1,S2,S3,S4四个按键的状态。在PA口输入0XFE。
    0XFE变成二进制是1111 1110,为了方便使用,记得每四个数之间加一个空格。1111 1110这个数据放到PA口上,假设这个时候S1被按下了,会出现什么情况?因为PA0是低电平,S1被按下之后S1导通,导致PA4的电平从1降到0,于是PA端口的数据就变成了1110 1110,换算成16进制就是0XEE。于是我们知道S1被按下了。
    假设是S3被按下,会出现什么情况?没错,PA6的电平被拉低,PA的端口数据变成了1011 1110,也就是0XBE。这样,我们就知道了,每一行的每一个按键被按下的时候,都会有一个对应的独一无二的值。这就是矩阵键盘的扫描原理!
具体的IO口定义,详见源码中的IO定义。

实现的功能:在STM32上实现类似于51单片机上IO的双向输入输出;
程序源码见附件:


主程序调用功能实现:
extern uchar k_num;        //按键值         
while(k_c==0){
                 KEY_Scan();
                 if(k_num==6){//enter                                                       
                           k_c=2;
                  }else if(k_num==7){//cancel
                             k_c=1;  
                  }else if(k_num==8){//up
                           temp=temp+1;
                           delay_ms(100);
                  }else if(k_num==9){//down
                             if(temp>0){
                                    temp=temp-1;
                           }                          
                           delay_ms(100);
                  }else if(k_num==10){//left
                                  if(temp>100){
                                   temp=temp-5;
                                }
                               
                                delay_ms(100);
                  }else if(k_num==11){//right
                                temp=temp+5;
                                delay_ms(100);                        
                  }else{
                          if((temp>500)||(temp<150)){
                                temp=214;
                        }
                  }
                    ge=temp%10;
                  shi=temp%100/10;
                  bai=temp/100;
                  delay_ms(10);
                  disp_8x16(4,3,1,0,bai);       
                    disp_8x16(5,3,1,0,shi);
                  disp_8x16(6,3,1,0,ge);                            
                  k_num=0;//按键值清零
                  delay_ms(10);
}

希望对大家有所帮助,共同进步@正点原子 !!!

QQ截图20160926172435.jpg

KEY.rar

1.5 KB, 下载次数: 851

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

465

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2154
金钱
2154
注册时间
2013-1-11
在线时间
509 小时
发表于 2016-9-28 22:04:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-7-29
在线时间
3 小时
发表于 2019-11-5 16:40:51 | 显示全部楼层
11111111
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2018-3-22
在线时间
19 小时
发表于 2019-11-26 12:19:54 | 显示全部楼层
好棒棒,谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2019-11-26
在线时间
3 小时
发表于 2019-11-26 12:45:45 | 显示全部楼层
这个要赞一个哦
回复 支持 反对

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2019-5-12
在线时间
19 小时
发表于 2021-1-9 14:18:59 | 显示全部楼层
参考一下,谢谢分享!
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2019-3-15
在线时间
30 小时
发表于 2021-1-18 09:42:07 | 显示全部楼层
好棒棒,谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2022-5-27
在线时间
1 小时
发表于 2022-5-27 19:28:53 | 显示全部楼层
爱了,感谢分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 02:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表