键盘程序设计_第1页
键盘程序设计_第2页
键盘程序设计_第3页
键盘程序设计_第4页
键盘程序设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、键盘程序设计键盘程序设计按键是一种开关,通过外界作用力,导电金属或导电非金属按键是一种开关,通过外界作用力,导电金属或导电非金属接触与分离实现电路通断的控制是按键的基本机械原理,如接触与分离实现电路通断的控制是按键的基本机械原理,如计算机键盘、手机、计算机键盘、手机、MP3以及电子表按键。按键是计算机系以及电子表按键。按键是计算机系统输入设备,也是人机信息交换的主要途径。统输入设备,也是人机信息交换的主要途径。按键按下会产生抖动现象,不能安全有效的对系统控制,本按键按下会产生抖动现象,不能安全有效的对系统控制,本节根据按键产生的抖动机理,提出以中断、延时等措施消除节根据按键产生的抖动机理,提出

2、以中断、延时等措施消除键盘输入过程中的不稳定因素,实现单片机系统键盘的稳定键盘输入过程中的不稳定因素,实现单片机系统键盘的稳定输入。输入。3.3.1 键盘抖动现象键盘抖动现象n按键按下都会发出一声响,谁然有的按键声音很轻微,但这都是导体碰撞产生的震动。这种现象称为键盘抖动。如果不对键盘的抖动进行处理,按键会对系统电路或程序产生意外的干扰。为了观察按键的抖动现象,我们先做一个小实验,分析一下一个微触按键产生抖动对系统的影响。加数计数小系统图3.3.1图3.3.2l在图3-3-1所示的一个加数计数小系统中,设计数器的脉冲输入端CP为上升沿有效,加计数器初始显示为0。按键不按时,CP = 0,计数器

3、不加1计数。一般认为:按键按下,CP端由低电平变为高电平,含有电平上升沿,计数器加1计数,并且按下1次,计数器加1。实际实验时会发现,按键按下1次,计数器不是加1,而是跳跃一次性增加3或4。原因是按键按下在导体接触的瞬间产生了震动。图3-3-2是按键按下过程中CP端实际电平改变情况。T1为不按按键时刻,T2为按键按下瞬间的抖动,T3为按键按下稳定时刻,T4为按键放开时刻瞬间,T5为按键放开时刻。l从图中可以了解到,按键按下的瞬间由于震动会是按键内部的导体稳定接触,而是在导通和不导通之间来回弹跳,虽然时间一瞬间,但使CP端获得了多个电平的上升沿。按键抖动时间的长短由按键的机械特性决定,一般为5m

4、s10ms。因此不能直接把按键作为1个脉冲的输入。l在数字电路中,常利用触发器消除键盘抖动,但在单片机系统中,按键可以直接接在单片机的I/O口上,常利用键盘程序来消除键盘的抖动现象。3.3.2 利用外部中断利用外部中断INT0实现键盘输入实现键盘输入n本案列利用外部中断INT0作为键盘输入端,当按键按下时,让单片机执行外部中断服务程序,在中断服务中完成键盘控制。n一、参考电路一、参考电路n 在最小系统基础上,单片机的P0.0口接一只LED,键盘接在P3.2端口,按键不按时,由于P3.2接有上啦电阻R3,所以P3.2此时为高电平+5V,如果按键按下,P3.2电源地短路,P3.2为低电平。为了消除

5、键盘抖动现象,键盘两端并联滤波电容器C4。图3-3-3 利用外部中断INT0实现键盘输入电路二、程序设计#includeunsigned char i = 0; sbit LED = P00;void int0_isr(void) interrrupt 0 /INT0中断服务函数,INT0的中断号为0i = i; /INT0中断1次,i值改变1次LED = i; /INT0中断1次,LED工作状态变化1次delay(); /调用延时函数void main(void)LED = 0; /芯片初始化时,LED灭EA = 0; EX0 = 1; /开启INT0中断PX0 = 1; /INT0中断优先

