配色: 字号:
项目四 键盘设计与实现
2013-01-08 | 阅:  转:  |  分享 
  
陳慶逸、林柏辰編著---文魁資訊ARM嵌入式系统项目四键盘设计与实现模块九独立式键盘设计与实现使用AT89S52单片机,设
计一个具有8个按键的独立式键盘,每个按键对应一个发光二极管。功能要求:无键按下时,键盘输出全为“1”,发光二极管全部熄灭;有键按下
时,其所对应发光二极管点亮。认识键盘键盘是单片机应用系统中人机交流不可缺少的输入设备。键盘由一组规则排列的按键组成,一个按
键实际上是一个开关元件。键盘通常使用机械触点式按键开关,其主要功能是把机械上的通断转换为电气上的逻辑关系(1和0)。常见的种类有
:查询(独立)式键盘矩阵式键盘键盘分类按键按照结构原理可分为两类触点式开关按键,如机械式开关、导电橡胶式开关等
;无触点开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。按键按照接口原理可分为两类按键按照接口原理可分为两类
编码键盘,主要是用硬件来实现对按键的识别,硬件结构复杂;非编码键盘,主要是由软件来实现按键的定义与识别,硬件结构简单,软件编程量
大。这里我们主要介绍单片机中常用的触点式开关按键、非编码键盘。独立式键盘电路独立式键盘电路设计时,每个按键的一端与P0口的一
个引脚相连,另一端接地。无键按下时,P0的8个I/O口均通过电阻接高电平,信息为“1”,键盘输出全为“1”发光二极管全部熄灭。
有键按下,将使对应的I/O口通过该键接地,信息为“0”,对应发光二极管点亮。CPU可以通过检测P0的8个I/O口线哪个是“0
”就可以识别是否有键按下,并能识别出是哪一个键按下。独立式键盘程序程序要判断是否有2个或2个以上的键盘同时按下,以免键盘分析
错误。独立式键盘程序假设8个按键分别为1~8,试一试能否用数码管显示按下的按键。键盘设计应注意的问题机械式按键在按下或释放
时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如右图所示,抖动时间的长短与开关的
机械特性有关,一般为5?10ms。若有抖动,按键按下会被错误地认为是多次操作。防抖动措施为了克服按键触点机械抖动所致的检测
误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。键数较少时,采用硬件去抖;键数较多时,采用软件去抖。
软件上采取的措施是在检测到有按键按下时,执行一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序,再确认该键电平
是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态,从而消除抖动的影响。软件去抖在检测到有按键按下时执行
一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序后;再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则
确认该键是处于闭合状态。技能训练4-1一键多功能按键识别设计与实现按键接在P3.0管脚上,在AT89S52单片机的P1端
口接有四个发光二极管。上电的时候,接在P1.0管脚上的发光二极管D1在闪烁;当第一次按下按键的时候,接在P1.1管脚上的发光
二极管D2在闪烁;再按下按键的时候,接在P1.2管脚上的发光二极管D3在闪烁,再按下按键的时候,接在P1.3管脚上的发光二极
管D4在闪烁,再按下按键的时候,又轮到D1在闪烁了,如此轮流下去。一键多功能按键识别电路设计一键多功能按键识别程序设计
对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的
,所以单片机就很容易识别不同功能的身份了。从上面的要求我们可以看出,D1到D4发光二极管在每个时刻的闪烁的时间是受按键来控制,
我们给D1到D4闪烁的时段,定义出不同的ID号:D1在闪烁时,ID=0;D2在闪烁时,ID=1;D3在闪烁时,ID=2;D
4在闪烁时,ID=3;很显然,只要每次按下按键时,分别给出不同的ID号我们就能够完成上面的任务了。一键多功能按键识别程序矩阵
式键盘设计与实现4X4小键盘,16个键分别对应0~9、A~F;有键按下,数码管显示;无键按下,数码管无显示;通过输出的列码
和读取的行码来判断按下什么键;有键按下,要有一定的延时,防止由于键盘抖动而引起误操作。矩阵式键盘电路键盘的结构与原理矩阵
式键盘单片机系统中,若使用按键较多时,通常采用矩阵式键盘,其结构如下图所示。由图可知,一个4×4的行、列结构,可以构
成一个含有16个按键的键盘,节省了很多I/O口。控制方式:先判断是否有键按下。如有,再判断哪一键按下,并得到
键码值,然后根据键码值转向不同的功能程序。最常用的识别方法是键盘扫描法。判断按键按下的方法判断是
否有键按下的方法是:向所有的列输出口线输出低电平(不能为高电平,因为若为高电平,按键按下与否都不会引起行线电平的变化),然后将
行线的电平状态读入。若无键按下,所有的行线仍保持高电平状态;若有键按下,行线中至少应有一条线为低电平。例如:第2行与第
2列交叉点的键被按下,则第2行与第2列导通,第2行电平被拉低,读入的行信号就为低电平,表示有键按下。识别按键的方法按键识别
的扫描方法:往列线上按顺序一列一列的送出低电平。先送第0列为低电平,其他列为高电平,读入的行的电平状态就表明了第0列的4个键的
情况,若读入的行值全为高电平,则表示无键按下;再送第1列为低电平,其他列为高电平,读入的行的电平状态则显示了该行上的4个按键的情
况;依次轮流给各列送出低电平,直至4列全部送完,再从第0列开始,依此循环。采用键盘扫描,我们再来观察第2行与第2列交叉点的键按
下时的判断过程,当第2列送出低电平时,读第2行为低电平,而其他列送出低电平时,读第2行却为高电平,由此即可断定按下的键应是第2行与
第2列交叉点的键。键盘扫描程序具体实现方法判断有无键按下去除按键的抖动求按键的键值判断闭合键是否释放判断有无
键按下P0.4~P0.7输出0,然后读P0口;若低4位P0.0~P0.3全为1,则键盘上没有键按下;若P0.0~P0.3不全
为1,则有键按下。while(tmp==0x0f)//循环判断是否有键按下{P0=0x0f;/
/所有列输出低电平tmp=P0;//读行信号}去除按键的抖动当判断到键盘上有键按下后;延时一段
时间再判断键盘的状态;若仍为有键按下状态,则认为有一个键按下,否则当作按键抖动来处理。delay10ms();//延时
10ms去抖P0=0x0f;//所有列输出低电平tmp=P0;//再次读键盘状态if(tm
p==0x0f)continue;//如果无键按下则认为是按键抖动,重新扫描键盘求按键的键值对键盘的列线进
行扫描,P0.4~P0.7循环输出1110、1101、1011和0111,依次读P0口,若低4位全为1,则断定该列上没有键按下;
否则,该列上就有键按下,并且就是行线为0,列线为0的交叉点,行号和列号按公式:rol4+col计算得到按下键的键值。例如,P
0.4~P0.7输出1101时,P0口的低四位读入的值为1011,不全为1,就可以断定有键按下,并且是第2行和第1列交叉点的键。于
是,该键的键值=2×4+1=9。按照相同的方法可以得到所有键的键值。如:return(rol4+col);判断闭合键是否释
放按键闭合一次只能进行一次功能操作,因此,等按键释放后才能根据键号执行相应的功能键操作。key=scan_key();//
有键按下,调用键盘扫描程序,并把键值送keywhile(k!=-1)
//判断闭合键是否释放,直到其释放{delay10ms();k=scan_key();}矩阵式键盘程序
程序要判断是否有2个或2个以上的键盘同时按下,以免键盘分析错误。16个按键分别为0~9、A~F,用数码管显示按下的按键。矩阵式
键盘程序工作模块11中断方式矩阵键盘独立式键盘识别键盘比较容易,编程也比较简单,很适合于功能键较少的单片机应用系统。独立
式键盘每一个按键上用一根口线,当按键较多时(超过8个)应采用矩阵式键盘。无论是否按键,CPU都要按时扫描键盘,而单片机应用系统工
作时,并非经常需要键盘输入。因此,很多扫描工作是不必要的,浪费了CPU的时间。为了提高CPU的工作效率,可以采用中断扫描工作方式
。中断的概念当CPU在执行程序时,由单片机内部或外部的原因引起的随机事件要求CPU暂时停止正在执行的程序,而转向执行一个用于处
理该随机事件的程序,处理完后又返回被中止的程序断点处继续执行,这一过程就称为中断。向CPU发出中断请求的来源,或引起中断的原因称
为中断源。中断源可分为两大类:一类来自单片机内部,称之为内部中断源;一类来自单片机外部,称之为外部中断源。中断源要求服务的请
求称为中断请求。中断的功能中断系统是指能实现中断功能的硬件和软件。中断系统的功能一般包括以下几个方面。进行中断优先级排队
实现中断嵌套自动响应中断实现中断返回中断的特点。可以提高CPU的工作效率实现实时处理处理故障进行中断优先级排队通常
,单片机中有多个中断源,设计人员能按轻重缓急给每个中断源的中断请求赋予一定的中断优先级。当两个或两个以上的中断源同时请求中断时,
CPU可通过中断优先级排队电路首先响应中断优先级高的中断请求,等到处理完优先级高的中断请求后,再来响应优先级低的中断请求。实现中
断嵌套CPU在响应某一中断源中断请求而进行中断处理时,若有中断优先级更高的中断源发出中断请求,CPU会暂停正在执行的中断服务程序
,转向执行中断优先级更高的中断源的中断服务程序,等处理完这个高优先级的中断请求后,再返回来继续执行被暂停的中断服务程序。这个过程称
为中断嵌套。自动响应中断中断源向CPU发出的中断请求是随机的。CPU总是在每条指令
的最后状态对中断请求信号进行检测。当某一中断源发出中断请求时,CPU能根据相关条件(如中断优先级、是否允许中断)进行判断,决定是
否响应这个中断请求。若允许响应这个中断请求,CPU在执行完相关指令后,会自动完成断点地址压入堆栈、中断矢量地址送入程序计数器PC
、撤除本次中断请求标志,转入执行相应中断服务程序。实现中断返回CPU响应某一中断源中断请求,转入执行相应中断服务程序,在执行中
断服务程序最后的中断返回指令时,会自动弹出堆栈区中保存的断点地址,返回到中断前的原程序中。中断方式矩阵键盘采用中断扫描工作方
式中断方式矩阵式键盘电路中断方式矩阵式键盘程序中断方式矩阵键盘电路中断方式矩阵键盘程序采用中断扫描工作方式,工作过程如下
:有按键按下时,产生中断请求,进入键盘扫描程序,并识别键码、显示,然后返回。无键按下时,不执行键盘扫描程序。中断扫描工作方式
键盘程序中断系统结构8051单片机的中断系统主要由与中断有关的4个特殊功能寄存器和硬件查询电路等组成。定时器控制寄存器TC
ON——主要用于保存中断信息。串行口控制寄存器SCON——主要用于保存中断信息。中断允许寄存器IE——主要用于控制中断的
开放和关闭。中断优先级寄存器IP——主要用于设定优先级别。硬件查询电路——主要用于判定5个中断源的自然优先级别。8051单
片机的中断源有五个,可分为三类。外部中断定时中断串行口中断中断系统结构外部中断外部中断是由外部原因(如打印机、键盘、控
制开关、外部故障)引起的,可以通过两个固定引脚来输入到单片机内的信号,即外部中断0(INT0)和外部中断1(INT1)。INT0
——外部中断0中断请求信号输入端,P3.2的第二功能。由定时器控制寄存器TCON中的IT0位决定中断请求信号是低电平有效
还是下降沿有效。一旦输入信号有效,即向CPU申请中断,并且硬件自动使IE0置1。INT1——外部中断1中断请求信号输入端,P3.
3的第二功能。由定时器控制寄存器TCON中的IT1位决定采用电平触发方式还是边沿触发方式。一旦输入信号有效,即向CPU申
请中断,并且硬件自动使IE1置1。定时中断定时中断是由内部定时(或计数)溢出或外部定时(或计数)溢出引起的,即定时器0(T0)
中断和定时器1(T1)中断。内部定时:当定时器对单片机内部定时脉冲进行计数而发生计数溢出时,即表明定时时间到,由硬件自动使T
F0(TF1)置1,并申请中断。外部定时:当定时器对单片机外部计数脉冲进行计数而发生计数溢出时,即表明计数次数到,由硬件自动使T
F0(TF1)置1,并申请中断。外部计数脉冲是通过两个固定引脚来输入到单片机内的。T0外部计数输入端——P3.4的第二功能。T
1外部计数输入端——P3.5的第二功能。串行口中断串行口中断是为接收或发送串行数据而设置的。串行中断请求是在单
片机芯片内部发生的。RXD——串行口输入端,P3.0的第二功能。当接收完一帧数据时,硬件自动使RI置1,并申请中
断。TXD——串行口输出端,P3.1的第二功能。当发送完一帧数据时,硬件自动使TI置1,并申请中断。定时器控制
寄存器TCONTCON的作用是控制定时器的启动与停止,并保存T0、T1的溢出中断标志和外部中断的中断标志。TCON的格式:
TCON8FH8EH8DH8CH8BH8A
H89H88H(88H)功能说明:TF1(TCON.7):定时器1溢出标志位。TR
1(TCON.6):定时器1启停控制位。TF0(TCON.5):定时器0溢出标志位。TR0(TCON.4):定时器0启、停控制
位。IE1(TCON.3):外部中断1请求标志位。IEl=1表示外部中断1向CPU申请中断。当CPU响应外部中断1的中断请求时
,由硬件自动使IE1清0(边沿触发方式)。定时器控制寄存器TCONIT1(TCON.2):外部中断1触发方式选择位。当IT
l=0时,外部中断1为电平触发方式。若采到低电平,则认为有中断申请,硬件自动使IEl置1;若为高电平,认为无中断申请或中断申请
已撤除,硬件自动使IEl清0。注意:CPU响应中断后硬件不能自动使IEl清0,也不能由软件使IEl清0,所以在中断返回前
必须撤消INT1引脚上的低电平,否则将再次响应中断造成出错。当ITl=1时,外部中断1为边沿触发方式。若在连续两个机器周期采样
到先高电平后低电平,则认为有中断申请,硬件自动使IEl置1,此标志一直保持到CPU响应中断时,才由硬件自动清0。注意:为
保证CPU在两个机器周期内检测到先高后低的负跳变,输入高低电平的持续时间至少要保持12个时钟周期。定时器控制寄存器TCONIE
0(TCON.1):外部中断0请求标志位。其功能同IE1。IT0(TCON.0):外部中断0触发方式选择位。其功能同IT1。
中断允许寄存器IE中断允许寄存器IE的作用是控制CPU对中断的开放或屏蔽以及每个中断源是否允许中断。IE的格式:I
EAFHACHABH
AAHA9HA8H(A8H)中断允许寄存器IE功能说明:EA(IE
.7):CPU中断总允许位。EA=1,CPU开放中断。每个中断源是被允许还是被禁止,分别由各中断源的中断允许位确定;EA=0,
CPU屏蔽所有的中断要求,称为关中断。ES(IE.4):串行口中断允许位。ES=1,允许串行口中断;ES=0,禁止串行
口中断。ET1(IE.3):定时器1中断允许位。ET1=1,允许定时器1中断;ETl=0,禁止定时器1中断。EX1(
IE.2):外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。ET0(IE.1):
定时器0中断允许位。ET0=1,允许定时器0中断;ET0=0,禁止定时器0中断。EX0(IE.0):外部中断0中断允许
位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。中断优先级寄存器IP中断优先级寄存器IP的作用
是设定各中断源的优先级别。IP的格式:IP
BCHBBHBAHB9HB8H(B8H)中断优
先级寄存器IP功能说明:PS(IP.4):串行口中断优先级控制位。PS=1,串行口为高优先级中断;PS=0,串行口为
低优先级中断。PT1(IP.3):定时器1中断优先级控制位。PT1=1,定时器1为高优先级中断;PTl=0,定时器1为
低优先级中断。PX1(IP.2):外部中断1中断优先级控制位。PX1=1,外部中断1为高优先级中断;PXl=0,外部中
断1为低优先级中断。PT0(IP.1):定时器0中断优先级控制位。PT0=1,定时器T0为高优先级中断;PT0=0,定
时器0为低优先级中断。PX0(IP.0):外部中断0中断优先级控制位。PX0=1,外部中断0为高优先级中断;PX0=0
,外部中断0为低优先级中断。中断处理过程中断响应中断处理中断返回中断响应CPU的中断响应条件CP
U响应中断必须首先满足以下三个基本条件。有中断源发出中断请求。中断总允许位EA=1。请求中断的中断源的中断允许位为1。在满
足以上条件的基础上,若有下列任何一种情况存在,中断响应都会受到阻断。CPU正在执行一个同级或高优先级的中断服务程序。正在执行的
指令尚未执行完。正在执行中断返回指令RETI或者对专用寄存器IE、IP进行读/写的指令。CPU在执行完上述指令之后,要再执行一
条指令,才能响应中断请求。中断响应中断优先级的判定中断源的优先级别分为高级和低级。几个同一优先级别的中断源同时向CPU请
求中断,首先响应自然优先级较高的中断源的中断请求。中断可实现两级中断嵌套。高优先级中断源可中断正在执行的低优先级中断服务程序。
同级或低优先级的中断不能中断正在执行的中断服务程序。中断响应中断响应过程首先,将相应的优先级状态触发器置1,以屏蔽同级别中断
源的中断请求;其次,硬件自动生成长调用指令(LCALL),把断点地址压入堆栈保护(但不保护状态寄存器PSW及其他寄存器内容);
然后将中断源对应的中断入口地址装入程序计数器PC中,使程序转向该中断入口地址,并执行中断服务程序。中断处理中断处理就是执行中
断服务程序,从中断入口地址开始执行,直到返回指令(RETI)为止。此过程一般包括三部分内容:一是保护现场;二是处理中断源的请求
;三是恢复现场。主程序和中断服务程序都会用到累加器A、状态寄存器PSW及其他一些寄存器。在执行中断服务程序时,CPU若用到上述
寄存器,就会破坏原先存在这些寄存器中的内容,中断返回,将会造成主程序的混乱。因此,在进入中断服务程序后,一般要先保护现场,然后再执
行中断处理程序,在返回主程序以前,再恢复现场。中断处理在编写中断服务程序时要注意以下几个方面。在中断入口地址区存放一条无条
件转移指令,转向中断服务程序的起始地址。若要求禁止更高优先级中断源的中断请求,应先用软件关闭CPU中断或屏蔽更高级中断源的中断
,在中断返回前再开放被关闭或被屏蔽的中断。在保护现场和恢复现场时,为了不使现场数据受到破坏而造成混乱,在保护现场之前要关中断,在
保护现场之后再开中断;在恢复现场之前关中断,在恢复现场之后再开中断。中断返回中断返回是指中断服务完成后,CPU返回到原程序的
断点(即原来断开的位置),继续执行原来的程序。中断返回通过执行中断返回指令RETI来实现,该指令的功能是首先将相应的优先级状态触
发器置0,以开放同级别中断源的中断请求;其次,从堆栈区把断点地址取出,送回到程序计数器PC中。因此,不能用RET指令代替RETI指
令。中断请求的撤除CPU响应某中断请求后,在中断返回前,应该撤消该中断请求,否则会引起另一次中断。不同中断源中断请求的撤除方
法是不一样的。定时器溢出中断请求的撤除CPU在响应中断后,硬件会自动清除中断请求标志TF0或TFl。串行口中断的撤除
在CPU响应中断后,硬件不能清除中断请求标志TI和RI,而要由软件来清除相应的标志。外部中断的撤除外部中断为边沿触发
方式时,CPU响应中断后,硬件会自动清除中断请求标志IE0或IEl。外部中断为电平触发方式时,CPU响应中断后,硬件会自动清除中
断请求标志IE0或IEl,但由于加到INT0或INT1引脚的外部中断请求信号并未撤除,中断请求标志IE0或IEl会再次被置1,所以
在CPU响应中断后应立即撤除INT0或INT1引脚上的低电平。一般采用加一个D触发器和几条指令的方法来解决这个问题。外部中断的
撤除电路由下图可知,外部中断请求信号直接加到D触发器的CP端,当外部中断请求的低电平脉冲信号出现在CP端时,D触发器的Q端置0,
INT0或INT1引脚为低电平,发出中断请求。在中断服务程序中开始的三条指令可先在P1.0输出一个宽度为2个机器周期的负脉冲,使D
触发器的Q端置1,然后由软件来清除中断请求标志IE0或IEl。中断系统的初
始化步骤开放CPU中断和有关中断源的中断允许,设置中断允许寄存器IE中相应的位。根据需要确定各中断源的优先级别,设置中断优先级
寄存器IP中相应的位。根据需要确定外部中断的触发方式,设置定时器控制寄存器TCON中相应的位。中断系统C语言编程定义中断服
务函数函数类型函数名(形式参数)[interruptn][usingm]n:中断编号m:寄存器组号
例:voidintersvr0(void)interrupt0using1实例:2个外部中断voidmain(void){P1=0xff;EA=1;IT0=1;EX0=1;IT1=1;EX1=1;while(1){delays();}}voidintersvr0(void)interrupt0using1{LED0=!LED0;}voidintersvr1(void)interrupt2using1{LED1=!LED1;}试一试用汇编完成技能拓展外部中断源的扩展利用外部中断0扩展4个外部中断IT0IE0IT1IE1TR0TF0TR1TF1EX0ET0EX1ET1ES——EAPX0PT0PX1PT1PS———0023H串行口中断001BH定时器T1中断0013H外部中断1000BH定时器T0中断0003H外部中断0中断入口地址中断源串行口中断4定时/计数1溢出中断3外部中断12定时/计数0溢出中断1外部中断00中断源中断编号单片机应用技术项目教程(C语言版)计算机科学系项目四键盘设计与实现教学目的掌握键盘的接口方法和编程方法。了解中断的基本概念和功能。掌握51单片机中断系统的结构和控制方式。掌握中断系统的中断处理过程。按键触点的机械抖动
献花(0)
+1
(本文系草戒指工作...首藏)