久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

STM8(STM32)單片機如何實現按鍵鎖定程序

查看數: 4562 | 評論數: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年女人免费v片 | 免费精品在线视频 | 欧美精品一区在线 | h片在线看| 久久精品无码一区二区三区 | 久久成人精品视频 | 伊人久久综合 | 欧美综合视频在线 | 日批免费看 | 成人性视频免费网站 | 国产成人精品午夜视频免费 | 日本精品一区 | 99精品国产一区二区三区 | 91av导航 | 欧美日韩精品久久久免费观看 | 亚洲综合大片69999 | 天堂久久天堂综合色 | 日韩成人在线一区 | 国产精品区一区二 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 另类 综合 日韩 欧美 亚洲 | 国产精品视频一二三区 | 色婷婷综合久久久中字幕精品久久 | 欧美999| 精品无码久久久久久国产 | 久草久 | 国产精品日产欧美久久久久 | 秋霞在线一区 | 久久国产精品99久久久大便 | 久久久久国产精品 | 麻豆changesxxx国产 | 欧美 日韩 在线播放 | 亚洲 欧美 另类 综合 偷拍 | 久久夜视频 | 亚洲福利视频网 | 91看片在线观看 | 黄色免费在线观看 | 国产精品高潮呻吟久久 | 免费看的av | 一区二区三区在线 | 中文字幕精品一区二区三区精品 |