单片机3个按键灵活修改多个参数(浮点与整数型)
2020-08-19 来源:51hei
最近写代码,涉及到按键修改参数,就设计了由3个按键修改多个参数的程序设计。按键修改参数,我以写过,但是有着很长的代码。最近写了一个程序,个人感觉代码量较少,适合使用。这里我选STC15F2K60S2单片机开发板来写Demo程序。
原理很简单,第一个按键是 调节+ 按键(程序IO口写Add),第二个按键是 调节- 按键(程序IO口写写Sub),第二个按键是 切换 按键(程序IO口写Exit),也就是切换要修改的参数。然后通过Exit按键修改Add和Sub调节的变量,从而达到修改参数。
预先定义3个要修改的变量和操作标志位。
unsigned char Data1=0,Data2=0,Data3=0;
unsigned char Handle = 1 ; //Handle 1:操作Data1,2:操作Data2,3:操作Data3
实现代码分为3部分。
第一部分是Exit按键改变标志(代码如下)。Handle是标志当前修改的变量,1:操作Data1,2:操作Data2,3:操作Data3。当按下Exit按键,则切操作标志加1,到末端着回到第一个,形成一个环形循环结构。如果增加要修改的参量,要在这里加。
if(Exit==0) //切换按键按下,操作位标志改变
{
while(Exit == 0);//等待松手
if(Handle ==1)
{
Handle=2;
}
else if(Handle == 2)
{
Handle=3;
}
else if(Handle == 3)
{
Handle=1;
}
}
第二部分是根据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),代码如下:
void KeyAlterValue(unsigned char *Variate)
{
if(Add==0)
{
while(Add ==0); //等待松手,如果要长按快速加,则注释此句
if((*Variate)<20) //设置调节上限为20
(*Variate)++; //值加1
}
if(Sub==0)
{
while(Sub ==0); //等待松手,如果要长按快速减,则注释此句
if(*Variate!=0) //设置调节下限为0,
{
(*Variate)--; //值减1
}
}
}
整份代码我都没有设置消抖,都是直接等待松手,即类似while(Add ==0);
三部分代码,前2部分直接扔大循环就可以实现3个按键修改多个参数。但是不能没有显示当前修改的参数是什么,如果不用的话,也可以直接按一下Add或者Sub就可以知道。如果要显示,请看我等下的解决办法。对于按键输入,我习惯开个定时时间约为20ms~30ms的定时器中断。然后把按键扫描或者按键操作的程序放进定时器中断中,这样按键响应是非常快的。但是定时器中断不能跑时间很长的代码,原因你们应该都懂得。这里我使用定时器0,设置20ms。
因为是按键操作,定时器中断代码如下。KeyAction()函数体集合第一部分和第二部分代码。关闭定时器0中断是防止还在处理按键的时候再次来中断。重新装初值是避免定时时间减少。
void T0Service() interrupt 1
{
ET0 = 0; //关闭定时器0中断
TR0 = 0; //定时器0开始计时
KeyAction(); //修改参数
TL0 = 0x00; //设置定时初值
TH0 = 0x70; //设置定时初值
TR0 = 1; //定时器0开始计时
ET0 = 1; //开启定时器0中断
}
至此,响应很快的3个按键修改参量已经可以完成。
上述是修改整形参数的,如果要修改浮点型的,请修改要修改的类型为float,然后把KeyAlterValue的类型也改为float在其内部的自加语句改为需要按下增加的精度就好,Dome程序是以0.1为例,没有松手等待。