目录
一、原理图
学过51的都知道,矩阵按键的实现需要进行行或列扫描 ,我们这里以扫描行为例进行矩阵键盘的实现
按键按下的判断:IO口的电平为低电平,即为按下
二、独立按键
开始之前,要先把跳冒接上BIN独立模式 即接上3和2
u8 key4_scan()
{
u8 sign = 0x08;//类似于标志位一样,用来判断哪一行的按键按下
u8 i =0;
u8 temp = 0;//用来存储IO口的值
P3 = P3|0x0f;//先把P3口的低四位全部置1,用于读取哪个按键按下了,而高四位不变
temp = P3&0xff;//把P3的低四位取出来,而高四位不变
for(i=0;i<4;i++)
{
if(~temp == (sign >> i))//sign为0000 1000 逐渐右移一位,直到与取反后的temp一致后就输出
//此时的按键值
return i+4;//按键是从s4开始的
}
return 0;
}
假如是s4按下了,则temp取反后是->0000 1000 当i=0时,二者相等,然后返回值为0+4=4
三、矩阵按键
开始之前,要先把跳冒接上即接上1和2
u8 key16_scan()
{
u16 sign = 0x8000;
u8 i = 0;
u16 temp = 0;
P44 = 0;P42 = 1;P35 = 1;P34 = 1;//第一列
temp = temp | (P3&0x0f);//取出P3口的低四位赋给temp
P44 = 1;P42 = 0;P35 = 1;P34 = 1;//第二列
temp = (temp<<4) | (P3&0x0f);//避免第一行的扫描的值被覆盖,我们就先把temp左移4位,在取出这次
//的P3口的低四位赋给temp
P44 = 1;P42 = 1;P35 = 0;P34 = 1;//第三列
temp = (temp<<4) | (P3&0x0f);//以此类推
P44 = 1;P42 = 1;P35 = 1;P34 = 0;//第四列
temp = (temp<<4) | (P3&0x0f);//以此类推
for(i=0;i<16;i++)
{
if(~temp == (sign>>i))
return i+4;
}
return 0;
}
例如s19按下,则第一列经过行扫描后的temp=1111
第二列经过行扫描后的temp=1111 1111
第三列经过行扫描后的temp=1111 1111 1111
第四列经过行扫描后的temp=1111 1111 1111 1110
取反后为0000 0000 0000 0001 当i=15时,二者相等,返回值为19
四、按键的使用
void key_proc()
{
static u8 old;
u8 temp,up,down;
if(key_f == 0)return;
key_f = 0;
temp = key16_scan();
up = ~temp & (temp ^ old);//上升沿
down = temp & (temp ^ old);//下降沿
old = temp;
/*
在这里进行具体使用的编写即可
*/
}
void TIME_ISR() interrupt 1
{
cnt++;
if(cnt % 20 ==0)key_f = 1;
cnt %= 1000;
}
void main()
{
ALL_INIT();
Timer0Init();
while(1)
{
key_proc();
}
}
上面的代码通过巧妙的方式来取代了传统的按键键值判断的方式,很简单,可以直接使用