单按键值的单次增加和连续增加的软件实现
2010-01-18杨永明
杨永明
(湖北民族学院 理学院,湖北 恩施 445000)
在仪器仪表中,经常需要设置一些参数.在硬件设计方案上,很多仪表采用三按键的硬件方案,如图1所示,即一个功能键,一个上调键,一个下调键.功能键用来选择要设置的参数,上调和下调键分别用来使参数增加和减少.在软件设计方案上,常常采用两种方案(以增加参数值为例):一种方案是功能键按下并抬起一次,选择一个要设置的参数,然后按下并抬起上调键,被设置的参数增加某一值.当被设置的参数值范围比较大时,这种方案就显得费时费力.另一种方案是功能键按下并抬起一次,选择一个要设置的参数,按下上调键时,参数值开始以某一速度不断增加.若增加的速度慢,则当被设置的参数值范围比较大时,这种方案费时;若增加的速度快,则这种方案很难准确地将参数设置成某一特定值[1~3].
图1 三按键硬件电路
针对上述问题,少数仪表厂家的解决方法是:设置两个上调键,其中一个按键作为单次增加按键,即按下并抬起该键,被设置的参数增加某一值;另一个按键作为连续增加按键,即按下该键,被设置的参数连续增加,抬起时停止增加.这种方案解决了上述参数设置费时费力的问题,但当前很多仪表在功能上和体积上都有很高要求, CPU的IO口显得紧缺,所以这种方案受到仪表硬件资源和体积的限制.
本文提出了一种方案,在不多占用CPU的IO口的情况下解决了上述问题.当按下并在规定时间(可在程序中修改)内抬起上调键,被设置的参数增加某一值,当按下上调键超过规定时间后,参数值开始连续快速增加(增加速度可在程序中可修改),此过程中若抬起该键,参数值则停止增加.当要将参数设置为某一特定值时,可以先按下上调键让参数连续增加,当参数接近该值时抬起按键,然后单次反复按上调键,直到参数值变为这一特定值.
图2 设计思路
图3 程序流程
1 设计思路
实现一个按键使值既能单次增加又能连续增加的基本思路是:设置一个时间阀门,当按下键的保持时间未超过时间阀值时,程序执行单次增加动作;当按下键的保持时间超过时间阀值时,程序执行连续增加动作直到按键抬起.此过程可用图2表示[4,5].
2 设计过程
完成该功能最核心的部分在于对按键按下后的保持时间进行计时,根据保持时间的不同来决定执行值的单次增加或连续增加.因此,我们可以定义一个变量key_keep_timer,用来记录按键按下的保持时间.另外需要定义一个参数增加方式的标志auto_value_change_f,用来记录当前参数增加的方式是单次增加(auto_value_change_f为0时)还是连续增加(auto_value_change_f为1时),默认为单次增加.程序每次检测到按键为松开状态时,会对key_keep_timer进行初始化,执行判断按键的程序时,若按键状态为按下,则key_keep_timer不断减1,当key_keep_timer减到零后置位auto_value_change_f,即按键按下后的保持时间已经达到时间阀值,参数增加方式变为连续增加.此后程序只要检测到auto_value_change_f为1,则参数值就加1[6,7].
在参数连续增加的过程中若检测到按键松开,则复位auto_value_change_f将参数增加方式变为单次增加.需要注意的是在参数连续增加模式下,需要定义一个参数增加快慢的计时变量(连续增加间隔计数器),用它来决定参数增加的快慢.
在对按键按下保持时间进行计时的过程中,若按键松开,则停止计时并直接使参数加1,完成单次参数的增加.
程序流程图如图3,其中up_key为上调按键输入引脚,10 ms延时用来去抖动.
3 程序代码
完成该功能的程序代码如下,代码采用C语言编写,代码中对按键按下后的保持时间计时用了3个变量,key_keep_time、key_keep_time1以及key_keep_time2[8].
if(up_k==0) //加按钮按下
{
delay10ms(); //防抖动
while(up_k==0&&auto_value_change_f==0)//当按钮按下并且加减状态不是自动状态时,开始计时,计时到时开始自动加减
{
if(key_keep_time1--==0) //按键连续按下3s计时
{
key_keep_time1=20;
if(key_keep_time2--==0)
{
key_keep_time2=20;
if(key_keep_time--==0) //自动加减计时到时,把自动加减标志置1
{
auto_value_change_f=1;
}
}
}
}
if(up_k==1) //在自动加减过程中,松开按钮后,恢复正常状态
{
key_keep_time=key_keep_time_const;
key_keep_time1=20;
key_keep_time2=20;
auto_value_change_f=0;
}
if(--button_delay==0||auto_value_change_f==0)//自动加减状态时,两次加减之间会有延迟,延迟时间到后加1
{
button_delay=button_delay_time;
s1+=1; //参数加1
}
}
4 运行效果对比
本程序的验证过程在89c51单片机上进行,单片机系统外围器件有4位LED显示及两个按键,LED用来实时显示参数值,两个按键分别用来调节参数增加和参数减少.需要修改的参数为s1,修改范围为1~1000.在实验前编写了3段程序,第一段程序中按键只有单次增加和减少功能;第二段程序中按键只有连续增加和减少功能,为了能精确设置某一具体参数,将参数增加一次的时间设置为0.3 s;第三段程序按本文所提出的方法进行设计,连续增加时,参数增加一次的时间为0.03 s.分别用三段程序进行实验,将s1从1调整到499,得出的实验结果如表1.
表1 实验结果
从实验结果可以看出,若参数变化范围较大、按键同时具备单次增加和连续增加功能时,将大大节省参数设置时间.
[1]周燕玲,王羡欠.工业控制中通用型智能仪表系统设计[J].微计算机信息,2008,31(24):154-155,160.
[2]刘红然.高炉系统的仪表设计[J].自动化与仪器仪表,2009(5):71-72,93.
[3]彭照辉,苏娟,扶忠权.基于TDK71M6513的智能仪表设计[J].计算机系统应用,2009,18(7):206-209.
[4]刘海俊.新型数字化称重仪表设计[J].科技信息,2009(12):69-70.
[5]王雁平,张永春.基于CAN总线的现场总线仪表设计[J].常州工学院学报,2009,22(1):27-30.
[6]梁东凯,张发存.SOCDMMU中核心部件的软件实现方法[J].计算机工程,2009,35(22):253-255.
[7]许新山,汪汉良.CRC算法的软件实现研究[J].高等函授学报:自然科学版,2002,15(2):48-50,53.
[8]吴泽民,王俊,王景.利用单片机产生PWM信号的软件实现方法[J].机电技术,2008,31(1):20-21.