找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

STM8(STM32)单片机如何实现按键锁定程序

查看数: 4844 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-5-14 18:21

正文摘要:

各位大佬好,在使用STM8的时候遇到一个问题,想用比较简便的方法解决: /*  目标:想使用一个拨码开关来控制所有的按键锁定:                  ...

回复

ID:728915 发表于 2021-5-16 20:55
名字不是重点 发表于 2021-5-16 15:27
你这个函数有点绕。。。
一般常来说,超过3个并联关系,最好是要用Switch。。。case来做分支。
uchar k ...

噢噢,受教了,谢谢!
ID:824490 发表于 2021-5-16 15:35
          key=key_scan();
                        switch (key)
                        {
                                case 0:
                                        break;
                                case 1://ENT
                                        item++;
                                  if (item>3)
                                        {
                                                RTC_Set(tyear,tmonth,tdate,calendar.hour,calendar.min,calendar.sec);//写入时间;
                                                OLED_Screen_Fill(0x00);
                                                ret=1;
                                        }       
                                        break;
                                case 2: //+
                                        switch (item)
                                        {
                                                case 1:
                                                        if (tyear==2029) tyear=1970;
                                                  else             tyear++;
                                                  break;
                                                case 2:
                                                        if(tmonth==12)   tmonth=1;
                                                  else                                     tmonth++;
                                                  break;
                                                case 3:
                                                        max_date=DFM[tmonth-1];
                                                  if((Is_Leap_Year(tyear)==1)&&(tmonth==2))  max_date=29;
                                                        if(tdate==max_date)    tdate=1;
                                                  else                                     tdate++;
                                                 break;
                                        }
                                        break;
                                case 3://-
                                        switch (item)
                                        {
                                                case 1:
                                                 if (tyear==1970)  tyear=2099;
                                                 else               tyear--;
                                                 break;
                                                case 2:
                                                 if(tmonth==1)    tmonth=12;
                                                 else             tmonth--;
                                                 break;
                                                case 3:
                                                 max_date=DFM[tmonth-1];
                                                 if((Is_Leap_Year(tyear)==1)&&(tmonth==2))  max_date=29;
                                                 if (tdate==1)   tdate=max_date;
                                                 else             tdate--;
                                                 break;
                                        }
                                        break;
                                default:
                                        break;
                        }               
ID:824490 发表于 2021-5-16 15:32
我,菜鸡 发表于 2021-5-15 15:50
是的,可以通过函数来先行判断,但仅通过定义来先一步实现按键锁定判断好像行不通。
另外,是不是除了主 ...

定义一个娈量 uchar Key_vaule;
把K1的状态存为Key_vaule的bit0,按下为0,未按下为1,同理,K2存为bit1...
这样一来再配合switch。case 很方便做组合键,也能做长短按。
ID:824490 发表于 2021-5-16 15:27
本帖最后由 名字不是重点 于 2021-5-16 15:33 编辑
我,菜鸡 发表于 2021-5-15 15:50
是的,可以通过函数来先行判断,但仅通过定义来先一步实现按键锁定判断好像行不通。
另外,是不是除了主 ...

你这个函数有点绕。。。
一般常来说,超过3个并联关系,最好是要用Switch。。。case来做分支。
uchar key_value;
key_value=key_scan();
switch (key_value)
{
case: 0x01
.
.
break;
case: 0x11
.
.
break;

case.
.
.
}
ID:728915 发表于 2021-5-15 15:50
名字不是重点 发表于 2021-5-15 11:10
你的想法没错,在按键扫描函数的开始加入对这个开关的判断,为0就跳过按键扫描

是的,可以通过函数来先行判断,但仅通过定义来先一步实现按键锁定判断好像行不通。
另外,是不是除了主函数里或者极个别情况下,尽量不要使用while、或者for之类的循环语句,会过分占用CPU资源,
比如我下面的按键函数:

//按键判断,带拨码开关BM3按键锁定
int Anjian(void)   //返回值: K1(设置键)短/长按:1/11; K2(+键)短/长按:2/22; K3(-键)短/长按:3/33
{  
  u16 i=0;
  if(BM3!=0)
  {
    while(1)
    {
      if(BM3==0)
      {
        break;
      }
      if(K1==0)   //K1(设置键)按下
      {
        while(1)
        {
          if(K1==0)
          {
            i++;
            delay_cms(1);    //方便 计算 按键K1(设置键)计数时长
            if(i>=60000)   
            {
              i=55555;      //防止达到 计数上限   
            }
          }
         
          if(K1!=0)
          {
            if(i<=179)
            {            
              return 1;     //判断K1(设置键)为:短按(约3秒以内)
            }
            if(i>=180)
            {        
               return 11;   //判断K1(设置键)为:长按(约4秒以后)                 
            }                 
          }
        }
      }
      
      if(K2==0)   //K2(+键)按下
      {
        while(1)
        {
          if(K2==0)
          {
            i++;
            delay_cms(1);    //方便 计算 按键K2(+键)计数时长
            if(i>=60000)   
            {
              i=55555;      //防止达到 计数上限   
            }
          }
         
          if(K2!=0)
          {
            if(i<=179)
            {            
              return 2;     //判断K2(+键)为:短按(约3秒以内)
            }
            if(i>=180)
            {        
               return 22;   //判断K2(+键)为:长按(约4秒以后)                  
            }                 
          }
        }
      }

      if(K3==0)   //K3(-键)按下
      {
        while(1)
        {
          if(K3==0)
          {
            i++;
            delay_cms(1);    //方便 计算 按键K3(-键)计数时长
            if(i>=60000)   
            {
              i=55555;      //防止达到 计数上限   
            }
          }
         
          if(K3!=0)
          {
            if(i<=179)
            {            
              return 3;     //判断K3(-键)为:短按(约3秒以内)
            }
            if(i>=180)
            {        
               return 33;   //判断K3(-键)为:长按(约4秒以后)                  
            }                 
          }
        }
      }   
    }     
  }  
}
ID:919615 发表于 2021-5-15 15:22

你的想法没错,在按键扫描函数的开始加入对这个开关的判断,为0就跳过按键扫描
ID:824490 发表于 2021-5-15 11:10
你的想法没错,在按键扫描函数的开始加入对这个开关的判断,为0就跳过按键扫描

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

Powered by 单片机教程网

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