6、,可以省去EA = 1; /开启总中断开关while(1); /等待按键按下,中断发生三、程序说明三、程序说明n这里没有设置INT0是下降沿触发中断或是低电平触发中断,原因是按键按下,不管产生不产生键抖现象,总能使INT0引脚产生1个下降沿和低电平。如果设置只有下降沿才触发INT0中断,需要利用设置计时器控制寄存器TCON的IT0 = 1位,按键按下是否产生中断,可以利用程序检测TCON的IE0位。利用外部中断触发作为按键输入很好的解决了键盘抖动问题。如果需要多个键盘,把INT0口与I/O口之间用键盘连接,I/O输出低电平扫面信号即可。在数码管动态显示电路中,为了节省硬件资源,可以在INT0口

7、和P2口之间接入键盘,实现8只按键输入。二、中断请求标志二、中断请求标志1、TCON的中断标志的中断标志IT0(TCON.0),外部中断),外部中断0触发方式控制位。触发方式控制位。当当IT0=0时,为电平触发方式。时,为电平触发方式。当当IT0=1时,为边沿触发方式(下降沿有效)。时,为边沿触发方式(下降沿有效)。IE0(TCON.1),外部中断),外部中断0中断请求标志位。中断请求标志位。IT1(TCON.2),外部中断),外部中断1触发方式控制位。触发方式控制位。IE1(TCON.3),外部中断),外部中断1中断请求标志位。中断请求标志位。TF0(TCON.5),定时),定时/计数器计数

8、器T0溢出中断请求标志位。溢出中断请求标志位。TF1(TCON.7),定时),定时/计数器计数器T1溢出中断请求标志位。溢出中断请求标志位。 3.3.3 利用延时程序防止键盘抖动,利用延时程序防止键盘抖动,实现键盘输入实现键盘输入n按键按下产生的抖动现象持续的时间不会很久,因此在按键按下后,可延时一段时间跳过抖动,再对按键的状态检测,从而实现键盘输入。本案例完成通过两个键盘设计,实现对数码管显示数据的调整。n一、电路原理n在单片机最系统的基础上,KEY1、KEY2两个键盘一端分别接P3.0、P3.1,另一端接地,见图3-3-2所示。数码管仍使用共阳型。在Proteuse软件中,按键的英文名字为

9、BUTTON,在Switches & Relasy下的Switches里。图 3-3-4 利用延时函数消除键盘抖动实现键盘输入电路二、程序设计#include #define uchar unsigned charcode uchar seven_seg10 = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;sbit key1 = P3.0;sbit key2 = P3.1;uchar key1_state,key2_state; /按键按下的状态变量按键按下的状态变量void delay(uchar i)while (

10、i) i-; void key_scan (void) /键盘扫描函数键盘扫描函数if(key1 = 0) /如果按键按下如果按键按下 delay(200); /延时一段时间,消除键抖延时一段时间,消除键抖 while(key1 = 0) key1_state = 1; /再对按键检测,如果确实按下,再对按键检测,如果确实按下,按键状态变量为按键状态变量为1 if(key2 = 0) delay(200); while(key2 = 0) key2_state = 1; void main(void)char i; while(1) key_scan(); /调用键盘扫描函数 if(key1_

11、state = 1) /判断键盘状态变量,如1,说明有按键按下 i+; /显示数据增加 key1_state = 0; /数据增加后,键盘状态变量清零 if(i9) i = 0; /数据增加超过9后,回到0 if(key2_state = 1) i-; key2_state = 0; if(i 0) i = 9; P0 = seven_segi; /显示键盘调整数据 三、程序说明n1如果按键按下不放开,程序一直执行语句while(key1 = 0),这时程序在此处死循环,不能执行其它程序,所以本案例按键抬起后数据才能得到调整。此种编程方法并不影响单片机驱动1个数码管工作,但动态显示电路在此种情

