完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
就是矩阵键盘设置后,比如要输入4567,结果输入4,就变成4444,输入5就变成5555这样的情况,求解答???问老师说可能按键释放没做好,不知道要怎么改,求解!!!!!!!!!!以下是按键检测的编码。还要加什么么?
uchar KeyScan(void) { char a = 0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { Delay10ms(1);//延时10ms进行消抖 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下 { //测试列 GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=4;break; case(0X0d): KeyValue=8;break; case(0X0e): KeyValue=12;break; } //测试行 GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue+3;break; case(0Xb0): KeyValue=KeyValue+2;break; case(0Xd0): KeyValue=KeyValue+1;break; case(0Xe0): KeyValue=KeyValue;break; } while((a<50) && (GPIO_KEY!=0xf0)) //检测按键松手检测 { Delay10ms(1); a++; } } } return KeyValue; } |
|
相关推荐
14个回答
|
|
while((a<50) && (GPIO_KEY!=0xf0)) //检测按键松手检测
{ Delay10ms(1); a++; } 去掉(a<50)的判断,去掉 Delay10ms(1);试试, 如果可行的话,可以正常判断按键释放,但是如果按键一直按着不放的话,会在这里死循环 |
|
|
|
还是不可以,是不是我测试程序不对,我是打算先按按键3,然后在按键选择值。我想的是按了3后,再按1,就可以显示1,但是显示屏没有变化一直是0 KeyScan(); if(KeyValue==3){ KeyScan(); switch(KeyValue) { case 1:a[1]=1;break; case 2:a[2]=2;break; } } LcdWriteCom(0x8A); LcdWriteData('0'+a[1]); Delay10ms(2); LcdWriteCom(0x8B); LcdWriteData('0'+a[2]); |
|
|
|
你可以不用判断KeyValue的值,而是直接把KeyValue的值显示出来,也可以判断在KeyScan(void)里KeyValue的赋值是否是否符合你的设计
|
|
|
|
char KeyScan()
{ static bit a=0; // uchar a = 0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { delay10ms();//延时10ms进行消抖 if((GPIO_KEY!=0x0f)&&(a==0))//再次检测键盘是否按下 { a=1; //测试列 GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=4;break; case(0X0d): KeyValue=8;break; case(0X0e): KeyValue=12;break; } //测试行 GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue+3;break; case(0Xb0): KeyValue=KeyValue+2;break; case(0Xd0): KeyValue=KeyValue+1;break; case(0Xe0): KeyValue=KeyValue;break; } /* while((a<50) && (GPIO_KEY!=0xf0)) //检测按键松手检测 { delay10ms(); a++; }*/ } return KeyValue; } else a=0; } |
|
|
|
|
|
|
|
while((a<50) && (GPIO_KEY!=0xf0)) //检测按键松手检测
{ Delay10ms(1); a++; } 改为 while(GPIO_KEY!=0xf0) //检测按键松手检测 另外需要判断现在是按键释放判断不对,还是按键的键值也不对,如果键值也不对,可以先不给按键赋值,先显示按键的扫描码,也就是按键在做电路扫描时得到的值,正确了,再给按键赋方便程序编写的值 |
|
|
|
这改过的程序已经在TX-1C实验板用验证返回值是正确的,矩阵键盘P3,LED P1。不同实验板要重新定义 #include #define uchar unsigned char #define uint unsigned int #define GPIO_KEY P3 uchar KeyValue; void delay10ms() { uchar a,b; for(a=100;a>0;a--) for(b=225;b>0;b--); } char KeyScan() { static bit a=0;//按键有效自锁标志,防止长按重复响应并做按键抬起识别 // uchar a = 0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { delay10ms();//延时10ms进行消抖 if((GPIO_KEY!=0x0f)&&(a==0))//再次检测键盘是否按下以及自锁标志为0 { a=1; //按键有效自锁标志置1 //测试列 GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=4;break; case(0X0d): KeyValue=8;break; case(0X0e): KeyValue=12;break; } //测试行 GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue+3;break; case(0Xb0): KeyValue=KeyValue+2;break; case(0Xd0): KeyValue=KeyValue+1;break; case(0Xe0): KeyValue=KeyValue;break; } /*while((a<50) && (GPIO_KEY!=0xf0)) //检测按键松手检测 { delay10ms(); a++; }*/ } return KeyValue; } else a=0; //按键抬起自锁标志清0 } void main() { while(1) { P1=~KeyScan(); //LED显示0000 0000~0000 1111 } //取反是因为实验板LED低电平亮 } |
|
|
|
|
|
|
|
代码很多的哦??
|
|
|
|
排版有点非常的乱
|
|
|
|
还算是不错的代码了,
|
|
|
|
如果有满意的答案,请给答题者选为最佳答案,也是对回答者的尊重,谢谢
|
|
|
|
再检测行与列时,为什么不用for语句?????
|
|
|
|
看你的问题好像就没有键盘的关系,你是显示的问题,你想连续输入数字串,那么你就要每次输入都要记录储存,显示的时候哪一位显示第几次输入的,或者是循环输入的,你这样好像是直接显示了,那肯定是你按下几就直接全显示几了,建议你贴出整个代码,
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 20:42 , Processed in 2.294204 second(s), Total 68, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号