4*4键盘程序代码 基于STM32

2019-10-09来源: eefocus关键字:4*4键盘  程序代码  STM32

这是自己写的扫描第一行按键的程序代码。


PE的位8~位11设置为下拉输入。


PE的位12~位15设置为推挽输出


其中PE的位11是4*4键盘的第一列,PE的为键盘的第一行。


先将第一行设置为高电平,检测列中是否有高电平


u8 KEY_Scan(u8 mode)


{       


         staticu8 key_up=1;//按键按松开标志


         if(mode)key_up=1;  //支持连按


         GPIO_SetBits(GPIOE,GPIO_Pin_15);                 


         if(key_up&&( (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8)) 


                                     ||(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_9))


                                     ||(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_10))


                                     ||(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_11)) ) )


         {


                   delay_ms(10);//去抖动


                   key_up=0;


                   if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8) )return 10;


                   elseif( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9) )return 3;


                   elseif( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_10) )return 2;


                   elseif( GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_11) )return 1;


         }elseif( (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8))==0


                            &&(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_9))==0


                            &&(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_10))==0


                            &&(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_11))==0 )key_up=1;       


        return 0;// 无按键按下


}



写好扫描一行后,对比网上别人写的代码,发现写的十分冗长,原因:调用了库函数的位操作函数对4位进行操作。而不是进行整理处理。然后改写如下:



GPIO_Write(GPIOE,0x8000);            


         if((key_up) && (GPIOE->IDR & 0x0f00) )


         {


                   delay_ms(10);//去抖动


                   key_up=0;


                   switch(GPIOE->IDR & 0x0f00 )


                   {


                            case 0x0100: KeyVal=10; break;  


                            case 0x0200: KeyVal=3; break;  


                            case 0x0400: KeyVal=2; break;  


                            case 0x0800: KeyVal=1; break;


                   }


         }


         elseif ( ( GPIOE->IDR & 0x0f00) ) ;key_up=1; //若松开按键,则将key_up置一。



改写成功后,自己就以为4*4键盘只要将代码复制,改动一下GPIO_Write(GPIOE, 0x8000);中的数值。

结果发现只有最后一行的按键不支持连按。其他的若一直按着,就会一直刷新按键值(自己在串口中观察,相关代码未贴出来)。不符合自己设计的要求,即按键不支持连按。


于是进入Debug模式。逐行调试,观察GPIOE的输入数据寄存器(GPIOx_IDR),由于是if语句判断,当没松开后就程序就会运行扫描第二行的代码时,写GPIO_Write(GPIOE,0x4000)时候,(GPIOx_IDR)   的值就改变了,因此后面的if语句就会将key_up就会被置一,而非等到自己按键松开了。长按自然会反复刷新按键值。


只要将if语句改为while语句即可。即按键送下来之前不进行后面的扫描!


这个问题很简单,自己在写的时候都没有发现。不过最终还是调试出来了。


自己写程序会犯各种低级错误,比如自己甚至连 & 和 &&都未区分开来,后面自己在编译器写了一段测试代码才区分开来。


这会让在上面浪费很多时间。上面说的小问题,就耗费了自己数个小时,因为自己之前都是在脑袋中想象代码的的执行流程。。。


但是我还是要坚持这种学习方法,问题虽然会很多,但也正是如此才能发现自己的缺陷,自己去思考,去写了代码,对知识的理解也会更深。


关键字:4*4键盘  程序代码  STM32 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic476492.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32中ADC初始化程序
下一篇:为物联网应用开发提速 STM32MP1 MPU贸泽开售

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Atmega128a的4位独立键盘控制程序
;             键盘扫描子程序,采用逐键扫描的方式//**********************************************************************uchar keyboardscan(void) {  uchar key_check;  uchar key_checkin;  key_checkin=KEYRead;                       
发表于 2019-10-15
STM32学习——矩阵键盘
在之前的学习中就学过了IO口的操作,矩阵键盘就是对IO口的操作,还有一个就是扫描模式。方法一:逐行扫描:通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。方法二:行列扫描:通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。在这里用到了中断的方法,行输出高电平,列做模拟输入口。当有按键按下所对应
发表于 2019-09-27
STM32学习——矩阵键盘
CT107D蓝桥杯独立键盘运用(5)
今天我给大家讲一下键盘的运用,我们先看电路图上面的引脚下面我们先看看独立键盘怎么样用吧独立键盘是S4 S5 S6 S7          J5口要接到BTN好了,我们直接看代码//独立键盘 sbit S7  = P3^0;sbit S6  = P3^1;sbit S5  = P3^2;sbit S4  = P3^3; //独立键盘检查 unsigned char dkey_scan() {  if(S7==0)return 7;if(S6==0)return 6;if(S5
发表于 2019-09-26
CT107D蓝桥杯独立键盘运用(5)
CT107D蓝桥杯矩阵键盘使用
这里单独讲一下矩阵键盘,这里没有加消抖,可以看看前面的独立键盘加上消抖。 sfr P4=0xC0;//4行sbit r1=P3^0;sbit r2=P3^1;sbit r3=P3^2;sbit r4=P3^3;//4列sbit c1=P4^4;sbit c2=P4^2;sbit c3=P3^5;sbit c4=P3^4; //矩阵键盘检查unsigned char key_scan(){  unsigned char key_value;r1=0;r2=r3=r4=1;c1=c2=c3=c4=1;if(!c1)key_value=0;else if(!c2)key_value=1;else if
发表于 2019-09-26
STM32 >> 矩阵键盘(代码风格优美,简明易懂)
本文有关矩阵键盘的使用原理适用于所有微机控制器,同时也适用于所有规格的矩阵键盘。key.h/**  ******************************************************************************  * @file    bsp_key.h  * @author  Waao  * @version V1.0.0  * @date    23-Jan-2019  * @brief   This file contains some board
发表于 2019-08-29
lpc2148基于DS18B20的温度控制系统程序代码之dat=(j1)详解
(dat);26}任意取一个字节,本文以1011 1010为例首先由读位程序读取第7位1,执行22得j=1,执行23得dat=1xxx xxxx,  详解如下:j<<7得到1xxx xxxx dat>>1得到0xxx xxxx(注意:dat初始值为0,即代码19)然后执行|(位或)运算,得到dat=1xxx xxxx然后由读位程序读取第6位0,执行22得j=0,执行23得dat=01xx xxxx  详解如下:j<<7得到0xxx xxxxdat>>1得到01xx xxxx(此时,dat的值不再是0,而是上一步得到的1xxx xxxx)然后执行|(位或)运算
发表于 2019-05-20
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved