APP下载

脉宽编码式按键接口的设计

2004-03-14郝丽宏

电子世界 2004年2期
关键词:子程序脉冲中断

郝丽宏 林 凌 李 刚

传统的键盘接口方式,键盘编码控制芯片都要占用单片机两根以上的I/O口线,且专用键盘编码控制芯片的价格不菲。本文提出了脉宽编码式按键的设计思想,并给出了已经调试通过的一种脉宽编码式按键的具体设计方案。

1.设计思想及几种典型的硬件电路

脉宽编码式按键的设计灵感源于两方面:一是单片机具备测量脉冲宽度的能力。具体地说,单片机的定时器/计数器在方式寄存器TMOD的GATE位为1时可测定外部中断引脚上高电平的持续时间;二是从电路实现角度讲,可以方便地产生具有不同脉冲宽度的脉冲。这两个方面是实现脉宽编码式按键设计的理论基础。下面给出几种实用的产生脉冲的硬件电路:

图1是采用六施密特触发反相器74HC14构成的振荡器,只需要一只电阻和一只电容就可以构成一个最简单的多谐振荡器。如果系统中不需要74HC14片上的其它5个反相器,可以采用只有一个施密特触发反相器的芯片。

图2 所示为采用运放实现的低成本电路,采用线性积分电路构成多谐振荡器, 工艺简单,易于实现。

只要把上述电路中的电阻RK以图3中所示的电路取代,就可作为脉宽编码式按键的接口电路,脉宽大小取决于电阻值。

图4所示为采用片内带振荡器的14位二进制串行计数器74HC4060实现的脉宽编码式键盘接口电路原理图。由于采用外接石英晶体振荡器,所以分频器的输出脉宽是十分准确的,不需要任何调试就能够工作。但由于74HC4060输出端口有限,因而该电路适合于需要按键数量较少的场合,当然,只要在编程上稍下功夫,采用软按键技术(即将菜单和按键组合在一起的用户界面技术)就可以实现多个按键的功能。

需要说明的是:与单片机的时钟电路相似,也可以不用内部振荡器,而在11脚接入外部时钟,10脚悬空。这时可以把74HC4060换成74HC4020或者74HC4040,如图5为采用外部时钟由74HC4040实现的脉宽编码式键盘接口电路。

为了进一步降低成本,并提高测量脉宽的精度和稳定性,可以将单片机的系统时钟分频后提供给脉宽编码式键盘接口电路作输入脉冲,还可以采用外部时钟振荡器同时作为单片机的系统时钟和脉宽编码式键盘接口电路的时钟源。需要注意的是,单片机能够测量的最高频率不能超过其系统时钟的十二分之一。所以后者(采用外部时钟振荡器同时作为单片机的系统时钟和脉宽编码式键盘接口电路的时钟源)在实际使用时只能放弃几个按键不用,如图5中的K1~K4。

2.程序设计

根据脉宽编码式按键的设计思想,各脉宽编码式按键接口电路图中的引出端(TO)要与单片机INT0/INT1引脚相连。在保证单片机可分辨各按键脉宽的情况下,其它工作就留给程序设计了。

基于模块化编程思想,按键程序应当独立于程序中其它功能模块,负责查询按键状态(有效按下、已释放或未按下)并根据按键特征对按键编码(赋予不同按键不同的键值),以便于主程序区分各个按键而转入相应键处理子程序中。下面以用51单片机定时器T0测INT0脚输入脉冲宽度为例,介绍具体的编程思路。

首先,主程序中要先进行初始化:设置定时器/计数器T0工作在16位定时器模式,打开选通门以使INT0引脚电平和TR0一起参与对T0/T1的控制,设置外部中断INT0为边沿触发方式等等,具体程序见本刊网站。

然后编制外部中断服务程序。下降沿触发中断,进入中断服务程序后:(1)保护现场;(2)关闭定时器和外部中断以免低电平时间太短时未出中断又继续计数或者再次触发中断;(3)然后读取定时器时间。由于T0在GATE=1时是启动定时器有效(TR0=1)并且INT0引脚为高电平时才工作,所以中断触发时定时器时间(TH0、TL0)恰好就是之前INT0脚脉冲的宽度;(4)根据TH0、TL0判断出哪个按键被按下,赋键值;(5)把定时器TH0、TL0清零;(5)判断此时INT0引脚是不是低电平,是则启动定时器、使能中断,不是则等待。这样做是为了避免出现因为此时INT0引脚已经是高电平而一旦启动了定时器(TR0=1)它就开始计时以至于下次中断得到的定时器时间(TH0、TL0)不真实;(6)恢复现场,中断返回。

