标题: 单片机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的定时器中断。然后把按键扫描或者按键操作的程序放进定时器中断中,这样按键响应是非常快的。但是定时器中断不能跑时间很长的代码,原因你们应该都懂得。这里我使用定时器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.51hei.com/bbs/) Powered by Discuz! X3.1