|
|
摘要:介绍了一种新的用于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”
.bss?ct20ms,1
.bss?ct1sec,1
.bss?KeyValue,1
.bss?KeyProgAddr,1
flag?.set?BIT15?...
.text
;?定时-计数法键盘扫描子程序
KeyRoutine:
LDP?#PBDATDIR>>7?;读IOPB
LACL?PBDATDIR
AND?#0Fh
LDP?#KeyValue
SACL?KeyValue?;存键值
XOR?#0FH
BCND?KeyPressed,?NEQ
NoKeyPressed:
SPLK?#00h,?ct20ms
SPLK?#00h,?ct1sec
B?EndKeyRoutine
KeyPressed:
LDP?#ct20ms
BIT?ct20ms,?flag
BCND?Check1sec,?TC
LACL?ct20ms
ADD?#1
SACL?ct20ms
SUB?#20
BCND?EndKeyRoutine,?LT
SPLK?#8000h,?ct20ms;置标志位并清
;计数器为0
B?JudgeKey
Check1Sec:?;是否到1?秒??
LDP?#ct1sec
LACL?ct1sec
ADD?#1
SACL?ct1sec
SUB?#1000
BCND?EndKeyRoutine,?LT
SPLK?#8000h,ct1sec
JudgeKey:
LDP?#KeyValue
LACL?KeyValue?;键值范围:?06-0Eh
SUB?#6
ADD?#KeyTable
TBLR?KeyProgAddr
LACL?KeyProgAddr
BACC
KeyTable?.word?Key1Prog
.word?Key2Prog
…
.word?Key9Prog
EndKeyRoutine:
RET
Key1键处理程序如下,两个功能可根据实际需求来编写。
Key1Prog:
LDP?#ct1sec
BIT?ct1sec,?flag
BCND?Key1Func2,?TC
Key1Func1:
…?;Key1的第一功能
B?EndKeyRoutine
Key1Func2:
…?;Key1的第二功能
B?EndKeyRoutine
对上述程序有几点需要说明,首先,按照本程序所实现的按键的第一功能和第二功能两者不能相互冲突,且第二功能只有在第一功能完成一次以后才能实现。对于单一功能的键只须在其相应程序的开始之处置判断ct20ms标志位是否为1语句,如果ct20ms.flag=1则直接返回,不再重复处理。其次,第二功能可执行一次(从图3中的Y*处直接返回)也可执行多次(从图3中的Y**处再次调用功能2处理程序)。上文所述的Key1?键可以设置是允许多次执行,从而实现连续加10功能;而Key2键的第二功能清故障状态位不必多次执行,只须执行一次即可。第三,如果不需要设置第二功能,则程序只须从Y**处直接返回即可,这样能够有效地防止重复处理按键。本文提出的定时-计数延时法和单键双重功能处理方法已经在实际系统中得到了很好的应用。
3?定时-计数延时法在写入I2C
ROM中的应用
I2C?EEPROM?具有在线写入数据和无须掉电保护电路等特点,在许多单片机系统中都用到了这类ROM,比如CAT24WCxx,X5043/45,?CSI93C46/56等等。这些I2C?EEPROM同样可以用在DSP系统中。它们在读写时的一个共同点是:在写完以后要等待写入完成状态位,直到检测到此状态位标志后才退出写入程序。这种等待写入完成状态实质上也是一种延时。当要写入的数据较多时就需要较长的延时时间。本文提出的定时-计数的方法同样可以用到I2C?ROM的写入程序中。
|
|