步骤4中对按键的区别取决于具体电路,如图1、图2结合图3所示的电路输出的脉宽是等差的,而图4、5、6是等比的。前者在单片机所直接测量的范围内可以有较多的按键,但脉宽的精度较低,而后者的键值有限,少于16位键,但脉宽(键值)测量精度较高,特别是与单片机采用同一时钟源时,可以认为没有误差。因而这两类的键值处理程序略有不同:虽然都需要允许脉宽有一定的范围,但前者的程序要复杂一些,去判定是否落在一个给定的误差范围内;后者由于误差较小,而键值间距较大,可以简单地按“位”判断即可。下面举例说明这两种典型情况下的编程:

假定有255个键,通过适当的参数设置使K255按下时脉宽等于51单片机的256个指令周期(系统时钟频率为12MHz时一个指令周期等于1ms),K254按下时脉宽等于512个指令周期……,K1按下时脉宽等于65280个指令周期,相邻两键脉宽的差值为256个指令周期。按照上述的设计,脉宽比较时只需比较定时器高位字节即可。由于脉宽最小为256μs,和键盘电路的输出脉冲基本上为50%的占空比,所以,在键盘电路的输出低电平期间完全可以完成键值(脉宽)处理程序的执行,因而可以把键值(脉宽)处理程序放在中断服务子程序中执行而不会影响脉宽的测量。键值有效时设置标志位KF0=1。假定等比键值的键盘接口电路有8个按键,并使得脉宽最小值为256个指令周期,相邻分布。等差键值(脉宽)及等比键值(脉宽)的处理程序见本刊网站。

以上介绍的6个步骤是最基本的操作,还不足以保证按键信息的有效性。由于按键是利用机械触点的合、断作用,因此,键的按下与抬起都会有10~20ms的抖动毛刺存在。为了获取稳定的按键信息,必须去除抖动影响,这也是按键处理的重要环节。去抖动的方法有硬件、软件两种。传统按键接口电路通常用判断口线电平来确定按键被按下与否,所以最常用的去抖动方法是一旦检测到按键可能被按下就先延时10~20ms然后再读口线状态确定按下与否以及哪个键被按下。类似地,按键释放与否也是在执行完相应键功能子程序后读取口线状态来确定。

在脉宽编码式按键电路中抖动表现为脉冲宽度的不一致,因而去抖动的方法是在中断服务程序中判断此次测得的定时器时间(TH0、TL0)是否与上一次相等,相等则有效,不等则认为是干扰或者原按键已经释放而新的按键被按下,更新定时器时间暂存单元。为了提高测量精度,设定计数器N,若连续n次测得的定时器时间(TH0、TL0)都相等,则认为按键有效,计数器N清零、赋键值、按键有效标志置1;若不足n次就发生变化,则认为按键无效,清空按键有效标志。需要注意的是,要允许一定的测量误差存在,只要不影响按键的识别即可。

3.一个已经调试通过的应用实例

笔者设计了图6所示的应用实例电路,其中MSC1210是TI公司生产的51兼容的单片机,具有增强型51内核,其ALE信号作为分频器74HC4060(用4040或者4020除引脚序号不一样外无区别)的输入时钟源信号,出于实际需要只用了5个按键。测试程序用单片机C语言编写,在Keil_C7.01上调试通过,并由MSC1210的串口下载工具下载到单片机里,图7为其主程序流程图、图8为中断子程序流程图,在本刊的网站上给出了源程序,供读者参考。

该程序的执行结果是:按图6中的K1~K5键则输出小写字母e~a,按一次键输出一次。如果用户想把某个按键作为连续触发键(即按键按下较长时间后才抬起,虽然键闭合一次,但CPU却进行多次键输入处理)使用,只要稍微改变主程序中键处理子程序即可。例如:***行{}中加入下列语句:do{fun();}while(KF0==0);则只要按住K1键不放就反复执行fun()函数。要做成软按键也只要进行嵌套即可。

猜你喜欢

子程序脉冲中断
TMS320F28335外部中断分析与研究
超快脉冲激光器提高数据传输速度
雪后林鸟
应用子程序车削梯形螺纹方法
跟踪导练(二)(5)
在数控车床上加工软轴零件
数控车床加工螺纹编程方法探讨
大射电
基于脉冲反射法电缆故障定位脉冲源的设计
新闻浮世绘