/*按键驱动,根据扫描按键的状态,确定哪个按键执行动作*/
- 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;
- }
- }
复制代码 |