本帖最后由 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;
- }
-
- }
復制代碼
|