/*按鍵驅動,根據掃描按鍵的狀態,確定哪個按鍵執行動作*/
- void KeyDriver()
- {
- unsigned char i,j;
- static unsigned char xdata backup[5][4] = { //按鍵值備份,保存前一次的值
- {1,1,1,1},{1,1,1,1},
- {1,1,1,1},{1,1,1,1},
- {1,1,1,1}
- };
-
- for(i = 0;i < 5;i++) //循環檢測4*4矩陣鍵盤
- {
- for(j = 0;j < 4;j++)
- {
- if(backup[i][j] != KeySta[i][j])
- {
- if(backup[i][j] != 0) //只有當按鍵是按下時才返回鍵碼值
- {
- KeyAction(KeyCodeMap[i][j]);
- }
- backup[i][j] = KeySta[i][j];
- }
- }
- }
- }
- /*按鍵掃描,增加一行鍵盤*/
- void KeyScan()
- {
- unsigned char i;
- static unsigned char keyout = 0; //矩陣按鍵掃描輸出索引
- static unsigned char xdata keybuf[5][4] = { //鍵盤狀態緩存
- {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
- {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
- {0xFF,0xFF,0xFF,0xFF}
- };
-
- /*掃描輸入,將每行4個鍵盤的當前狀態移入緩存*/
- keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;
- keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2;
- keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3;
- keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4;
- /*根據每個鍵盤緩存區中的低四位,判斷鍵盤當前的狀態并更新按鍵的狀態*/
- for(i = 0;i < 4;i++)
- {
- if((keybuf[keyout][i] & 0x0F) == 0x00)
- {
- KeySta[keyout][i] = 0;
- }
- else if((keybuf[keyout][i] & 0x0F) == 0x0F)
- {
- KeySta[keyout][i] = 1;
- }
- }
- /*改變輸出*/
- keyout++;
- if(keyout > 4)
- keyout = 0;
-
- switch(keyout)
- {
- case 0:KEY_OUT_5 = 1;KEY_OUT_4 = 0;break;
- case 1:KEY_OUT_4 = 1;KEY_OUT_3 = 0;break;
- case 2:KEY_OUT_3 = 1;KEY_OUT_2 = 0;break;
- case 3:KEY_OUT_2 = 1;KEY_OUT_1 = 0;break;
- case 4:KEY_OUT_1 = 1;KEY_OUT_5 = 0;break;
- default:break;
- }
- }
復制代碼 |