范志诚,刘爱华
(河源理工学校 机电教学部,河源 517000)
只有正确检测到按键,才能正确实现手机相应的功能。按键检测程序的架构是否合理及严谨,对产品的稳定性具有至关重要的意义。通过检测某手机按键功能,发现手机的按键检测程序存在一定的缺陷。本文借助Sonix公司的SN8P2602B单片机,探讨一种按键检测程序的软件架构,并给出了具体实现方案。
该手机采用传统的机械式按键,而检测的按键只限制在12个按键范围内,如图1所示。
在解锁后,分别按下某一按键,持续2s,然后松手。
检测结果:
① 1、2、3、4、5、6、7、8、9、0共10个按键,按下后经过很短时间(小于1s),均在屏幕上显示出相应数字,3s后松手,数字不变。
② *、#共2个按键,在按下2s松手后,才在屏幕上显示出相应的符号。
图1
在解锁后,按下某一按键,不松手,然后去按其他剩下的11个按键。
检测结果:
① 以按下“1”键为例,如图2所示。
图2
② 以按下“2”键为例,如图3所示。
图3
对其他按键进行测试,有类似的结果,规律如图4所示。
图4中,对于同一列按键,先按住其中一个按键,会产生两种情况:
① 再按同列中的其他任何一个按键,屏幕上显示的都是先按住的那个按键;
② 再按不同列的其他任何一个按键,屏幕上显示的都是正确的按键。
即:先按住“1”不放,再按同列的“4”、“7”、“*”,屏幕都显示成“1”;若再按不同列的“2”、“3”、“5”、“6”、“8”、“9”、“0”、“#”,则屏幕均显示正确的相应按键。
同时,还出现一个新的问题:先按住某一按键不放,然后再按其他11个按键,11个按键在按下后经过很短时间(小于1s),均在屏幕上显示出数字或符号。“*”和“#”键都没有像检测项目1中那样需要放手后才能显示出来的情况。
图4
(1)检测项目1的结果说明
12个按键分两类情况:一类是持续某短暂时间就认定按键有效,一类是需松手后才认定有效。软件对两类情况相应的按键进行检测后判定按键有效的标准是不一致的。
(2)检测项目2的结果说明
12个按键分两类情况,软件对两类情况相应的按键进行检测后判定是什么按键,标准是不一致的,同一列的按键存在互相干扰的问题。
从如下两点作为切入口来解决以上出现的问题。
① 针对检测结果1的解决思路:设置小时间段Tcheck,在Tcheck时间内软件循环检测按键得到相同按键代码,即判定该按键按下有效,统一标准,便可解决判定有效的标准不一的问题。
② 针对检测结果2的解决思路:设置成某按键按下后,若此按键不松开,其他按键则无效,便可解决按键间存在干扰的问题。
下面将借助SN8P2602B单片机,以16个按键为例,给出软件解决方案,并给出具体的汇编语言源程序。SN8P2602B引脚图如图5所示。16个按键原理图如图6所示。图中,P5所有口线均用软件设置内部上拉电阻。
16个按键检测方式:
① 把P5[0~3]设置为输出口并输出“0”信号,P5[4~7]设置为输入口并置“1”,保存输入信号;
② 把P5[4~7]设置为输出口并输出“0”信号,P5[0~3]设置为输入口并置“1”,保存输入信号;
图5
图6
③ 把两次保持的输入信号合并,就可以得到按键的唯一代码,而无按键按下的代码为11111111。
按键的唯一代码如图7所示。
图7
按键检测程序如图8所示。
图8
KEY_DOWN标志位:当代码为无按键按下的代码时,置0。在后续程序中,需要判断是否为有效代码,或是多个按键同时按下产生的代码,或是受外界电磁干扰信号影响而产生的代码。
KEY_STILL_PRESS标志位:按键仍然按下,未松开标志位,松开则置0。不论是有效代码、多个按键同时按下的代码,还是干扰信号产生的代码,若不松开或不结束,都认为是未松手,置1。
KEY_TIME_CHECK标志位:设置小时间段Tcheck为50ms,置0代表时间未到,置1代表时间到。若计时中途按键松开,则重新计时。产生代码经过50ms后,便开始比对是否为有效代码。
软件代码如下:
按键检测程序的逻辑性及严谨性,对产品的稳定性具有至关重要的意义。本文借助Sonix公司的SN8P2602B单片机,针对某手机按键检测程序缺陷提出了解决方案,并给出了相应的软件架构和代码。此按键检测思路具有通用性,可以移植到其他带按键的电子产品中。
[1]Sonix Technology Co.,Ltd.SN8P2602B8-bit MCU DATASHEET.Version 1.2,2008-05.
[2]Sonix Technology Co.,Ltd.SONIX 8-bit MCU INSTRUCTION SET.Version 1.93,2003-02.
[3]张玉杰.松翰SN8P2700系列单片机原理及应用技术[M].北京航空航天大学出版社,2008.