版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
模块七系统扩展与接口技术
7.2单片机与键盘的连接模块七系统扩展与接口技术7.2.1键盘及其抖动问题键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据。一般单片机系统中采用非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。7.2.1键盘及其抖动问题键盘是由若干按键组成的开关矩阵27.2.1键盘及其抖动问题组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。当开关S断开时,P1.0输入为高电平,S闭合时,P1.0输入为低电平。由于按键是机械触点,当机械触点断开、闭合时,会有抖动。7.2.1键盘及其抖动问题组成键盘的按键有触点式和非触点3消除抖动的方法硬件方法:一般不常用。软件方法:单片机设计中常用软件法,软件去除抖动其实很简单,就是在单片机获得P1.0口为低的信息后,不是立即认定S已被按下,而是延时10毫秒或更长一段时间后再次检测P1.0口,如果仍为低,说明S的确按下了,这实际上是避开了按键按下时的抖动时间。而在检测到按键释放后(P1.0为高),再延时5~10个毫秒,消除后沿的抖动,然后再对键值处理。消除抖动的方法硬件方法:一般不常用。47.2.2单片机与键盘的连接将每个按键的一端接到单片机的I/O口,另一端接地。1、通过I/O口连接:一、独立式按键接口技术7.2.2单片机与键盘的连接将每个按键的一端接到单片机的5实例如下图所示,采用不断查询的方法,即检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的键处理。假设两个键定义如下:P3.0:开始执行某种操作(假设让8只发光二极管闪烁)。P3.1:停止执行。实例如下图所示,采用不断查询的方法,即检测是否有键闭合,如6voiddelay(unsignedchar);bitkey();voidlsd(unsignedchar);unsignedcharvkey;bitstart_end=0;voidmain(){unsignedcharldata;while(1){}}if(key()){if(vkey==1)start_end=1;elsestart_end=0;}if(start_end){ldata=~ldata;delay(250);}elseldata=0xff;P0=ldata;源程序voiddelay(unsignedchar);if(k7源程序(延时函数delay())voiddelay(unsignedchart){unsignedchari,j;for(i=t;i>0;i--)for(j=200;j>0;j--);}源程序(延时函数delay())voiddelay(uns8bitkey(){unsignedchartemp;bitflag=0;temp=P3;temp=temp|0xfc;temp=temp^0xff;if(temp==0)returnflag;else{}}delay(25);temp=P3|0xfc;temp=temp^0xff;if(temp==0)
returnflag;else{vkey=temp;flag=1;while(temp){temp=P3|0xfc;temp=temp^0xff;}}returnflag;源程序(判断是否有键按下函数)bitkey()delay(25);temp=P3|092、采用中断方式各个按键都接到一个与非门上,当有任何一个按键按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中不断地循环查询,如果有键按下,单片机再去做相应的处理。2、采用中断方式各个按键都接到一个与非门上,当有任何一个按键10实例试编程实现由3个按键控制发光二极管的全亮、闪烁或全灭。#include<reg51.h>voiddelay(unsignedchar);unsignedcharflag;voidmain(){IT0=1;EA=1;EX0=1;while(1){switch(flag){case1:P0=0x00;break;case2:P0=~P0;delay(250);break;case3:P0=0xff;break;}}}voiddelay(unsignedchart){unsignedchari,j;for(i=t;i>0;i--)for(j=200;j>0;j--);}实例试编程实现由3个按键控制发光二极管的全亮、闪烁或全灭。11中断服务函数voidisr_int0()interrupt0{unsignedcharkdata;kdata=P1;kdata=kdata^0xff;kdata>>=1;if(kdata!=0){kdata>>=1;if(kdata!=0)flag=3;elseflag=2;}elseflag=1;}中断服务函数voidisr_int0()interrup12二、矩阵式键盘接口技术在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,在需要的键数比较多时,采用矩阵法来做键盘是合理的。1、矩阵式键盘的结构二、矩阵式键盘接口技术在键盘中按键数量较多时,为了减少I/O13当按键没有按下时,所有的输入端都是高电平,代表无键按下。一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可判断是否有键按下了。1、矩阵式键盘的结构当按键没有按下时,所有的输入端都是高电平,代表无键按下。一旦142、矩阵式键盘的按键识别方法——行扫描法1)判断键盘中有无键按下。将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。2)判断闭合键所在的位置。在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。2、矩阵式键盘的按键识别方法——行扫描法1)判断键盘中有无键152、矩阵式键盘的按键识别方法——行扫描法2、矩阵式键盘的按键识别方法——行扫描法16行扫描法行扫描法识别按键的方法就象在二维平面上找确定的点,要在二维平面上找到确定的点。确定这点的横坐标:行线位置确定它的纵坐标:列线位置公式:键值=行号×列数+列号行扫描法行扫描法识别按键的方法就象在二维平面上找确定的点,要17实例89S51单片机的P1口用作键盘I/O口,P0口用作输出口,用于输出所按键的键号(0~F)。89S51单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0~P1.3分别接有4个上拉电阻到正电源+5V,并把列线P1.0~P1.3设置为输入线,行线P1.4~P1.7设置为输出线。4根行线和4根列线形成16个相交点。实例89S51单片机的P1口用作键盘I/O口,P0口用作18行扫描识别步骤(1)检测当前是否有键被按下:检测的方法是P1.4~P1.7输出全“0”,读取P1.0~P1.3的状态,若P1.0~P1.3为全“1”,则无键闭合,否则有键闭合。(2)去除键抖动:当检测到有键按下后,延时一段时间再做下一步的检测判断。(3)若有键被按下,应识别出是哪一个键闭合。行扫描识别步骤(1)检测当前是否有键被按下:检测的方法是P119识别键闭合的方法对键盘的行线进行扫描。P1.4~P1.7按下述4种组合依次输出:P1.71110P1.61101P1.51011P1.40111在每组行输出时读取P1.0~P1.3,若全为“1”,则表示为这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。识别键闭合的方法对键盘的行线进行扫描。P1.4~P1.7按下20流程图效标志键盘扫描有键闭合延时去抖动扫描键盘计算键值闭合键释放建立有效标志建立无返回找到闭合键NYNYNY流程图效标志键盘扫描有键闭合延时去抖动扫描键盘计算键值闭合键21键盘扫描程序#include<reg51.h>unsignedcharseg[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voiddelay(unsignedchar);unsignedcharkey_scan();voidmain(){unsignedcharval_key;while(1){val_key=key_scan();if(val_key!=0xff)P0=seg[val_key];}}键盘扫描程序#include<reg51.h>22voiddelay(unsignedchart){unsignedchari,j;for(i=0;i<t;i++)for(j=0;j<200;j++);}键盘扫描程序voiddelay(unsignedchart)键盘扫23键盘扫描函数unsignedcharkey_scan(){unsignedcharkdata,vkey,keyNo;bitiskey=0;//标志,在确定具体哪一个键按下时,如果检测到有一个键按下则该标志置1P1=0x0f;//行线送“0”kdata=P1;//读取列线值kdata&=0x0f;if(kdata==0x0f)return0xff;//无键按下,建立无效标志(0xff为无键按下的无效标志)
键盘扫描函数unsignedcharkey_scan()24键盘扫描函数else//若列线均为“1”则无键按下,否则有键按下{delay(25);//有键按下,去除抖动kdata=0xef;while(!iskey)//扫描键盘{vkey=P1=kdata;//送扫描码至P1口行线,并将扫描码保存到vkey中kdata=P1;//读取列线值kdata&=0x0f;if(kdata==0x0f){kdata=vkey;//若没有键盘按下,则取出行扫描码kdata<<=1;//换扫描下一行的扫描码(循环向左移一位kdata|=1;}键盘扫描函数else//若列线均为“1”则25键盘扫描函数else//若有键按下则键处理{kdata^=0x0f;//为计算列值的方便,将列线P1.3~P1.0分别与1异或即按位取反switch(kdata)//计算列值{case1:keyNo=0;break;case2:keyNo=1;break;case4:keyNo=2;break;case8:keyNo=3;break;}iskey=1;}}
键盘扫描函数else//若有键按下则键处26键盘扫描函数vkey=vkey>>4;//取行扫描码vkey^=0x0f;//将行扫描码取反switch(vkey){case1:keyNo+=0;break;//把行值加到列值中case2:keyNo+=4;break;case4:keyNo+=8;break;case8:keyNo+=12;break;}do{kdata=P1;kdata&=0x0f;}while(kdata!=0x0f);//判断键释放}returnkeyNo;}键盘扫描函数vkey=vkey>>4;27案例空调制冷控制系统预置温度控制如下图所示,“UP”是“升温”按钮,接INT0,“DOWN”是“降温”按钮,接INT1。显然,该案例中,提高或降低调节温度均采用中断方式实现,按“UP”则产生外部中断0,按“DOWN”产生外部中断1。案例空调制冷控制系统预置温度控制如下图所示,“UP”是“28源程序(主函数)调节温度的设置可分别在外部中断0和外部中断1的中断服务程序中实现,在中断服务程序中,调节温度放在变量temp(采用BCD码)中,每发生一次中断,temp中的数据加1或减1,并再分别由8051的P1、P2控制的两个数码管显示其温度值。#include<reg51.h>unsignedchartemp=30;main(){unsignedchart10,t;IT0=IT1=1;t10=temp/10;t=temp%10;P1=(t10<<4)|(t&0x0f);EA=1;EX0=EX1=1;while(1);}源程序(主函数)调节温度的设置可分别在外部中断0和外部中断129//按升温按钮的中断服务程序voidisr_int0()interrupt0{unsignedchart10,t;if(temp<30)temp++;t10=temp/10;t=temp%10;P1=(t10<<4)|(t&0x0f);}温度设定中断子程序://按升温按钮的中断服务程序温度设定中断子程序:30//按降温按钮的中断服务程序voidisr_int1()interrupt2{unsignedchart10,t;if(temp>20)temp--;t10=temp/10;t=temp%10;P1=(t10<<4)|(t&0x0f);}温度设定中断子程序://按降温按钮的中断服务程序温度设定中断子程序:31提示:本案例还解决了一个处理十进制温度(BCD码)的问题,请留意。本案例只是提供一个思路,仅供参考,不要把思维局限在本案例上。本案例只用了两个按钮,可以直接采用中断法,但本任务却要四个按钮,能直接用吗?显然不行?提示:本案例还解决了一个处理十进制温度(BCD码)的问题,请32知识梳理与总结本任务通过温度报警器预置温度的实现,让读者掌握键盘工作原理及其与单片机接口的相关知识,学会应用。本任务重点内容如下:(1)键盘工作原理、按键抖动问题及其消除方法;(2)独立式按键与单片机连接的电路及其编程;(3)矩阵式键盘的结构及其按键识别方法——行列扫描法的程序设计。知识梳理与总结本任务通过温度报警器预置温度的实现,让读者掌握33任务作业P281~P282T8-4~T8-6任务作业P281~P28234模块七系统扩展与接口技术
7.2单片机与键盘的连接模块七系统扩展与接口技术7.2.1键盘及其抖动问题键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据。一般单片机系统中采用非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。7.2.1键盘及其抖动问题键盘是由若干按键组成的开关矩阵367.2.1键盘及其抖动问题组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。当开关S断开时,P1.0输入为高电平,S闭合时,P1.0输入为低电平。由于按键是机械触点,当机械触点断开、闭合时,会有抖动。7.2.1键盘及其抖动问题组成键盘的按键有触点式和非触点37消除抖动的方法硬件方法:一般不常用。软件方法:单片机设计中常用软件法,软件去除抖动其实很简单,就是在单片机获得P1.0口为低的信息后,不是立即认定S已被按下,而是延时10毫秒或更长一段时间后再次检测P1.0口,如果仍为低,说明S的确按下了,这实际上是避开了按键按下时的抖动时间。而在检测到按键释放后(P1.0为高),再延时5~10个毫秒,消除后沿的抖动,然后再对键值处理。消除抖动的方法硬件方法:一般不常用。387.2.2单片机与键盘的连接将每个按键的一端接到单片机的I/O口,另一端接地。1、通过I/O口连接:一、独立式按键接口技术7.2.2单片机与键盘的连接将每个按键的一端接到单片机的39实例如下图所示,采用不断查询的方法,即检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的键处理。假设两个键定义如下:P3.0:开始执行某种操作(假设让8只发光二极管闪烁)。P3.1:停止执行。实例如下图所示,采用不断查询的方法,即检测是否有键闭合,如40voiddelay(unsignedchar);bitkey();voidlsd(unsignedchar);unsignedcharvkey;bitstart_end=0;voidmain(){unsignedcharldata;while(1){}}if(key()){if(vkey==1)start_end=1;elsestart_end=0;}if(start_end){ldata=~ldata;delay(250);}elseldata=0xff;P0=ldata;源程序voiddelay(unsignedchar);if(k41源程序(延时函数delay())voiddelay(unsignedchart){unsignedchari,j;for(i=t;i>0;i--)for(j=200;j>0;j--);}源程序(延时函数delay())voiddelay(uns42bitkey(){unsignedchartemp;bitflag=0;temp=P3;temp=temp|0xfc;temp=temp^0xff;if(temp==0)returnflag;else{}}delay(25);temp=P3|0xfc;temp=temp^0xff;if(temp==0)
returnflag;else{vkey=temp;flag=1;while(temp){temp=P3|0xfc;temp=temp^0xff;}}returnflag;源程序(判断是否有键按下函数)bitkey()delay(25);temp=P3|0432、采用中断方式各个按键都接到一个与非门上,当有任何一个按键按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中不断地循环查询,如果有键按下,单片机再去做相应的处理。2、采用中断方式各个按键都接到一个与非门上,当有任何一个按键44实例试编程实现由3个按键控制发光二极管的全亮、闪烁或全灭。#include<reg51.h>voiddelay(unsignedchar);unsignedcharflag;voidmain(){IT0=1;EA=1;EX0=1;while(1){switch(flag){case1:P0=0x00;break;case2:P0=~P0;delay(250);break;case3:P0=0xff;break;}}}voiddelay(unsignedchart){unsignedchari,j;for(i=t;i>0;i--)for(j=200;j>0;j--);}实例试编程实现由3个按键控制发光二极管的全亮、闪烁或全灭。45中断服务函数voidisr_int0()interrupt0{unsignedcharkdata;kdata=P1;kdata=kdata^0xff;kdata>>=1;if(kdata!=0){kdata>>=1;if(kdata!=0)flag=3;elseflag=2;}elseflag=1;}中断服务函数voidisr_int0()interrup46二、矩阵式键盘接口技术在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,在需要的键数比较多时,采用矩阵法来做键盘是合理的。1、矩阵式键盘的结构二、矩阵式键盘接口技术在键盘中按键数量较多时,为了减少I/O47当按键没有按下时,所有的输入端都是高电平,代表无键按下。一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可判断是否有键按下了。1、矩阵式键盘的结构当按键没有按下时,所有的输入端都是高电平,代表无键按下。一旦482、矩阵式键盘的按键识别方法——行扫描法1)判断键盘中有无键按下。将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。2)判断闭合键所在的位置。在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。2、矩阵式键盘的按键识别方法——行扫描法1)判断键盘中有无键492、矩阵式键盘的按键识别方法——行扫描法2、矩阵式键盘的按键识别方法——行扫描法50行扫描法行扫描法识别按键的方法就象在二维平面上找确定的点,要在二维平面上找到确定的点。确定这点的横坐标:行线位置确定它的纵坐标:列线位置公式:键值=行号×列数+列号行扫描法行扫描法识别按键的方法就象在二维平面上找确定的点,要51实例89S51单片机的P1口用作键盘I/O口,P0口用作输出口,用于输出所按键的键号(0~F)。89S51单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0~P1.3分别接有4个上拉电阻到正电源+5V,并把列线P1.0~P1.3设置为输入线,行线P1.4~P1.7设置为输出线。4根行线和4根列线形成16个相交点。实例89S51单片机的P1口用作键盘I/O口,P0口用作52行扫描识别步骤(1)检测当前是否有键被按下:检测的方法是P1.4~P1.7输出全“0”,读取P1.0~P1.3的状态,若P1.0~P1.3为全“1”,则无键闭合,否则有键闭合。(2)去除键抖动:当检测到有键按下后,延时一段时间再做下一步的检测判断。(3)若有键被按下,应识别出是哪一个键闭合。行扫描识别步骤(1)检测当前是否有键被按下:检测的方法是P153识别键闭合的方法对键盘的行线进行扫描。P1.4~P1.7按下述4种组合依次输出:P1.71110P1.61101P1.51011P1.40111在每组行输出时读取P1.0~P1.3,若全为“1”,则表示为这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。识别键闭合的方法对键盘的行线进行扫描。P1.4~P1.7按下54流程图效标志键盘扫描有键闭合延时去抖动扫描键盘计算键值闭合键释放建立有效标志建立无返回找到闭合键NYNYNY流程图效标志键盘扫描有键闭合延时去抖动扫描键盘计算键值闭合键55键盘扫描程序#include<reg51.h>unsignedcharseg[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voiddelay(unsignedchar);unsignedcharkey_scan();voidmain(){unsignedcharval_key;while(1){val_key=key_scan();if(val_key!=0xff)P0=seg[val_key];}}键盘扫描程序#include<reg51.h>56voiddelay(unsignedchart){unsignedchari,j;for(i=0;i<t;i++)for(j=0;j<200;j++);}键盘扫描程序voiddelay(unsignedchart)键盘扫57键盘扫描函数unsignedcharkey_scan(){unsignedcharkdata,vkey,keyNo;bitiskey=0;//标志,在确定具体哪一个键按下时,如果检测到有一个键按下则该标志置1P1=0x0f;//行线送“0”kdata=P1;//读取列线值kdata&=0x0f;if(kdata==0x0f)return0xff;//无键按下,建立无效标志(0xff为无键按下的无效标志)
键盘扫描函数unsignedcharkey_scan()58键盘扫描函数else//若列线均为“1”则无键按下,否则有键按下{delay(25);//有键按下,去除抖动kdata=0xef;while(!iskey)//扫描键盘{vkey=P1=kdata;//送扫描码至P1口行线,并将扫描码保存到vkey中kdata=P1;//读取列线值kdata&=0x0f;if(kdata==0x0f){kdata=vkey;//若没有键盘按下,则取出行扫描码kdata<<=1;//换扫描下一行的扫描码(循环向左移一位kdata|=1;}键盘扫描函数else//若列线均为“1”则59键盘扫描函数else//若有键按下则键处理{kdata^=0x0f;//为计算列值的方便,将列线P1.3~P1.0分别与1异或即按位取反switch(kdata)//计算列值{case1:keyNo=0;break;case2:keyNo=1;break;case4:keyNo=2;break;case8:keyNo=3;break;}iskey=1;}}
键盘扫描函数else//若有键按下则键处60键盘扫描函数vkey=vkey>>4;//取行扫描码vkey^=0x0f;//将行扫描码取反switch(vkey){case1:keyNo+=0;break;//把行值加到列值中case2:keyNo+=4;break;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年版:特许连锁经营合同
- 2025年度虚拟现实娱乐项目合作协议范本3篇
- 2024年环保项目委托合同:废气处理设施建设与运营
- 2024版智能语音识别系统研发合同
- 2024年私借私还转账借款协议
- 2024年度债务转移及债务清偿监督合同范本3篇
- 2025年度智能建筑项目监理合同补充协议书3篇
- 2024年绿色制造生产车间承包与环保责任承诺书3篇
- 2024年环保设备采购与安装承包合同
- 2025年度橱柜安装与售后服务标准合同范本3篇
- 融资服务(居间)协议带分流表参考
- 《仪器分析》课后习题答案
- 浅层气浮的工艺原理及操作
- 医疗器械风险管理计划
- 北京保险中介行业营销员增员及流动自律公约
- 柴油发电机施工方案33709
- 外来施工单位人员报备登记表完整
- 100以内加减法混合[列竖式运算练习]
- 深圳市建设工程施工围挡图集(试行版_下半部分).pdf
- 全国城市雕塑行业设计收费标准
- 质量管理组织机构及职责
评论
0/150
提交评论