完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
51单片机P0口接共阳数码管8个引脚,P1反接矩阵键盘8个脚
代码的功能是通过按键控制数码管显示不同数字,但我不知道松手检测这句代码应该在哪个花括号里合适, 代码如下: #include #define uint unsigned int #define uchar unsigned char #define GPIO_DIG P0 #define GPIO_KEY P1 uchar code smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar KeyValue; void MatrixKeyScan(); void delayms(uint xms); void main() { while (1) { MatrixKeyScan(); GPIO_DIG = ~smgduan[KeyValue]; } } void MatrixKeyScan() { GPIO_KEY = 0x0f; if (GPIO_KEY != 0x0f) { delayms(10); if (GPIO_KEY != 0x0f) { switch (GPIO_KEY) { case 0x07:KeyValue = 0;break; case 0x0b:KeyValue = 1;break; case 0x0d:KeyValue = 2;break; case 0x0e:KeyValue = 3;break; } GPIO_KEY = 0xf0; switch (GPIO_KEY) { case 0x70:KeyValue += 0;break; case 0xb0:KeyValue += 4;break; case 0xd0:KeyValue += 8;break; case 0xe0:KeyValue += 12;break; } while (GPIO_KEY != 0xf0); } } } void delayms(uint xms) { uint i,j; for (i = xms;i > 0;i--) for (j = 110;j > 0;j--); } 松手检测这句代码 while (GPIO_KEY != 0xf0);倘若在往下放一行,即放到下一个花括号外,即把代码从前图改成后图,就出现了这样的现象:一开始按键数码管随之正确显示,但按几次后就出现了无论如何按键数码管数字都不改变,很明显是因为程序陷入了松手检测的死循环,但我不明白为什么改变松手检测代码的位置,就会使按键按几次就进入了 while (GPIO_KEY != 0xf0)死循环? 所以想问: (1)松手检测代码位置在哪个花括号里有什么要求? (2)为何出错的那种情况 必须是按了几次按键才使代码陷入死循环?
|
|
相关推荐
7个回答
|
|
首先你把while (GPIO_KEY != 0xf0);往下放一行是不妥的
如果按键抖动,第二个 if (GPIO_KEY != 0x0f)不能进入就会直接执行 while (GPIO_KEY != 0xf0);,漏掉执行GPIO_KEY = 0xf0;的机会,那么不死才怪。
最佳答案
评分
|
||
|
||
我把他簡化如下:
正常程序: void MatrixKeyScan() { GPIO_KEY = 0x0f; if (GPIO_KEY != 0x0f) { if (GPIO_KEY != 0x0f) { GPIO_KEY = 0xf0; while (GPIO_KEY != 0xf0); } } } 出現錯誤的程序: void MatrixKeyScan() { GPIO_KEY = 0x0f; if (GPIO_KEY != 0x0f) { if (GPIO_KEY != 0x0f) //如果此時發生抖動,跳過此判斷和GPIO_KEY = 0xf0,則此時GPIO_KEY = 0x0f { GPIO_KEY = 0xf0; } while (GPIO_KEY != 0xf0);//卡死在這裡 } } 按鍵抖動 评分
|
||
|
||
本帖最后由 电人 于 2017-7-18 19:44 编辑
我把他簡化如下: 正常程序: void MatrixKeyScan() { GPIO_KEY = 0x0f; if (GPIO_KEY != 0x0f) { if (GPIO_KEY != 0x0f) { GPIO_KEY = 0xf0; while (GPIO_KEY != 0xf0); } } } 出現錯誤的程序: void MatrixKeyScan() { GPIO_KEY = 0x0f; if (GPIO_KEY != 0x0f) { if (GPIO_KEY != 0x0f) //如果此時發生抖動,跳過此判斷和GPIO_KEY = 0xf0,則此時GPIO_KEY = 0x0f { GPIO_KEY = 0xf0; } while (GPIO_KEY != 0xf0);//卡死在這裡 } } 按鍵抖動 |
|
|
|
我把他簡化如下:
正常程序: void MatrixKeyScan() { GPIO_KEY = 0x0f; if (GPIO_KEY != 0x0f) { if (GPIO_KEY != 0x0f) { GPIO_KEY = 0xf0; while (GPIO_KEY != 0xf0); } } } 出現錯誤的程序: void MatrixKeyScan() { GPIO_KEY = 0x0f; if (GPIO_KEY != 0x0f) { if (GPIO_KEY != 0x0f) //如果此時發生抖動,跳過此判斷和GPIO_KEY = 0xf0,則此時GPIO_KEY = 0x0f { GPIO_KEY = 0xf0; } while (GPIO_KEY != 0xf0);//卡死在這裡 } } 按鍵抖動 |
|
|
|
我把他簡化如下:
正常程序: void MatrixKeyScan() { GPIO_KEY = 0x0f; if (GPIO_KEY != 0x0f) { if (GPIO_KEY != 0x0f) { GPIO_KEY = 0xf0; while (GPIO_KEY != 0xf0); } } } 出現錯誤的程序: void MatrixKeyScan() { GPIO_KEY = 0x0f; if (GPIO_KEY != 0x0f) { if (GPIO_KEY != 0x0f) //如果此時發生抖動,跳過此判斷和GPIO_KEY = 0xf0,則此時GPIO_KEY = 0x0f { GPIO_KEY = 0xf0; } while (GPIO_KEY != 0xf0);//卡死在這裡 } } 按鍵抖動 |
|
|
|
|
|
|
|
wulinwl 发表于 2017-7-18 14:56 有道理,谢谢你了 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
298 浏览 1 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
309 浏览 0 评论
826 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1911 浏览 2 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1427 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 22:17 , Processed in 0.585277 second(s), Total 60, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号