欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 請問單片機怎么用延時做按鍵長按延時? [打印本頁]

作者: 新手青島小胡    時間: 2019-11-21 22:35
標題: 請問單片機怎么用延時做按鍵長按延時?
大神們你們好,本人單片機新手,在做萬年歷的時候為了節省一個按鍵,想把加的那個按鍵,做成功能是:單次按下只加一次,長按開始快速遞增,但是只能做出來前半部分功能,關于這個功能的代碼如下:
        if(i==333)
                  {        if(KEY2==1)
                          {
                                  i=0;
                          }
                  
                          goto j;
                  }
                else
                  {
                    while(!KEY2)
                    {
                     delay(5);
                     i++;                    }
                  }

j :{;}

求解答,問題比較白癡,希望不要笑話哈哈,感謝大家

作者: pcbboy    時間: 2019-11-22 08:06
檢測時給個時間比如超過300mS算長按,小于300算短按。操作時再調整.
作者: 笨笨兔    時間: 2019-11-22 08:33
按鍵是怎么掃描,怎么消小抖的呢?

如果是用定時器方式,很好辦的;確認按鍵位置后,時間長短根據進中斷次數即可區分長按鍵和短按鍵。
作者: zhy111    時間: 2019-11-22 09:05
用狀態機進行掃描

作者: moluxiyan    時間: 2019-11-22 09:11
你這按鍵問題比較大呀
作者: 黃youhui    時間: 2019-11-22 09:12
if(i== 300)然 厚if(KEY2 ==1)i=0  
else whlle(!KEY2){ i++}

你的定義的變量  i  是什么?是按鍵時間還是計數器
作者: wulin    時間: 2019-11-22 10:31
給你一個長、短按鍵示例參考。
  1. #include <REG51.H>
  2. #define uint unsigned int                         //宏定義數據類型uint
  3. #define uchar unsigned char                 //宏定義數據類型uchar
  4. #define key_S 500                                        //宏定義短按(約20ms)
  5. #define key_L 16000                                        //宏定義長按(約2/3s)
  6. #define key_M 11000                                        //宏定義長按間隔(約1/3s)
  7. sbit key1=P3^6;                                                //加鍵
  8. sbit key2=P3^7;                                                //減鍵
  9. uchar num=1;

  10. void keyscan()                                                //按鍵掃描
  11. {
  12.         static uint count1=0,count2=0;        //計數變量
  13.         if(!key1)   
  14.         {  
  15.                 count1++;  
  16.                 if(count1>=key_L)                        //長按
  17.                 {
  18.                         if(num<255)
  19.                                 num++;        
  20.                         count1=key_M;
  21.                 }
  22.         }  
  23.         else                                                        //按鍵抬起
  24.         {  
  25.                 if(count1>key_S && count1<key_L)//短按
  26.                 {
  27.                         if(num<255)
  28.                                 num++;
  29.                 }
  30.                 count1=0;                                        //count清0
  31.         }   
  32.         if(!key2)   
  33.         {  
  34.                 count2++;  
  35.                 if(count2>=key_L)                        //長按
  36.                 {
  37.                         if(num>0)
  38.                                 num--;        
  39.                         count2=key_M;
  40.                 }
  41.         }  
  42.         else                                                        //按鍵抬起
  43.         {  
  44.                 if(count2>key_S && count2<key_L)//短按
  45.                 {
  46.                         if(num>0)
  47.                                 num--;
  48.                 }
  49.                 count2=0;                                        //count清0
  50.         }
  51. }

  52. void main()
  53. {
  54.         while(1)                                                //12MHz晶振主循環周期33~41us
  55.         {
  56.                
  57.                 keyscan();                                        //按鍵掃描
  58.                 P1=~num;                                        //LED低電平顯示
  59.         }
  60. }
復制代碼

作者: yzwzfyz    時間: 2019-11-23 10:59
1、別人的按鍵動作,你是無法延時的,因為你不能控制別人的手。
2、按鍵后是否響應卻是你可以控制的。
3、檢測到按鍵后,你就起動一個定時器,定時器動作后,你再響應按鍵的“動作需求”,這就OK了。當然你還要考慮中途取消等等問題,這是你需要做的。




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1