|
最近寫代碼,涉及到按鍵修改參數(shù),就設(shè)計(jì)了由3個(gè)按鍵修改多個(gè)參數(shù)的程序設(shè)計(jì)。按鍵修改參數(shù),我以寫過(guò),但是有著很長(zhǎng)的代碼。最近寫了一個(gè)程序,個(gè)人感覺(jué)代碼量較少,適合使用。這里我選STC15F2K60S2單片機(jī)開(kāi)發(fā)板來(lái)寫Demo程序。
原理很簡(jiǎn)單,第一個(gè)按鍵是 調(diào)節(jié)+ 按鍵(程序IO口寫Add),第二個(gè)按鍵是 調(diào)節(jié)- 按鍵(程序IO口寫寫Sub),第二個(gè)按鍵是 切換 按鍵(程序IO口寫Exit),也就是切換要修改的參數(shù)。然后通過(guò)Exit按鍵修改Add和Sub調(diào)節(jié)的變量,從而達(dá)到修改參數(shù)。
預(yù)先定義3個(gè)要修改的變量和操作標(biāo)志位。- unsigned char Data1=0,Data2=0,Data3=0;
- unsigned char Handle = 1 ; //Handle 1:操作Data1,2:操作Data2,3:操作Data3
復(fù)制代碼
實(shí)現(xiàn)代碼分為3部分。
第一部分是Exit按鍵改變標(biāo)志(代碼如下)。Handle是標(biāo)志當(dāng)前修改的變量,1:操作Data1,2:操作Data2,3:操作Data3。當(dāng)按下Exit按鍵,則切操作標(biāo)志加1,到末端著回到第一個(gè),形成一個(gè)環(huán)形循環(huán)結(jié)構(gòu)。如果增加要修改的參量,要在這里加。
- if(Exit==0) //切換按鍵按下,操作位標(biāo)志改變
- {
- while(Exit == 0);//等待松手
- if(Handle ==1)
- {
- Handle=2;
- }
- else if(Handle == 2)
- {
- Handle=3;
- }
- else if(Handle == 3)
- {
- Handle=1;
- }
- }
復(fù)制代碼
第二部分是根據(jù)Handle把參量的地址傳入到修改函數(shù)。如果增加要修改的參量,也是要在這里加。
switch(Handle) //選擇修改指向
{
case 1:KeyAlterValue(&Data1);break; //Handle = 1,按鍵修改操作指針指向Data1
case 2:KeyAlterValue(&Data2);break; //Handle = 2,按鍵修改操作指針指向Data2
case 3:KeyAlterValue(&Data3);break; //Handle = 3,按鍵修改操作指針指向Data3
}
第三部分是調(diào)節(jié)函數(shù)。輸入?yún)?shù)是一個(gè)指針,也就是要調(diào)節(jié)的變量的地址。函數(shù)名void KeyAlterValue(unsigned char *Variate),代碼如下:
- void KeyAlterValue(unsigned char *Variate)
- {
- if(Add==0)
- {
- while(Add ==0); //等待松手,如果要長(zhǎng)按快速加,則注釋此句
- if((*Variate)<20) //設(shè)置調(diào)節(jié)上限為20
- (*Variate)++; //值加1
- }
- if(Sub==0)
- {
- while(Sub ==0); //等待松手,如果要長(zhǎng)按快速減,則注釋此句
- if(*Variate!=0) //設(shè)置調(diào)節(jié)下限為0,
- {
- (*Variate)--; //值減1
- }
- }
- }
復(fù)制代碼
整份代碼我都沒(méi)有設(shè)置消抖,都是直接等待松手,即類似while(Add ==0);
三部分代碼,前2部分直接扔大循環(huán)就可以實(shí)現(xiàn)3個(gè)按鍵修改多個(gè)參數(shù)。但是不能沒(méi)有顯示當(dāng)前修改的參數(shù)是什么,如果不用的話,也可以直接按一下Add或者Sub就可以知道。如果要顯示,請(qǐng)看我等下的解決辦法。對(duì)于按鍵輸入,我習(xí)慣開(kāi)個(gè)定時(shí)時(shí)間約為20ms~30ms的定時(shí)器中斷。然后把按鍵掃描或者按鍵操作的程序放進(jìn)定時(shí)器中斷中,這樣按鍵響應(yīng)是非常快的。但是定時(shí)器中斷不能跑時(shí)間很長(zhǎng)的代碼,原因你們應(yīng)該都懂得。這里我使用定時(shí)器0,設(shè)置20ms。
因?yàn)槭前存I操作,定時(shí)器中斷代碼如下。KeyAction()函數(shù)體集合第一部分和第二部分代碼。關(guān)閉定時(shí)器0中斷是防止還在處理按鍵的時(shí)候再次來(lái)中斷。重新裝初值是避免定時(shí)時(shí)間減少。
- void T0Service() interrupt 1
- {
- ET0 = 0; //關(guān)閉定時(shí)器0中斷
- TR0 = 0; //定時(shí)器0開(kāi)始計(jì)時(shí)
- KeyAction(); //修改參數(shù)
- TL0 = 0x00; //設(shè)置定時(shí)初值
- TH0 = 0x70; //設(shè)置定時(shí)初值
- TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
- ET0 = 1; //開(kāi)啟定時(shí)器0中斷
- }
復(fù)制代碼
至此,響應(yīng)很快的3個(gè)按鍵修改參量已經(jīng)可以完成。
上述是修改整形參數(shù)的,如果要修改浮點(diǎn)型的,請(qǐng)修改要修改的類型為float,然后把KeyAlterValue的類型也改為float在其內(nèi)部的自加語(yǔ)句改為需要按下增加的精度就好,Dome程序是以0.1為例,沒(méi)有松手等待。
|
評(píng)分
-
查看全部評(píng)分
|