12、况下不能正常工作。如果把while改换成if,按键只要按下数据就能调整,但如果按下不放开按键,数据自动快速增加或减小。如果按键按下既不让程序死循环,也不让由于按键按的时间过长而数据调整失控,最可靠的办法是利用变量记忆按键按下和放开的两种状态,根据判断实现键盘输入。程序如下;uchar key1_down_state, key1_up_state, /变量声明,初始值为0if(key1= 0) delay(200) if(key1= 0)keydownstate = 1; /如果按键按下,按下状态变量为1 if(key1 = 1 & keydownstate = 1) /如果按键按下又放开 ke

13、ydownstate = 0; /按键按下状态复位 keyupstate = 1; /按键抬起状态变量为1if(keyupstate = 1)keyupstate = 0; /按键按下抬起时,数据调整i+;我们也可以使用定时器中断对键盘扫描,实现键盘输入,下面时利用Timer0中断实现的键盘输入,其中键盘key1接单片机I/O口P3.0,Timer0工作在模式1。#include#define timer0_count 0 xee18 #define times 20sbit key = P30;char key_count;static void timer0_isr(void) inter

14、rupt 1TR0 = 0;TL0 = (timer0_count & 0 x00ff);TH0 = (timer0_count 8);TR0 = 1;if(key_count != 0) key_count-; if(key_count = 0 & key = 0); key_flog = 1; eles if(key = 0)key_count = times;2利用按键调整数据时,有时会调整过量,需要进行判断重置。本案例i为char型变量,数值在128127之间,语句if(i9) i = 0是向上增加过量复位。 3把键盘扫描key_scan()函数放在主函数的while循环体中,程序执行

15、时会断调用key_scan(),如果没有按键按下,执行key_scan()的时间很短,如果有按键按下,用于按键扫面函数又调用了延时函数,程序执行时间会变长。n1.数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。n在上题的基础上,用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。n按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4.44键盘程序设计键盘程序设计n44键盘16键盘阵列,本案例采用P1口完成,见图3-3-5所示,把P

16、18条I/O口分成4条列线4条行线交叉但不接触,16个按键放置交叉位置,在单片机复杂系统需要较多按键时,这种接法可以节省单片机的硬件资源。键盘和P1口之间采用总线连接布局,在电路原理设计过程中,总线只是图示引脚之间的相连接关系,但不具有电气连接特性,相连引脚之间需要标注相同的网络标号采用电气连接特性,如图3-3-5中,单片机的P1.0与键盘阵列上的P1.0相连。在设计单片机系统或其它电子系统时,由于器件引脚较多,器件与器件之间会经常采用总线连接,并且把电路模块化设计。 二、程序设计#include #define uchar unsigned charcode uchar P_scan = 0

17、 x7f,0 xbf,0 xdf,0 xef; /键盘行扫描临时数值code uchar key_temp = 0 xee,0 xde,0 xbe,0 x7e, 0 xed,0 xdd,0 xbd,0 x7d,0 xeb,0 xdb,0 xbb,0 x7b,0 xe7,0 xd7,0 xb7,0 x77;code uchar seven_seg = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;void delay(uchar i) while(i) i-;uchar key_temp(void) /键盘扫描函数 uch

18、ar i,j; for(i = 0; i 4;i+) /让键盘行线输出扫描数据 P1 = P_scani; if(P1 != P_scani) delay(200); /如果有按键按下,P1口不是扫描数据 if(P1 != P_scani) /延时一段时间后,分析一下P1口是什么数据 for(j = 0;j16;j+) /如果P1口上的数据与键盘临时数据相同,输出临时键值 if(P1 = key_tempj) return(j); eles /如果没有按键按下,输出没有按键按下标志“88” return(88); Void main(void) uchar i,j; while(1) i = key_temp(); if(i = 88) P0 = 0 xff; /如果没有按键按下,P0 = 0 xff,不显示 else P0 = seven_segi%10; P2 = 0 xbf; /显示按键值个位数 delay

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论