DSP系统中键盘处理的一种新方法
扫描二维码
随时随地手机看文章
郭 建 张新政 摘要:介绍了一种新的用于dsp系统中的键盘处理方法。与单片机系统中常用的程序扫描键盘处理方式相比,这种定时-计数的方法能够有效地节约系统开销,且对键盘处理快速可靠。
关键词:键盘处理;数字信号处理器;串行rom
1引言
在各种数字控制系统中,大多数都用键盘和led作为人机交互界面。一般地,键盘分为编码和非编码两种。编码方式的键盘要使用专门的硬件来识别按键,系统比较复杂且占用较多的硬件资源。实际应用中编码方式的键盘使用得越来越少,相应地大多数系统都采用非编码键,并用软件的方式对键盘进行扫描处理。文献[1]给出了单片机系统中三种软件扫描键盘的方法:(1)程序控制扫描方式;(2)定时扫描方式;(3)中断扫描方式。(2)和(3)都要占用单片机系统中的资源,故而大多数单片机控制系统都采用程序控制扫描方式来处理键盘。
近年来,dsp以其高速处理能力、高集成度、资源丰富、应用灵活等优点而在许多领域中得到了越来越广泛的应用。在数字控制领域目前用得最多的是ti的c2000系列dsp。dsp系统中可以采用程序控制扫描方式对键盘进行处理,但如果沿用单片机系统中常用的程序控制扫描方式会有很大的不足——失去了dsp控制系统的快速性。本文介绍了dsp系统一种新的程序控制扫描方式。
2两种不同的程序扫描方式
我们知道按键在接通与断开的瞬间都会产生抖动,为了避免因干扰信号造成的键盘误处理以及对同一按键的多次处理,都要进行时间长短不等的延时扫描,一般经过10~30ms的延时后再对键盘进行处理。其流程图如图1所示。在这种程序扫描模式下,延时去抖动的20ms内程序不能做其它工作。对基于单片机的要求处理速度不高的系统来说这种方法是可以容忍的,但是对基于dsp的高速处理系统,20ms延时却是一个很大的浪费。下面以图2所示的系统简图为例,介绍一种新的用在dsp系统中的键盘处理方法,采用此方法可以大大减少程序扫描键盘时的时间,从而为系统其它任务节约时间。
新的键盘处理方式采用定时-计数的方法来实现。程序流程图如图3示。定时由dsp系统内部定时器来实现。定时时间可根据实际需要来设定,在此设置为1ms。计数则可通过在ram区设定计数器变量ct20ms来实现。有时候为了尽量少地设置按键,而使某些键具有双重功能。也就是说用户正常按某一按键keyi,程序处理keyi的第一功能;用户长时间(比如大于1秒)则处理keyi的第二功能。例如在我们将key1设置为add键,正常情况下,每按一次所设置的参数加1,如果按add键超过1秒则参数值加10;将key2设置为停止/清故障标志键,正常情况下按key2则系统停止运行,按key2超过1秒则清除系统因故障/保护而出现的标志位。用图1中程序扫描方法是不能实现单键双重功能的,而采用图3中的定时-计数方法却是能够做到的。
相关变量定义及键盘处理子程序如下:
.include“f240regs.h”
.bssct20ms,1
.bssct1sec,1
.bsskeyvalue,1
.bsskeyprogaddr,1
flag.setbit15...
.text
;定时-计数法键盘扫描子程序
keyroutine:
ldp#pbdatdir>>7;读iopb
laclpbdatdir
and#0fh
ldp#keyvalue
saclkeyvalue;存键值
xor#0fh
bcndkeypressed,neq
nokeypressed:
splk#00h,ct20ms
splk#00h,ct1sec
bendkeyroutine
keypressed:
ldp#ct20ms
bitct20ms,flag
bcndcheck1sec,tc
laclct20ms
add#1
saclct20ms
sub#20
bcndendkeyroutine,lt
splk#8000h,ct20ms;置标志位并清
;计数器为0
bjudgekey
check1sec:;是否到1秒?
ldp#ct1sec
laclct1sec
add#1
saclct1sec
sub#1000
bcndendkeyroutine,lt
splk#8000h,ct1sec
judgekey:
ldp#keyvalue
laclkeyvalue;键值范围:06-0eh
sub#6
add#keytable
tblrkeyprogaddr
laclkeyprogaddr
bacc
keytable.wordkey1prog
.wordkey2prog
…
.wordkey9prog
endkeyroutine:
ret
key1键处理程序如下,两个功能可根据实际需求来编写。
key1prog:
ldp#ct1sec
bitct1sec,flag
bcndkey1func2,tc
key1func1:
…;key1的第一功能
bendkeyroutine
key1func2:
…;key1的第二功能
bendkeyroutine
对上述程序有几点需要说明,首先,按照本程序所实现的按键的第一功能和第二功能两者不能相互冲突,且第二功能只有在第一功能完成一次以后才能实现。对于单一功能的键只须在其相应程序的开始之处置判断ct20ms标志位是否为1语句,如果ct20ms.flag=1则直接返回,不再重复处理。其次,第二功能可执行一次(从图3中的y*处直接返回)也可执行多次(从图3中的y**处再次调用功能2处理程序)。上文所述的key1键可以设置是允许多次执行,从而实现连续加10功能;而key