单片机
返回首页

单片机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为例,没有松手等待。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控电路设计与分析

  • IGBT模块通过控制门极阻断过电流

  • CCFL的工作原理及电子驱动电路解析

  • 开关电源的基本组成及工作原理

  • 基于M66T旋律发​​生器的电路图解析

  • 基于CA3193的热电偶放大器电路

    相关电子头条文章