标题: 单片机按键程序有时候触发不了是为什么? [打印本页]

作者: Nupo    时间: 2023-6-20 08:55
标题: 单片机按键程序有时候触发不了是为什么?
  1. void Key_Scan(void)
  2. {
  3.            if(S1 == 0)
  4.            {
  5.                                  Old_flag = S1;
  6.                                  gKeyCnt++;
  7.            }
  8.            else
  9.            {         
  10.                       if(Old_flag == 0)
  11.                       {
  12.                           Old_flag = S1;
  13.                                  if(gKeyCnt>3&&gKeyCnt<1000)
  14.                    {
  15.                                      if(gKeyValue < 10)
  16.                                      {
  17.                                                 gKeyValue++;
  18.                                      }
  19.                                             else
  20.                                             {
  21.                                                        gKeyValue = 0;
  22.                                             }
  23.                                  }
  24.                                 
  25.   //--------处理键值-------------------------
  26.                           switch(gKeyValue)
  27.                    {
  28.                                             case 0:                  
  29.                                             {
  30.                                                        Sleep_Flag = 0;
  31.                                                 break;
  32.                                             }
  33.                                             case 1:       
  34.                                             {
  35.                                                 Red = 0;
  36.                                                 break;
  37.                                             }
  38.                                             case 2:
  39.                                             {
  40.                                                        Green = 0;
  41.                                                 break;
  42.                                             }
  43.                               case 3:
  44.                                             {
  45.                                                        Red = 1;
  46.                                                 break;
  47.                                             }
  48.                                             case 4:
  49.                                             {
  50.                                                        Blue = 0;
  51.                                                 break;
  52.                                             }
  53.                                             case 5:
  54.                                             {
  55.                                                        Green = 1;
  56.                                                 break;
  57.                                             }
  58.                                             case 6:
  59.                                             {
  60.                                                        Red = 0;
  61.                                                        break;
  62.                                             }                                       
  63.                               case 7:
  64.                                             {
  65.                                                        Green = 0;
  66.                                          break;  
  67.                                             }
  68.                               case 8:
  69.                                             {
  70.                                                        Auto_Flag = 1;
  71.                                                        Red = 1;
  72.                                                        Green = 1;
  73.                                                        Blue = 1;
  74.                                          break;  
  75.                                             }  
  76.                               case 9:
  77.                                             {
  78.                                                        Auto_Flag = 0;
  79.                                                        Breath_Flag = 1;
  80.                                          break;  
  81.                                             }
  82.                               case 10:
  83.                                             {
  84.                                                        Breath_Flag = 0;
  85.                                                        Sleep_Flag = 0;
  86.                                          break;  
  87.                                             }         
  88.                    }
  89.                        Delay_Off();
  90.                       }
  91.                       else
  92.                       {
  93.                                  gKeyCnt = 0;
  94.                       }
  95.            }
  96. }
复制代码
有没有大佬帮我看一下啊,按键有时候会触发不了,呼吸灯和自动流水,都是在delay里加了keyscan,检测到标志位就break,拜求各位大佬了!!!
作者: lkc8210    时间: 2023-6-20 11:05
呼吸灯和自动流水都不要用delay
作者: clzs19    时间: 2023-6-21 11:03
因为单片机执行的速度过快,也由于程序的复杂程度使程序走到部分代码阶段会出不去,出不去就一直执行.在你按按键和执行中断的时候刚好走进这个循环里,程序判断当然是进入中断,然后中断完了回来这个循环造成这个循环变死循环了.也就是你中断改变了一些因子使程序原本那个循环的因子突然遭到改变而出不去.然后死循环了




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