上图为15单片机矩阵按键原理图;
独立按键按键必须使得J5中2和3两个短接;那么如何判断按键按下的的值呢?
原理:
独立按键:
使得J5中2与3短接则可以观察原理图
可以根据红色标记发现2与3短接后只能使用S7,S6,S5,S4四个独立按键且这四个独立按键的一个端脚是接地的则一定为低电平“0”。那么我们就只能通过P30,P31,P32,P33四个引脚的高低电平。那么什么是引脚初始化,我们先得让这四个引脚全部赋予高电平“1”,当按下按键的一瞬间这四个中的某个引脚将会通地,从而获得低电平“0”,则我们就可以通过这四个引脚的哪个引脚变为低电平从而判断按键值。
void Delay25ms() //@12.000MHz //15单片机延迟函数(功能按键消抖)
{
unsigned char i, j;
i = 49;
j = 160;
do
{
while (--j);
} while (--i);
}
void anjian_init()//按键初始化
{
P3=0xFF//可以直接使得P30=1,P31=1,P32=1,P33=1,此时应当确保其他P3口不会受影响
}
unsigned char KeyNumber()//按键判断
{
unsigned char K;
anjian_init();
if(P30==0){Delay25ms();while(P30==0);Delay25ms();K=7;}
if(P31==0){Delay25ms();while(P31==0);Delay25ms();K=6;}
if(P32==0){Delay25ms();while(P32==0);Delay25ms();K=5;}
if(P33==0){Delay25ms();while(P33==0);Delay25ms();K=4;}
return K;
}
void main()
{
unsigned char K;
while(1)
{
K=keyNumber();//不断检测按键值
}
}
if(P30==0){Delay25ms();while(P30==0);Delay25ms();K=7;}判断当P30为0时,开始消抖,当松下按下的手时消抖后给K赋值从而判断为按键7被按下;
消抖:
理想状态下按键时序图为:
你得知道现实一般非常残酷,看看现实吧:
如果不用消抖延迟会出现按键识别出误电压不稳定;消抖函数一般比10ms大就行不过一般不要太大30ms以内为好;
矩阵按键:
矩阵按键就必须使得J5中2和1两个短接;
根据独立按键的规则我们一般使得按键一端为0然后通过另一端检测;这一次我们将下面红色标记内得引脚逐个赋值为“0”(低电平);后使用下面的检测按键值。
代码如下:
void Delay25ms() //@12.000MHz //15单片机延迟函数(功能按键消抖)
{
unsigned char i, j;
i = 49;
j = 160;
do
{
while (--j);
} while (--i);
}
void anjian_init() //按键初始化
{
P3=0x3F; //0011 1111
P42==1;
P44==1;
}
unsigned char KeyNumber()//按键判断
{
unsigned char K;
anjian_init();
P30=0;
if(P34==0){Delay25ms();while(P34==0);Delay25ms();K=19;}
if(P35==0){Delay25ms();while(P35==0);Delay25ms();K=15;}
if(P42==0){Delay25ms();while(P42==0);Delay25ms();K=11;}
if(P44==0){Delay25ms();while(P44==0);Delay25ms();K=7;}
anjian_init();
P31=0;
if(P34==0){Delay25ms();while(P34==0);Delay25ms();K=18;}
if(P35==0){Delay25ms();while(P35==0);Delay25ms();K=14;}
if(P42==0){Delay25ms();while(P42==0);Delay25ms();K=10;}
if(P44==0){Delay25ms();while(P44==0);Delay25ms();K=6;}
anjian_init();
P32=0;
if(P34==0){Delay25ms();while(P34==0);Delay25ms();K=17;}
if(P35==0){Delay25ms();while(P35==0);Delay25ms();K=13;}
if(P42==0){Delay25ms();while(P42==0);Delay25ms();K=9;}
if(P44==0){Delay25ms();while(P44==0);Delay25ms();K=5;}
anjian_init();
P33=0;
if(P34==0){Delay25ms();while(P34==0);Delay25ms();K=16;}
if(P35==0){Delay25ms();while(P35==0);Delay25ms();K=12;}
if(P42==0){Delay25ms();while(P42==0);Delay25ms();K=8;}
if(P44==0){Delay25ms();while(P44==0);Delay25ms();K=4;}
return K;
}
void main()
{
unsigned char K;
while(1)
{
K=keyNumber();//不断检测按键值
}
}
矩阵按键逐个赋值低电平为何都要初始化?
先将按键初始化,给P30赋值为“0”若当S19按下经过消抖以及判断是否松手和再次消抖则P34立即赋值为“0”;K为19;若是接下来不进行按键初始化则P34仍然为“0”,则当P31赋值为“0”时,此时K又将赋值为18;最终赋值为16,从而造成按键判断失误;如果此时不给P30赋值为“1”则如果按下S18此时循环检测时仍然会检测为按下S19。