不能对不起匠人加的精华,所以,现在把矩阵键盘的“线性反转法”驱动也贴上来——以验证可用:lol
只贴有改动的地方,其他地方和原来的程序一模一样,就不贴了:
第一个改动的地方:引脚读写宏定义
/*不同于逐行扫描法,线性反转法中连接键盘的引脚没有固定的输入
与输出,只有行线和列线之别,二者都时而作为输入时而作为输出。
本键盘中: KEY0_3 为P20-P23,接键盘行线
KEY4_7 为P24-P27,接键盘列线
* 注意:矩阵键盘的输入是MCU的输出,矩阵键盘的输出是MCU的输入*/
#define KEY0_3HI() P2 |= 0x0F //矩阵键盘所有输入脚都置高
#define KEY0_3LO() P2 &= 0xF0 //矩阵键盘所有输入脚都置低
#define KEY0_3RD() ((P2 >> 0)&0x0F)//读取矩阵键盘输出脚的状态
#define KEY4_7HI() P2 |= 0xF0 //矩阵键盘所有输入脚都置高
#define KEY4_7LO() P2 &= 0x0F //矩阵键盘所有输入脚都置低
#define KEY4_7RD() ((P2 >> 4)&0x0F)//读取矩阵键盘输出脚的状态
第二个改动的地方:键盘状态值读取函数
byte OnceKey(void)
{
ui08 i = 0;
ui08 j = 0;
byte key = NO_KEY;
KEY4_7LO();
KEY0_3HI(); //作为输入之前必须先置高
i=KEY0_3RD();
if(i == 0x0F)
{
key = NO_KEY;
}
else
{
KEY0_3LO();
KEY4_7HI(); //作为输入之前必须先置高
j=KEY4_7RD();
if(j == 0x0F)
{
key = NO_KEY;
}
else
{
//本宏实现的作用:由于低电平的引脚表示有按键,高电平的引脚表示无按键,于是有合法按键时读到的数据会是:~1、~2、~4、~8,本宏将读到
//的引脚值转换为按下按键对应的引脚编号0、1、2、3
#define CVT(i) ((i == ((~1) & 0x0F)) ? 0 : ((i == ((~2) & 0x0F)) ? 1 : ((i == ((~4) & 0x0F)) ? 2 : ((i == ((~8) & 0x0F)) ? 3 : 4))))
key = CVT(i)*4+CVT(j);
if(key > 0x0F) //多个键被同时按下,认为是误操作,忽略按键动作
{
key = NO_KEY;
}
}
}
KEY0_3HI();
KEY4_7HI();
return key;
} |