找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14018|回复: 22
收起左侧

单片机3个按键灵活修改多个参数(浮点与整数型)

  [复制链接]
ID:96935 发表于 2018-5-7 12:08 | 显示全部楼层 |阅读模式
最近写代码,涉及到按键修改参数,就设计了由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

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:331928 发表于 2018-5-17 10:32 | 显示全部楼层
看看学习下
回复

使用道具 举报

ID:370667 发表于 2018-7-13 09:23 | 显示全部楼层
这里的代码如何写?请教!
回复

使用道具 举报

ID:384956 发表于 2018-8-10 12:57 | 显示全部楼层
好思路学些了,谢谢
回复

使用道具 举报

ID:273583 发表于 2018-8-13 11:09 | 显示全部楼层
很好,有启发!
回复

使用道具 举报

ID:96935 发表于 2018-8-27 22:41 | 显示全部楼层
denny1011 发表于 2018-7-13 09:23
这里的代码如何写?请教!

简单的C语言代码而已,应该很容易看懂。
回复

使用道具 举报

ID:275854 发表于 2018-8-28 09:48 来自手机 | 显示全部楼层
很厉害的样子,学习学习。
回复

使用道具 举报

ID:361213 发表于 2018-10-17 10:28 | 显示全部楼层
思路不错,学到了
回复

使用道具 举报

ID:373813 发表于 2018-10-31 12:49 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:66287 发表于 2018-10-31 14:17 | 显示全部楼层
期待,谢谢分享!
回复

使用道具 举报

ID:230847 发表于 2018-10-31 14:50 来自手机 | 显示全部楼层
学习学习,谢谢
回复

使用道具 举报

ID:265468 发表于 2018-11-3 18:12 | 显示全部楼层
很好!多谢!
回复

使用道具 举报

ID:303892 发表于 2018-11-4 09:23 | 显示全部楼层
学习学习,谢谢
回复

使用道具 举报

ID:422833 发表于 2018-12-18 20:18 | 显示全部楼层
厉害啊啊啊
回复

使用道具 举报

ID:385506 发表于 2019-3-21 22:53 | 显示全部楼层
学习,谢谢楼主分享。
回复

使用道具 举报

ID:65956 发表于 2019-3-22 08:53 | 显示全部楼层
方法不错,学习学习,谢谢分享
回复

使用道具 举报

ID:349986 发表于 2019-3-22 11:29 | 显示全部楼层
真棒
回复

使用道具 举报

ID:343102 发表于 2019-3-22 12:46 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:228022 发表于 2019-3-22 13:27 | 显示全部楼层
学习一下,感谢LZ分享!
回复

使用道具 举报

ID:497468 发表于 2019-3-24 20:03 | 显示全部楼层
学习了
回复

使用道具 举报

ID:476909 发表于 2019-7-23 16:22 | 显示全部楼层
学习了,不错的思路
回复

使用道具 举报

ID:406505 发表于 2020-3-27 10:46 | 显示全部楼层
学习,和我想要的功能和点出入,
回复

使用道具 举报

ID:282626 发表于 2020-8-18 18:13 | 显示全部楼层
很简捷,有启发,学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表