1、 键盘是由若干按键组成的开关矩阵,它是微型计算键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据。一般单片机系统中采用非输入指令、地址和数据。一般单片机系统中采用非编码键盘,非编码键盘是由软件来识别键盘上的闭编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。广泛应用于单片机系统。组成键盘的按键有触点式和非触点式两种,单片机组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构
2、成的。当开关中应用的一般是由机械触点构成的。当开关S S断开时断开时,P1.0P1.0输入为高电平,输入为高电平,S S闭合时,闭合时,P1.0P1.0输入为低电平输入为低电平。由于按键是机械触点,当机械触点断开、闭合时。由于按键是机械触点,当机械触点断开、闭合时,会有抖动。,会有抖动。硬件方法:一般不常用。一般不常用。软件方法:单片机设计中常用软件法,软件去除抖动其实很单片机设计中常用软件法,软件去除抖动其实很简单,就是在单片机获得简单,就是在单片机获得P1.0P1.0口为低的信息后,不是立即认口为低的信息后,不是立即认定定S S已被按下,而是延时已被按下,而是延时1010毫秒或更长一段时间
3、后再次检测毫秒或更长一段时间后再次检测P1.0P1.0口,如果仍为低,说明口,如果仍为低,说明S S的确按下了,这实际上是避开的确按下了,这实际上是避开了按键按下时的抖动时间。而在检测到按键释放后(了按键按下时的抖动时间。而在检测到按键释放后(P1.0P1.0为为高),再延时高),再延时5 51010个毫秒,消除后沿的抖动,然后再对键个毫秒,消除后沿的抖动,然后再对键值处理。值处理。将每个按键的一端接到单片将每个按键的一端接到单片机的机的I/OI/O口,另一端接地。口,另一端接地。1、通过、通过I/O口连接口连接:如下图所示,采用不断查询的方法,即检测是否有键闭合,如如下图所示,采用不断查询的
4、方法,即检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的键处理。假有键闭合,则去除键抖动,判断键号并转入相应的键处理。假设两个键定义如下:设两个键定义如下:P3.0P3.0:开始执行某种操作:开始执行某种操作(假设让(假设让8 8只发光二极管闪只发光二极管闪烁)烁)。P3.1P3.1:停止执行。:停止执行。void delay(unsigned char);bit key();void lsd(unsigned char);unsigned char vkey;bit start_end=0;void main()unsigned char ldata;while(1)if(k
5、ey()if(vkey=1)start_end=1;else start_end=0;if(start_end)ldata=ldata;delay(250);else ldata=0 xff;P0=ldata;void delay(unsigned char t)unsigned char i,j;for(i=t;i0;i-)for(j=200;j0;j-);bit key()unsigned char temp;bit flag=0;temp=P3;temp=temp|0 xfc;temp=temp0 xff;if(temp=0)return flag;else delay(25);temp
6、=P3|0 xfc;temp=temp0 xff;if(temp=0)return flag;else vkey=temp;flag=1;while(temp)temp=P3|0 xfc;temp=temp0 xff;return flag;各个按键都接到一各个按键都接到一个与非门上,当有个与非门上,当有任何一个按键按下任何一个按键按下时,都会使与门输时,都会使与门输出为低电平,从而出为低电平,从而引起单片机的中断引起单片机的中断,它的好处是不用,它的好处是不用在主程序中不断地在主程序中不断地循环查询,如果有循环查询,如果有键按下,单片机再键按下,单片机再去做相应的处理。去做相应的处理。#in
7、cludevoid delay(unsigned char);unsigned char flag;void main()IT0=1;EA=1;EX0=1;while(1)switch(flag)case 1:P0=0 x00;break;case 2:P0=P0;delay(250);break;case 3:P0=0 xff;break;void delay(unsigned char t)unsigned char i,j;for(i=t;i0;i-)for(j=200;j0;j-);void isr_int0()interrupt 0 unsigned char kdata;kdata
8、=P1;kdata=kdata0 xff;kdata=1;if(kdata!=0)kdata=1;if(kdata!=0)flag=3;else flag=2;else flag=1;在键盘中按键数量较多时,为了减少在键盘中按键数量较多时,为了减少I/OI/O口的占用口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如过一个按键加以连接。这样,一个端口(如P1P1口)口)就可以构成就可以构成4 4*4=164=16个按键,在需要
9、的键数比较多时个按键,在需要的键数比较多时,采用矩阵法来做键盘是合理的。,采用矩阵法来做键盘是合理的。1、矩阵式键盘的结构、矩阵式键盘的结构 当按键没有按下时,当按键没有按下时,所有的输入端都是高所有的输入端都是高电平,代表无键按下电平,代表无键按下。一旦有键按下,则。一旦有键按下,则输入线就会被拉低,输入线就会被拉低,这样,通过读入输入这样,通过读入输入线的状态就可判断是线的状态就可判断是否有键按下了。否有键按下了。1 1)判断键盘中有无键按下。将全部行线置低电平,)判断键盘中有无键按下。将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表然后检测列线的状态。只要有一列的电平为
10、低,则表示键盘中有键被按下,而且闭合的键位于低电平线与示键盘中有键被按下,而且闭合的键位于低电平线与4 4根行线相交叉的根行线相交叉的4 4个按键之中。若所有列线均为高电个按键之中。若所有列线均为高电平,则键盘中无键按下。平,则键盘中无键按下。2 2)判断闭合键所在的位置。在确认有键按下后,即)判断闭合键所在的位置。在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行为高电平。在确定某根行线位置为低
11、电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。为低电平的行线交叉处的按键就是闭合的按键。行扫描法识别按键的方法就象在二维平面上找确行扫描法识别按键的方法就象在二维平面上找确定的点,要在二维平面上找到确定的点。定的点,要在二维平面上找到确定的点。确定这点的横坐标:行线位置确定这点的横坐标:行线位置确定它的纵坐标:列线位置确定它的纵坐标:列线位置公式:键值公式:键值=行号行号列数列数+列号列号 89S5189S51单片机的单片机的P1P1口用作键盘口用作键盘I/OI/O口,键盘的列线接口,键盘的列
12、线接到到P1P1口的低口的低4 4位,键盘的行线接到位,键盘的行线接到P1P1口的高口的高4 4位。列位。列线线P1.0P1.0P1.3P1.3分别接有分别接有4 4个上拉电阻到正电源个上拉电阻到正电源+5V+5V,并把列线并把列线P1.0P1.0P1.3P1.3设置为输入线,行线设置为输入线,行线P1.4P1.4P1.7P1.7设置为输出线。设置为输出线。4 4根行线和根行线和4 4根列线形成根列线形成1616个相个相交点。交点。(1 1)检测当前是否有键被按下:检测的方法是)检测当前是否有键被按下:检测的方法是P1.4P1.4P1.7P1.7输出全输出全“0”0”,读取,读取P1.0P1.
13、0P1.3P1.3的状的状态,若态,若P1.0P1.0P1.3P1.3为全为全“1”1”,则无键闭合,否,则无键闭合,否则有键闭合。则有键闭合。(2 2)去除键抖动:当检测到有键按下后,延时一)去除键抖动:当检测到有键按下后,延时一段时间再做下一步的检测判断。段时间再做下一步的检测判断。(3 3)若有键被按下,应识别出是哪一个键闭合。)若有键被按下,应识别出是哪一个键闭合。对键盘的行线进行扫描。对键盘的行线进行扫描。P1.4P1.4P1.7P1.7按下述按下述4 4种组合种组合依次输出:依次输出:P1.7 1 1 1 0P1.7 1 1 1 0P1.6 1 1 0 1P1.6 1 1 0 1P
14、1.5 1 0 1 1P1.5 1 0 1 1P1.4 0 1 1 1P1.4 0 1 1 1在每组行输出时读取在每组行输出时读取P1.0P1.0P1.3P1.3,若全为,若全为“1”1”,则,则表示为这一行没有键闭合,否则有键闭合。由此得表示为这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。法将闭合键的行值和列值转换成所定义的键值。效标志键盘扫描有键闭合延时去抖动扫描键盘计算键值闭合键释放建立有效标志建立无返回找到闭合键NYNYNY#includeunsigned char
15、 seg16=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e;void delay(unsigned char);unsigned char key_scan();void main()unsigned char val_key;while(1)val_key=key_scan();if(val_key!=0 xff)P0=segval_key;void delay(unsigned char t)unsigned char i,j;for(i=0;i
16、t;i+)for(j=0;j200;j+);unsigned char key_scan()unsigned char kdata,vkey,keyNo;bit iskey=0;/标志,在确定具体哪一个键按下时,如果检测标志,在确定具体哪一个键按下时,如果检测到有一个键按下则该标志置到有一个键按下则该标志置1 P1=0 x0f;/行线送行线送“0”kdata=P1;/读取列线值读取列线值 kdata&=0 x0f;if(kdata=0 x0f)return 0 xff;/无键按下,建立无效标志(无键按下,建立无效标志(0 xff为无键按下的为无键按下的无效标志)无效标志)else /若列线均为
17、若列线均为“1”则无键按下,否则有键按下则无键按下,否则有键按下 delay(25);/有键按下,去除抖动有键按下,去除抖动 kdata=0 xef;while(!iskey)/扫描键盘扫描键盘 vkey=P1=kdata;/送扫描码至送扫描码至P1口行线,并将扫描码保存口行线,并将扫描码保存到到vkey中中 kdata=P1;/读取列线值读取列线值 kdata&=0 x0f;if(kdata=0 x0f)kdata=vkey;/若没有键盘按下,则取出行扫描码若没有键盘按下,则取出行扫描码 kdata4;/取行扫描码取行扫描码 vkey=0 x0f;/将行扫描码取反将行扫描码取反 switch
18、(vkey)case 1:keyNo+=0;break;/把行值加到列值中把行值加到列值中 case 2:keyNo+=4;break;case 4:keyNo+=8;break;case 8:keyNo+=12;break;do kdata=P1;kdata&=0 x0f;while(kdata!=0 x0f);/判断键释放判断键释放 return keyNo;如下图所示,如下图所示,“UP”UP”是是“升温升温”按钮,接按钮,接INT0INT0,“DOWN”DOWN”是是“降温降温”按钮,接按钮,接INT1INT1。显然,该案例中。显然,该案例中,提高或降低调节温度均采用中断方式实现,按,
19、提高或降低调节温度均采用中断方式实现,按“UP”UP”则产生外部中断则产生外部中断0 0,按,按“DOWN”DOWN”产生外部中断产生外部中断1 1。调节温度的设置可分别在调节温度的设置可分别在外部中断外部中断0 0和外部中断和外部中断1 1的的中断服务程序中实现,在中断服务程序中实现,在中断服务程序中,调节温中断服务程序中,调节温度放在变量度放在变量temptemp(采用(采用BCDBCD码)中,每发生一次码)中,每发生一次中断,中断,temptemp中的数据加中的数据加1 1或减或减1 1,并再分别由,并再分别由80518051的的P1P1、P2P2控制的两个数码控制的两个数码管显示其温度
20、值。管显示其温度值。#includeunsigned char temp=30;main()unsigned char t10,t;IT0=IT1=1;t10=temp/10;t=temp%10;P1=(t104)|(t&0 x0f);EA=1;EX0=EX1=1;while(1);/按升温按钮的中断服务程序按升温按钮的中断服务程序void isr_int0()interrupt 0 unsigned char t10,t;if(temp30)temp+;t10=temp/10;t=temp%10;P1=(t1020)temp-;t10=temp/10;t=temp%10;P1=(t104)|
21、(t&0 x0f);本案例还解决了一个处理十进制温度(本案例还解决了一个处理十进制温度(BCDBCD码)的码)的问题,请留意。问题,请留意。本案例只是提供一个思路,仅供参考,不要把思本案例只是提供一个思路,仅供参考,不要把思维局限在本案例上。维局限在本案例上。本案例只用了两个按钮,可以直接采用中断法,本案例只用了两个按钮,可以直接采用中断法,但本任务却要四个按钮,能直接用吗?显然不行但本任务却要四个按钮,能直接用吗?显然不行?本任务通过温度报警器预置温度的实现,让读者掌握本任务通过温度报警器预置温度的实现,让读者掌握键盘工作原理及其与单片机接口的相关知识,学会应键盘工作原理及其与单片机接口的相关知识,学会应用。用。本任务重点内容如下:本任务重点内容如下:(1 1)键盘工作原理、按键抖动问题及其消除方法;)键盘工作原理、按键抖动问题及其消除方法;(2 2)独立式按键与单片机连接的电路及其编程;)独立式按键与单片机连接的电路及其编程;(3 3)矩阵式键盘的结构及其按键识别方法)矩阵式键盘的结构及其按键识别方法行列扫行列扫描法的程序设计。描法的程序设计。P281P282 T8-4T8-6