实验一矩阵键盘检测.docx
《实验一矩阵键盘检测.docx》由会员分享,可在线阅读,更多相关《实验一矩阵键盘检测.docx(22页珍藏版)》请在冰豆网上搜索。
实验一矩阵键盘检测
实验一矩阵键盘检测
一、实验目的:
1、学习非编码键盘的工作原理和键盘的扫描式。
2、学习键盘的去抖法和键盘应用程序的设计。
二、实验设备:
51/AVR实验板、USB连接线、电脑
三、实验原理:
键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。
我们可以通过键盘输入数据或命令来实现简单的人机通信。
1、按键的分类
一般来说,按键按照构造原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。
前者造价低,后者寿命长。
目前,微机系统中最常见的是触点式开关按键〔如本学习板上所采用按键〕。
按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的法。
编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。
全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用便,硬件开销大,一般的小型嵌入式应用系统较少采用。
非编码键盘按连接式可分为独立式和矩阵式两种,其它工作都主要由软件完成。
由于其经济实用,较多地应用于单片机系统中〔本学习板也采用非编码键盘〕。
2、按键的输入原理
在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。
也就是说,它能提供标准的TTL逻辑电平,以便与通用数字系统的逻辑电平相容。
此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。
当所设置的功能键或数字键按下时,计算机应
用系统应完成该按键所设定的功能。
因此,键信息输入是与软件构造密切相关的过程。
对于一组键或一个键盘,通过接口电路与单片机相连。
单片机可以采用查询或中断式了解有无按键输入并检查是哪一个按键按下,假设有键按下则跳至相应的键盘处理程序处去执行,假设无键按下则继续执行其他程序。
3、按键的特点与去抖
机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。
其抖动过程如图1〔a〕所示,抖动时间的长短与开关的机械特性有关,一般为5-10ms。
从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判断出错。
即按键一次按下或释放被错误地认为是屡次操作,这种情况是不允出现的。
为了抑制按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两面予以考虑。
一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。
〔本学习板采用软件去抖式〕。
按键抖动状态图
硬件电容去抖
按键去抖流程图
从按键的去抖流程图我们可以知道,检测到有键按下时,应延时等待一段时间〔可调用一个5ms~10ms的延迟子程序〕,然后再次判断按键是否被按下,假设此时判断按键仍被按下,则认为按键有效,假设此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。
键盘真正被按下才可进展相应的处理程序,此时根本就算实现了按键输入,进一步的话可以判断按键是否释放。
四、实验步骤
上面的图的意思是P3.1~P3.3跟P3.4~P3.7不一样的,他们是相互连接〔当按下键时〕,组成4*4=16个键的。
如果给P3一个扫描初值的话:
如0*0F,则没有键按下时为:
P3.1~P3.3为1P3.4~P3.7为0如果有键按下,则情况发生变化:
高电平接入低电平:
如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。
则P3此时为:
00000111,这时如果用P3&0*0F,则高四位为0低四位保存,可以得到低四位的容了。
通过去抖操作,即一个delay,可以得到低四位容。
这里设为:
h=P3&0*0F;如果再得到高四位容,则可以组成一个数,来定位哪个键了。
程序框图:
P3=FFH,P3.0=0
有键按下吗.
延时10ms
真得有键按下吗.
根据当前状态识别按键
P3=FFH,P3.1=0
有键按下吗.
延时10ms
真得有键按下吗.
根据当前状态识别按键
P3=FFH,P3.2=0
有键按下吗.
延时10ms
真得有键按下吗.
根据当前状态识别按键
P3=FFH,P3.3=0
有键按下吗.
延时10ms
真得有键按下吗.
根据当前状态识别按键
C语言源程序:
*include
sbitbeep=P2^3;
sbitdula=P2^6;
sbitwela=P2^7;
unsignedchari=100;
unsignedcharj,k,temp,key;
voiddelay(unsignedchari)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
Unsignedcharcodetable[]={0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,
0*07,0*7f,0*6f,0*77,0*7c,0*39,0*5e,0*79,0*71};
display(unsignedcharnum)
{
P0=table[num];
dula=1;
dula=0;
P0=0*c0;
wela=1;
wela=0;
}
voidmain()
{
dula=0;
wela=0;
while
(1)
{
P3=0*fe;
temp=P3;
temp=temp&0*f0;
if(temp!
=0*f0)
{
delay(10);
if(temp!
=0*f0)
{
temp=P3;
switch(temp)
{
case0*ee:
key=0;
break;
case0*de:
key=1;
break;
case0*be:
key=2;
break;
case0*7e:
key=3;
break;
}
while(temp!
=0*f0)
{
temp=P3;
temp=temp&0*f0;
beep=0;
}
beep=1;
display(key);
P1=0*fe;
}
}
P3=0*fd;
temp=P3;
temp=temp&0*f0;
if(temp!
=0*f0)
{
delay(10);
if(temp!
=0*f0)
{
temp=P3;
switch(temp)
{
case0*ed:
key=4;
break;
case0*dd:
key=5;
break;
case0*bd:
key=6;
break;
case0*7d:
key=7;
break;
}
while(temp!
=0*f0)
{
temp=P3;
temp=temp&0*f0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0*fb;
temp=P3;
temp=temp&0*f0;
if(temp!
=0*f0)
{
delay(10);
if(temp!
=0*f0)
{
temp=P3;
switch(temp)
{
case0*eb:
key=8;
break;
case0*db:
key=9;
break;
case0*bb:
key=10;
break;
case0*7b:
key=11;
break;
}
while(temp!
=0*f0)
{
temp=P3;
temp=temp&0*f0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0*f7;
temp=P3;
temp=temp&0*f0;
if(temp!
=0*f0)
{
delay(10);
if(temp!
=0*f0)
{
temp=P3;
switch(temp)
{
case0*e7:
key=12;
break;
case0*d7:
key=13;
break;
case0*b7:
key=14;
break;
case0*77:
key=15;
break;
}
while(temp!
=0*f0)
{
temp=P3;
temp=temp&0*f0;
beep=0;
}
beep=1;
display(key);
}
}
}
}
汇编程序:
dulabitP2.0;
welabitP2.1;
KEYBUFEQU30H
ORG00H
START:
MOVKEYBUF,*2
WAIT:
MOVP3,*0FFH
CLRP3.4
MOVA,P3
ANLA,*0FH
*RLA,*0FH
JZNOKEY1
LCALLDELY10MS
MOVA,P3
ANLA,*0FH
*RLA,*0FH
JZNOKEY1
MOVA,P3
ANLA,*0FH
CJNEA,*0EH,NK1
MOVKEYBUF,*0
movp1,*11111110b
LJMPDK1
NK1:
CJNEA,*0DH,NK2
MOVKEYBUF,*4
movp1,*11111100b
LJMPDK1
NK2:
CJNEA,*0BH,NK3
MOVKEYBUF,*8
movp1,*11111000b
LJMPDK1
NK3:
CJNEA,*07H,NK4
MOVKEYBUF,*12
movp1,*11110000b
LJMPDK1
NK4:
NOP
DK1:
calldisplay
DK1A:
MOVA,P3;等待释放
ANLA,*0FH
*RLA,*0FH
JNZDK1A
NOKEY1:
MOVP3,*0FFH
CLRP3.5
MOVA,P3
ANLA,*0FH
*RLA,*0FH
JZNOKEY2
LCALLDELY10MS
MOVA,P3
ANLA,*0FH
*RLA,*0FH
JZNOKEY2
MOVA,P3
ANLA,*0FH
CJNEA,*0EH,NK5
MOVKEYBUF,*1
movp1,*11111110b
LJMPDK2
NK5:
CJNEA,*0DH,NK6
MOVKEYBUF,*5
movp1,*11111100b
LJMPDK2
NK6:
CJNEA,*0BH,NK7
MOVKEYBUF,*9
movp1,*11111000b
LJMPDK2
NK7:
CJNEA,*07H,NK8
MOVKEYBUF,*13
movp1,*11110000b
LJMPDK2
NK8:
NOP
DK2:
calldisplay
DK2A:
MOVA,P3;释放
ANLA,*0FH
*RLA,*0FH
JNZDK2A
NOKEY2:
MOVP3,*0FFH
CLRP3.6
MOVA,P3
ANLA,*0FH
*RLA,*0