標(biāo)題: C語言編程 如何實現(xiàn)按鍵按下不影響程序執(zhí)行? [打印本頁]

作者: 流年ryh    時間: 2022-2-9 18:50
標(biāo)題: C語言編程 如何實現(xiàn)按鍵按下不影響程序執(zhí)行?
單片機(jī)如何實現(xiàn)按鍵按下不影響程序正常執(zhí)行

作者: npn    時間: 2022-2-9 21:30
你這樣肯定是程序邏輯有問題,都用定時器中斷處理的。
作者: 188610329    時間: 2022-2-9 22:35
你按鍵程序里面只要沒有 delay 或者 while 就不會影響程序運(yùn)行。
作者: dazhige    時間: 2022-2-10 00:18
按鍵用中斷實現(xiàn)或者具體的事務(wù)由定時器實現(xiàn)
作者: lkc8210    時間: 2022-2-10 01:40
不要用delay()!不要用delay()!不要用delay()!

給個栗子
  1. #include <reg52.h>

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 to 65535

  4. sbit KEY_XX = P3^5;
  5. u8 mode = 3;
  6. u8 i = 0;
  7. void disp()
  8. {
  9.     switch (mode)
  10.     {
  11.     case 0:
  12.         P1 = ~(0x01 << i);
  13.         break;
  14.     case 1:
  15.         P1 = ~(0x80 >> i);
  16.         break;
  17.     case 2:
  18.         P1 <<= 1;
  19.         if(P1 & 0x80)
  20.         {
  21.             P1 &= 0xFE;
  22.         } else {
  23.             P1 |= 0x01;
  24.         }
  25.         break;
  26.     case 3:
  27.         P1 >>= 1;
  28.         if(P1 & 0x01)
  29.         {
  30.             P1 &= 0x7F;
  31.         } else {
  32.             P1 |= 0x80;
  33.         }
  34.         break;
  35.     default:
  36.         break;
  37.     }
  38.     i = ++i %8;
  39. }
  40. void key_Proc()//單鍵短按
  41. {
  42.     static u16 Delay_XD=0;                        //消抖計數(shù)
  43.     if(!KEY_XX)
  44.     {
  45.         if(Delay_XD<0xFFFF)Delay_XD++;
  46.         //else Delay_XD = 0;                //連按功能
  47.         if(Delay_XD==0xFF)                        //消抖
  48.         {
  49.             mode = ++mode % 4;
  50.             i = 0;
  51.             P1 = 0xFF;
  52.         }
  53.     }
  54.     else                                                        //按鍵抬起
  55.         Delay_XD=0;                                        //Delay_XD清0
  56. }
  57. void main()
  58. {   u16 ScanCNT = 0;
  59.     while(1)
  60.     {
  61.         if(ScanCNT++ > 2000)
  62.         {
  63.             ScanCNT = 0;
  64.             disp();
  65.         }
  66.         key_Proc();
  67.     }
  68. }
復(fù)制代碼




作者: 黃youhui    時間: 2022-2-10 09:22
定時器中斷檢測按鍵狀態(tài)
作者: yuyechenai    時間: 2022-2-10 09:29
這個思路 是否適合你

BaiduShurufa_2022-2-10_9-28-39.png (71.14 KB, 下載次數(shù): 25)

BaiduShurufa_2022-2-10_9-28-39.png

作者: wojiaoguogai    時間: 2022-2-10 11:14
不要用死循環(huán),每隔10ms讀一次io電平,多看下狀態(tài)機(jī)
作者: AUG    時間: 2022-2-10 11:21
用狀態(tài)機(jī)就可以了。
作者: wd1988    時間: 2022-2-10 13:41
if(Time_2ms == 1)//定時器中斷每2ms檢測按鍵一次
{
  Time_2ms = 0;
   if(KEY == 0)//按鍵按下 低有效
   {
      b_key_10 +=1;
      b_key_11 = 0;
      if(b_key_10 > 24)//消抖50ms
     {
        b_key_10 = 0;
        if( f_key_ok == 0 )//
        {
            f_key_ok = 1;//已經(jīng)按下
            //切換模式
        }
     }
   }
   else
   {
       b_key_10 = 0;
       b_key_11 += 1;
       if(b_key_11 > 24)//松鍵消抖50ms
       {
           b_key_11 = 0;
           f_key_ok = 0;//松開
       }
   }
}
作者: univers    時間: 2022-2-10 21:00
不要有死循環(huán),要有超時代碼自動跳出函數(shù),就可以。
作者: mimidog111    時間: 2022-2-23 10:25
中斷處理




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