从零开始学单片机(六)键盘接口
键盘工作原理还是使用都是比较简单的。下面是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;
}
编辑:admin 最后修改时间:2018-05-19