由于代码错误,导致阵列键盘有些问题,甚至第二列不起作用,因此代码修改如下
在阵列键盘原理与驱动一节键盘处理函数有点问题,需要如下更改
u8 KEYPAD4x4_Read (void){//键盘处理函数
u8 a=0,b=0;//定义变量
KEYPAD4x4_Init();//初始化IO
GPIO_ResetBits(KEYPAD4x4PORT,KEY1|KEY2|KEY3|KEY4);
GPIO_SetBits(KEYPAD4x4PORT,KEYa|KEYb|KEYc|KEYd);
if(!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEYa) || //查寻键盘口的值是否变化
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEYb) ||
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEYc) ||
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEYd)){
delay_ms (20);//延时20毫秒
if(!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEYa) || //查寻键盘口的值是否变化
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEYb) ||
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEYc) ||
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEYd)){
a = GPIO_ReadInputData(KEYPAD4x4PORT)&0xff;//键值放入寄存器a
}
}
KEYPAD4x4_Init2();//IO工作方式反转
GPIO_SetBits(KEYPAD4x4PORT,KEY1|KEY2|KEY3|KEY4);
GPIO_ResetBits(KEYPAD4x4PORT,KEYa|KEYb|KEYc|KEYd);
if(!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY1) || //查寻键盘口的值是否变化
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY2) ||
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY3) ||
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY4)){
delay_ms (20);//延时20毫秒
if(!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY1) || //查寻键盘口的值是否变化
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY2) ||
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY3) ||
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY4)){
b = GPIO_ReadInputData(KEYPAD4x4PORT)&0xff;//将第二次取得值放入寄存器b
}
}
a = a|b;//将两个数据相或
switch(a){//对比数据值
case 0xee: b = 0x64; break;//对比得到的键值给b一个应用数据
case 0xed: b = 0x23; break;
case 0xeb: b = 0x30; break;
case 0xe7: b = 0x2a; break;
case 0xde: b = 0x63; break;
case 0xdd: b = 0x39; break;
case 0xdb: b = 0x38; break;
case 0xd7: b = 0x37; break;
case 0xbe: b = 0x62; break;
case 0xbd: b = 0x36; break;
case 0xbb: b = 0x35; break;
case 0xb7: b = 0x34; break;
case 0x7e: b = 0x61; break;
case 0x7d: b = 0x33; break;
case 0x7b: b = 0x32; break;
case 0x77: b = 0x31; break;
default: b = 0; break;//键值错误处理
}
while(!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY1) || //等待按键放开
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY2) ||
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY3) ||
!GPIO_ReadInputDataBit(KEYPAD4x4PORT,KEY4));
delay_ms (20);//延时20毫秒
return (b);//将b作为返回值
}