欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機3個按鍵靈活修改多個參數(浮點與整數型) [打印本頁]

作者: 少年0508    時間: 2018-5-7 12:08
標題: 單片機3個按鍵靈活修改多個參數(浮點與整數型)
最近寫代碼,涉及到按鍵修改參數,就設計了由3個按鍵修改多個參數的程序設計。按鍵修改參數,我以寫過,但是有著很長的代碼。最近寫了一個程序,個人感覺代碼量較少,適合使用。這里我選STC15F2K60S2單片機開發板來寫Demo程序。
原理很簡單,第一個按鍵是 調節+ 按鍵(程序IO口寫Add),第二個按鍵是 調節- 按鍵程序IO口寫Sub),第二個按鍵是 切換 按鍵(程序IO口寫Exit),也就是切換要修改的參數。然后通過Exit按鍵修改Add和Sub調節的變量,從而達到修改參數。
預先定義3個要修改的變量和操作標志位。
  1. unsigned char Data1=0,Data2=0,Data3=0;
  2. unsigned char Handle = 1 ; //Handle  1:操作Data1,2:操作Data2,3:操作Data3
復制代碼

實現代碼分為3部分。
第一部分是Exit按鍵改變標志(代碼如下)。Handle是標志當前修改的變量,1:操作Data1,2:操作Data2,3:操作Data3。當按下Exit按鍵,則切操作標志加1,到末端著回到第一個,形成一個環形循環結構。如果增加要修改的參量,要在這里加。

  1.     if(Exit==0)        //切換按鍵按下,操作位標志改變
  2.     {
  3.     while(Exit == 0);//等待松手
  4.     if(Handle ==1)   
  5.     {
  6.         Handle=2;
  7.     }
  8.     else if(Handle == 2)   
  9.     {
  10.         Handle=3;         
  11.     }
  12.     else if(Handle == 3)   
  13.     {
  14.         Handle=1;            
  15.     }            
  16.     }
復制代碼



第二部分是根據Handle把參量的地址傳入到修改函數。如果增加要修改的參量,也是要在這里加。
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
}


第三部分是調節函數。輸入參數是一個指針,也就是要調節的變量的地址。函數名void KeyAlterValue(unsigned char *Variate),代碼如下:
  1. void KeyAlterValue(unsigned char *Variate)
  2. {
  3.     if(Add==0)
  4.     {
  5.         while(Add ==0);      //等待松手,如果要長按快速加,則注釋此句
  6.         if((*Variate)<20)    //設置調節上限為20
  7.         (*Variate)++;        //值加1
  8.     }
  9.     if(Sub==0)
  10.     {
  11.         while(Sub ==0);      //等待松手,如果要長按快速減,則注釋此句
  12.         if(*Variate!=0)      //設置調節下限為0,
  13.         {
  14.             (*Variate)--;    //值減1
  15.         }
  16.     }
  17. }
復制代碼

整份代碼我都沒有設置消抖,都是直接等待松手,即類似while(Add ==0);
三部分代碼,前2部分直接扔大循環就可以實現3個按鍵修改多個參數。但是不能沒有顯示當前修改的參數是什么,如果不用的話,也可以直接按一下Add或者Sub就可以知道。如果要顯示,請看我等下的解決辦法。對于按鍵輸入,我習慣開個定時時間約為20ms~30ms的定時器中斷。然后把按鍵掃描或者按鍵操作的程序放進定時器中斷中,這樣按鍵響應是非?斓摹5嵌〞r器中斷不能跑時間很長的代碼,原因你們應該都懂得。這里我使用定時器0,設置20ms。
因為是按鍵操作,定時器中斷代碼如下。KeyAction()函數體集合第一部分和第二部分代碼。關閉定時器0中斷是防止還在處理按鍵的時候再次來中斷。重新裝初值是避免定時時間減少。
  1. void T0Service() interrupt 1
  2. {
  3.     ET0 = 0;        //關閉定時器0中斷
  4.     TR0 = 0;                //定時器0開始計時   
  5.     KeyAction();    //修改參數      
  6.     TL0 = 0x00;                //設置定時初值
  7.     TH0 = 0x70;                //設置定時初值
  8.     TR0 = 1;                //定時器0開始計時   
  9.     ET0 = 1;        //開啟定時器0中斷
  10. }
復制代碼


至此,響應很快的3個按鍵修改參量已經可以完成。

上述是修改整形參數的,如果要修改浮點型的,請修改要修改的類型為float,然后把KeyAlterValue的類型也改為float在其內部的自加語句改為需要按下增加的精度就好,Dome程序是以0.1為例,沒有松手等待。


Dome程序 參數為浮點型.zip

50.43 KB, 下載次數: 40, 下載積分: 黑幣 -5

Dome程序 參數為整數.zip

45.82 KB, 下載次數: 52, 下載積分: 黑幣 -5


作者: Fraisty    時間: 2018-5-17 10:32
看看學習下
作者: denny1011    時間: 2018-7-13 09:23
這里的代碼如何寫?請教!
作者: liuzhaofeng    時間: 2018-8-10 12:57
好思路學些了,謝謝
作者: danpianji3501    時間: 2018-8-13 11:09
很好,有啟發!
作者: 少年0508    時間: 2018-8-27 22:41
denny1011 發表于 2018-7-13 09:23
這里的代碼如何寫?請教!

簡單的C語言代碼而已,應該很容易看懂。
作者: gdstlhy    時間: 2018-8-28 09:48
很厲害的樣子,學習學習。
作者: 思憶    時間: 2018-10-17 10:28
思路不錯,學到了
作者: sdygrlb    時間: 2018-10-31 12:49
謝謝分享
作者: bhjyqjs    時間: 2018-10-31 14:17
期待,謝謝分享!
作者: 一束光的旅程    時間: 2018-10-31 14:50
學習學習,謝謝
作者: 踏浪揚帆    時間: 2018-11-3 18:12
很好!多謝!
作者: xuxiaochunabcd    時間: 2018-11-4 09:23
學習學習,謝謝
作者: 123.。99    時間: 2018-12-18 20:18
厲害啊啊啊
作者: xtwsc2    時間: 2019-3-21 22:53
學習,謝謝樓主分享。
作者: aking991    時間: 2019-3-22 08:53
方法不錯,學習學習,謝謝分享
作者: 宋嘿嘿    時間: 2019-3-22 11:29
真棒

作者: 風158    時間: 2019-3-22 12:46
謝謝分享!
作者: lsyswh    時間: 2019-3-22 13:27
學習一下,感謝LZ分享!
作者: ne5532    時間: 2019-3-24 20:03
學習了
作者: 一時    時間: 2019-7-23 16:22
學習了,不錯的思路
作者: nvntx    時間: 2020-3-27 10:46
學習,和我想要的功能和點出入,
作者: hebxk311a    時間: 2020-8-18 18:13
很簡捷,有啟發,學習了




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1