本帖最后由 Neighbor_John 于 2019-5-22 00:21 编辑
我学习到的键盘扫描是逐行或逐列扫描,而这段程序确不需要这么繁琐。但是我感觉这段程序有很大的逻辑错误,因为假设按得第一个键,P1应为0xee,然而※那一段代码得出的P1为0xfe,因此这段程序不可能实现,可我用仿真软件实验后证实程序是可行的,而且这段程序也没有检测按键是否放开的部分,可仿真出来没有任何问题,求大神看看这程序究竟怎么解释。
单片机源程序如下:
- void key() //独立按键程序
- {
- static uchar key_new = 0,key_l;
- key_can = 20; //按键值还原
- P1 = 0x0f;
- if((P1 & 0x0f) != 0x0f)
- {
- delay_1ms(1); //按键消抖动
- if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
- { //确认是按键按下
- key_new = 0;
- key_l= (P1 | 0xf0);
- ※ P1 = key_l ;
- switch(P1)
- {
- case 0xee: key_can = 1; break; //得到按键值
- case 0xde: key_can = 4; break; //得到按键值
- case 0xbe: key_can = 7; break; //得到按键值
- case 0x7e: key_can = 10; break; //得到按键值
- case 0xed: key_can = 2; break; //得到按键值
- case 0xdd: key_can = 5; break; //得到按键值
- case 0xbd: key_can = 8; break; //得到按键值
- case 0x7d: key_can = 0; break; //得到按键值
- case 0xeb: key_can = 3; break; //得到按键值
- case 0xdb: key_can = 6; break; //得到按键值
- case 0xbb: key_can = 9; break; //得到按键值
- case 0x7b: key_can = 11; break; //得到按键值
-
- case 0xe7: key_can = 15; break; //得到按键值
- case 0xd7: key_can = 14; break; //得到按键值
- case 0xb7: key_can = 13; break; //得到按键值
- case 0x77: key_can = 12; break; //得到按键值
- }
- beep = 0;
- delay_1ms(20);
- beep = 1;
- }
- }
- else
- {
- key_new = 1;
- }
-
- }
复制代码
|