一、实验目的:1、学习非编码键盘的工作原理和键盘的扫描方式。
2、学习键盘的去抖方法和键盘应用程序的设计。
二、实验设备:51/AVR实验板、USB连接线、电脑三、实验原理:键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。
我们可以通过键盘输入数据或命令来实现简单的人机通信。
1、按键的分类一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。
前者造价低,后者寿命长。
目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。
按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。
编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别。
全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。
非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成。
由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。
2、按键的输入原理在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。
也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。
此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。
当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。
因此,键信息输入是与软件结构密单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。
3、按键的特点与去抖机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。
其抖动过程如图1(a)所示,抖动时间的长短与开关的机械特性有关,一般为5 -10 ms。
从图中可以看出,在触点抖动期间检测按键的通与断状态,可能导致判断出错。
即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。
为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。
一般来说,在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。
(本学习板采用软件去抖方式)。
按键抖动状态图硬件电容去抖按键去抖流程图从按键的去抖流程图我们可以知道,检测到有键按下时,应延时等待一段时间(可调用一个5ms~10ms的延迟子程序),然后再次判断按键是否被按下,若此时判断按键仍被按下,则认为按键有效,若此时判断按键没有被按下,说明为按键抖动或干扰,应返回重新判断。
键盘真正被按下才可进行相应的处理程序,此时基本就算实现了按键输入,进一步的话可以判断按键是否释放。
四、实验步骤上面的图的意思是~ 跟~不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。
如果给P3一个扫描初值的话:如0x0F ,则没有键如与连接的键按下,则与为0,即接地了。
则P3此时为:0000 0111,这时如果用P3&0x0F,则高四位为0低四位保留,可以得到低四位的内容了。
通过去抖操作,即一个delay,可以得到低四位内容。
这里设为:h=P3&0x0F;如果再得到高四位内容,则可以组成一个数,来定位哪个键了。
程序框图:C语言源程序:#include<>sbit beep=P2^3;sbit dula=P2^6;sbit wela=P2^7;unsigned char i=100;unsigned char j,k,temp,key;void delay(unsigned char i){for(j=i;j>0;j--)}Unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};display(unsigned char num){P0=table[num];dula=1;dula=0;P0=0xc0;wela=1;wela=0;}void main(){dula=0;wela=0;while(1){P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;{case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;case 0x7e:key=3;break;}while(temp!=0xf0) {temp=P3;temp=temp&0xf0; beep=0;}beep=1;display(key);P1=0xfe;}}P3=0xfd;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xed:key=4;break;case 0xdd:key=5;break;case 0xbd:key=6;break;case 0x7d:key=7;break;}while(temp!=0xf0) {temp=P3;temp=temp&0xf0;}beep=1;display(key); }}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0) {temp=P3;switch(temp) {case 0xeb: key=8; break;case 0xdb: key=9; break;case 0xbb: key=10; break;case 0x7b:break;}while(temp!=0xf0) {temp=P3;temp=temp&0xf0; beep=0;}beep=1;display(key);}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key=12;break;case 0xd7:key=13;case 0xb7:key=14;break;case 0x77:key=15;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;beep=0;}beep=1;display(key);}}}}汇编程序:dula bit ;wela bit ;KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#2 WAIT:CLRMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1 MOV KEYBUF,#0 mov p1,#bLJMP DK1NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#4 mov p1,#bLJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#8 mov p1,#bLJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#12 mov p1,#bLJMP DK1call displayDK1A: MOV A,P3 ;等待释放 ANL A,#0FHXRL A,#0FHJNZ DK1ANOKEY1:MOV P3,#0FFHCLRMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5MOV KEYBUF,#1mov p1,#bLJMP DK2NK5: CJNE A,#0DH,NK6MOV KEYBUF,#5mov p1,#bLJMP DK2LJMP DK2NK7: CJNE A,#07H,NK8MOV KEYBUF,#13mov p1,#bLJMP DK2NK8: NOPDK2:call displayDK2A: MOV A,P3 ;释放 ANL A,#0FHXRL A,#0FHJNZ DK2ANOKEY2:MOV P3,#0FFHCLRMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#6mov p1,#bLJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 mov p1,#bLJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#14 mov p1,#bLJMP DK3NK12: NOPDK3:call displayDK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ANOKEY3:MOV P3,#0FFHCLRMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4LCALL DELY10MSJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13 MOV KEYBUF,#3mov p1,#bLJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#7mov p1,#bLJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#11 mov p1,#bLJMP DK4NK15: CJNE A,#07H,NK16 mov p1,#bMOV KEYBUF,#15 LJMP DK4NK16: NOPDK4:call displayDK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ANOKEY4:D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETdisplay: MOV A,KEYBUF ;查表MOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,Asetb dulaclr dulamov P0,#0c0hsetb welaclr welaclracall ds1ms ;延时,以便人眼可以观察到 setb;acall ds1msretds10ms: mov r1,#1ds1lo: mov r2,#200ds2lo: mov r3,#200djnz r3,$djnz r2,ds2loTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HEND五、实验现象:当你按下矩阵键盘中的任何一个键,蜂鸣器响一声,并在数码管上显示相应的键值。