键盘作业原理仍是运用都是比较简略的。下面是4×4的阵列键盘,行别离接P3.0-P3.3,列接P3.4-P3.7,没有接电源。
选用查询法判别那一个按键被按下。例如,令P3=0xFE,然后在将P3跟0xFE比较,假如持平,阐明S6-S9没有被按下,否则在判别P3高四位哪一位等于0。例如P3.4=0 则阐明S6被按下。
留意: 手艺按下键盘到开释这个进程大约50ms左右,在按下开端到弹簧片安稳触摸这段时刻为5-10ms,从开释到弹簧片彻底分隔也是5-10ms,在抵达安稳触摸和彻底分隔的微观进程中,电平是时高时低的,由于单片机的速度相对比较快,所以人感觉到只按下一次,单片机却检测到按下屡次。假如在单片机初次检测到键盘按下时延时10ms左右再去检测,就不会检测到颤动的毛刺电平了。这便是消抖的原理
理解原理了,写程序天然也简略了。接下来只要在每一个程序履行周期里边查询它就行了,暂时省掉防抖代码。
#include
#include
void delay(unsigned int times);
unsigned int scankeys();
void main()
{
while(1)
{
scankeys();
delay(100);
}
}
void delay(unsigned int times)
{
unsigned int i,j;
for (i=0; i
for (j=0; j<100; j++)
_nop_();
}
unsigned int scankeys()
{
unsigned char temp;
P3=0xFE;
temp=P3;
if(temp!=0xFE)
{
if(temp==0x7E)
P1 = 3 ;
else if(temp==0xBE)
P1 = 2 ;
else if(temp==0xDE)
P1 = 1 ;
else if(temp==0xEE)
P1 = 0 ;
}
else
{
P3=0xFD;
temp=P3;
if(temp!=0xFD)
{
if(temp==0x7D)
P1 = 7 ;
else if(temp==0xBD)
P1 = 6 ;
else if(temp==0xDD)
P1 = 5 ;
else if(temp==0xED)
P1 = 4 ;
}
else
{
P3=0xFB;
temp=P3;
if(temp!=0xFB)
{
if(temp==0x7B)
P1 = 11 ;
else if(temp==0xBB)
P1 = 10 ;
else if(temp==0xDB)
P1 = 9 ;
else if(temp==0xEB)
P1 = 8 ;
}
else
{
P3=0xF7;
temp=P3;
if(temp!=0xF7)
{
if(temp==0x77)
P1 = 15 ;
else if(temp==0xB7)
P1 = 14 ;
else if(temp==0xD7)
P1 = 13 ;
else if(temp==0xE7)
P1 = 12 ;
}
}
}
}
return 0;
}