标题: C语言编程 如何实现按键按下不影响程序执行? [打印本页]

作者: 流年ryh    时间: 2022-2-9 18:50
标题: C语言编程 如何实现按键按下不影响程序执行?
单片机如何实现按键按下不影响程序正常执行

作者: npn    时间: 2022-2-9 21:30
你这样肯定是程序逻辑有问题,都用定时器中断处理的。
作者: 188610329    时间: 2022-2-9 22:35
你按键程序里面只要没有 delay 或者 while 就不会影响程序运行。
作者: dazhige    时间: 2022-2-10 00:18
按键用中断实现或者具体的事务由定时器实现
作者: 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;                        //消抖计数
  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. }
复制代码




作者: 黄youhui    时间: 2022-2-10 09:22
定时器中断检测按键状态
作者: yuyechenai    时间: 2022-2-10 09:29
这个思路 是否适合你

BaiduShurufa_2022-2-10_9-28-39.png (71.14 KB, 下载次数: 25)

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

作者: wojiaoguogai    时间: 2022-2-10 11:14
不要用死循环,每隔10ms读一次io电平,多看下状态机
作者: AUG    时间: 2022-2-10 11:21
用状态机就可以了。
作者: 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;//已经按下
            //切换模式
        }
     }
   }
   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
不要有死循环,要有超时代码自动跳出函数,就可以。
作者: mimidog111    时间: 2022-2-23 10:25
中断处理




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1