楊永明
(湖北民族學(xué)院 理學(xué)院,湖北 恩施 445000)
在儀器儀表中,經(jīng)常需要設(shè)置一些參數(shù).在硬件設(shè)計方案上,很多儀表采用三按鍵的硬件方案,如圖1所示,即一個功能鍵,一個上調(diào)鍵,一個下調(diào)鍵.功能鍵用來選擇要設(shè)置的參數(shù),上調(diào)和下調(diào)鍵分別用來使參數(shù)增加和減少.在軟件設(shè)計方案上,常常采用兩種方案(以增加參數(shù)值為例):一種方案是功能鍵按下并抬起一次,選擇一個要設(shè)置的參數(shù),然后按下并抬起上調(diào)鍵,被設(shè)置的參數(shù)增加某一值.當(dāng)被設(shè)置的參數(shù)值范圍比較大時,這種方案就顯得費時費力.另一種方案是功能鍵按下并抬起一次,選擇一個要設(shè)置的參數(shù),按下上調(diào)鍵時,參數(shù)值開始以某一速度不斷增加.若增加的速度慢,則當(dāng)被設(shè)置的參數(shù)值范圍比較大時,這種方案費時;若增加的速度快,則這種方案很難準(zhǔn)確地將參數(shù)設(shè)置成某一特定值[1~3].
圖1 三按鍵硬件電路
針對上述問題,少數(shù)儀表廠家的解決方法是:設(shè)置兩個上調(diào)鍵,其中一個按鍵作為單次增加按鍵,即按下并抬起該鍵,被設(shè)置的參數(shù)增加某一值;另一個按鍵作為連續(xù)增加按鍵,即按下該鍵,被設(shè)置的參數(shù)連續(xù)增加,抬起時停止增加.這種方案解決了上述參數(shù)設(shè)置費時費力的問題,但當(dāng)前很多儀表在功能上和體積上都有很高要求, CPU的IO口顯得緊缺,所以這種方案受到儀表硬件資源和體積的限制.
本文提出了一種方案,在不多占用CPU的IO口的情況下解決了上述問題.當(dāng)按下并在規(guī)定時間(可在程序中修改)內(nèi)抬起上調(diào)鍵,被設(shè)置的參數(shù)增加某一值,當(dāng)按下上調(diào)鍵超過規(guī)定時間后,參數(shù)值開始連續(xù)快速增加(增加速度可在程序中可修改),此過程中若抬起該鍵,參數(shù)值則停止增加.當(dāng)要將參數(shù)設(shè)置為某一特定值時,可以先按下上調(diào)鍵讓參數(shù)連續(xù)增加,當(dāng)參數(shù)接近該值時抬起按鍵,然后單次反復(fù)按上調(diào)鍵,直到參數(shù)值變?yōu)檫@一特定值.
圖2 設(shè)計思路
圖3 程序流程
實現(xiàn)一個按鍵使值既能單次增加又能連續(xù)增加的基本思路是:設(shè)置一個時間閥門,當(dāng)按下鍵的保持時間未超過時間閥值時,程序執(zhí)行單次增加動作;當(dāng)按下鍵的保持時間超過時間閥值時,程序執(zhí)行連續(xù)增加動作直到按鍵抬起.此過程可用圖2表示[4,5].
完成該功能最核心的部分在于對按鍵按下后的保持時間進(jìn)行計時,根據(jù)保持時間的不同來決定執(zhí)行值的單次增加或連續(xù)增加.因此,我們可以定義一個變量key_keep_timer,用來記錄按鍵按下的保持時間.另外需要定義一個參數(shù)增加方式的標(biāo)志auto_value_change_f,用來記錄當(dāng)前參數(shù)增加的方式是單次增加(auto_value_change_f為0時)還是連續(xù)增加(auto_value_change_f為1時),默認(rèn)為單次增加.程序每次檢測到按鍵為松開狀態(tài)時,會對key_keep_timer進(jìn)行初始化,執(zhí)行判斷按鍵的程序時,若按鍵狀態(tài)為按下,則key_keep_timer不斷減1,當(dāng)key_keep_timer減到零后置位auto_value_change_f,即按鍵按下后的保持時間已經(jīng)達(dá)到時間閥值,參數(shù)增加方式變?yōu)檫B續(xù)增加.此后程序只要檢測到auto_value_change_f為1,則參數(shù)值就加1[6,7].
在參數(shù)連續(xù)增加的過程中若檢測到按鍵松開,則復(fù)位auto_value_change_f將參數(shù)增加方式變?yōu)閱未卧黾?需要注意的是在參數(shù)連續(xù)增加模式下,需要定義一個參數(shù)增加快慢的計時變量(連續(xù)增加間隔計數(shù)器),用它來決定參數(shù)增加的快慢.
在對按鍵按下保持時間進(jìn)行計時的過程中,若按鍵松開,則停止計時并直接使參數(shù)加1,完成單次參數(shù)的增加.
程序流程圖如圖3,其中up_key為上調(diào)按鍵輸入引腳,10 ms延時用來去抖動.
完成該功能的程序代碼如下,代碼采用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)//當(dāng)按鈕按下并且加減狀態(tài)不是自動狀態(tài)時,開始計時,計時到時開始自動加減
{
if(key_keep_time1--==0) //按鍵連續(xù)按下3s計時
{
key_keep_time1=20;
if(key_keep_time2--==0)
{
key_keep_time2=20;
if(key_keep_time--==0) //自動加減計時到時,把自動加減標(biāo)志置1
{
auto_value_change_f=1;
}
}
}
}
if(up_k==1) //在自動加減過程中,松開按鈕后,恢復(fù)正常狀態(tài)
{
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)//自動加減狀態(tài)時,兩次加減之間會有延遲,延遲時間到后加1
{
button_delay=button_delay_time;
s1+=1; //參數(shù)加1
}
}
本程序的驗證過程在89c51單片機上進(jìn)行,單片機系統(tǒng)外圍器件有4位LED顯示及兩個按鍵,LED用來實時顯示參數(shù)值,兩個按鍵分別用來調(diào)節(jié)參數(shù)增加和參數(shù)減少.需要修改的參數(shù)為s1,修改范圍為1~1000.在實驗前編寫了3段程序,第一段程序中按鍵只有單次增加和減少功能;第二段程序中按鍵只有連續(xù)增加和減少功能,為了能精確設(shè)置某一具體參數(shù),將參數(shù)增加一次的時間設(shè)置為0.3 s;第三段程序按本文所提出的方法進(jìn)行設(shè)計,連續(xù)增加時,參數(shù)增加一次的時間為0.03 s.分別用三段程序進(jìn)行實驗,將s1從1調(diào)整到499,得出的實驗結(jié)果如表1.
表1 實驗結(jié)果
從實驗結(jié)果可以看出,若參數(shù)變化范圍較大、按鍵同時具備單次增加和連續(xù)增加功能時,將大大節(jié)省參數(shù)設(shè)置時間.
[1]周燕玲,王羨欠.工業(yè)控制中通用型智能儀表系統(tǒng)設(shè)計[J].微計算機信息,2008,31(24):154-155,160.
[2]劉紅然.高爐系統(tǒng)的儀表設(shè)計[J].自動化與儀器儀表,2009(5):71-72,93.
[3]彭照輝,蘇娟,扶忠權(quán).基于TDK71M6513的智能儀表設(shè)計[J].計算機系統(tǒng)應(yīng)用,2009,18(7):206-209.
[4]劉???新型數(shù)字化稱重儀表設(shè)計[J].科技信息,2009(12):69-70.
[5]王雁平,張永春.基于CAN總線的現(xiàn)場總線儀表設(shè)計[J].常州工學(xué)院學(xué)報,2009,22(1):27-30.
[6]梁東凱,張發(fā)存.SOCDMMU中核心部件的軟件實現(xiàn)方法[J].計算機工程,2009,35(22):253-255.
[7]許新山,汪漢良.CRC算法的軟件實現(xiàn)研究[J].高等函授學(xué)報:自然科學(xué)版,2002,15(2):48-50,53.
[8]吳澤民,王俊,王景.利用單片機產(chǎn)生PWM信號的軟件實現(xiàn)方法[J].機電技術(shù),2008,31(1):20-21.