找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6630|回復(fù): 4
收起左側(cè)

STM32單片機按鍵按下較長時間才有反應(yīng)

[復(fù)制鏈接]
ID:483399 發(fā)表于 2019-7-20 19:21 | 顯示全部樓層 |閱讀模式
剛學(xué)STM32的小白,寫了stm32一個按鍵按幾下就亮幾個呼吸燈的程序,呼吸燈運行正常,但就是在按第二下按鍵時需要按下按鍵較長時間才會亮第二個呼吸燈,以后幾個也都是這樣,是在哪里有問題呢?望大佬指教
單片機源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "stm32f10x.h"

  6. void delay(uint32_t counter)
  7. {
  8.         while(counter--);
  9.         }
  10. int main(void)
  11. {        
  12.           int key_number;    //按鍵次數(shù)變量
  13.     int flag1=0;       //按鍵標(biāo)志位
  14.           int a,b;
  15.                 int c,d,e,f;
  16.                 LED_Init();                          //初始化與LED連接的硬件接口
  17.           delay_init();            //延時函數(shù)初始化
  18.                 a=4000;
  19.           b=3800;
  20.           LED_D2=1;          //四個LED燈剛開始處于熄滅狀態(tài)
  21.           LED_D3=1;
  22.           LED_D4=1;
  23.           LED_D5=1;
  24.                          while(1)
  25.                          {
  26.                         if(Key4==0) flag1=1;
  27.                         if(Key4==1&&flag1==1)  //判斷按鍵是否按下
  28.                         {
  29.                                 flag1=0;
  30.                                 key_number++;        //按鍵按下則計數(shù)加1,按四次,則有四個呼吸燈亮
  31.                         }
  32.          
  33.                         switch(key_number)     //通過按鍵按下次數(shù)來決定有多少個呼吸燈亮
  34.                         {
  35.                                 case 1:huxi1(c);break;
  36.                                 case 2:huxi2(d);break;
  37.                                 case 3:huxi3(e);break;
  38.                                 case 4:huxi4(f);break;
  39.                   }
  40.                 }
  41. }
  42. int huxi1(int c)       //第一個呼吸燈運行函數(shù)
  43. {
  44.           int i,a,b;
  45.           a=4000;
  46.           b=3800;
  47.       for(i=0;i<a;i++)
  48.       {
  49.       GPIO_ResetBits(GPIOB, GPIO_Pin_12);                                
  50.       delay(a - i);
  51.       GPIO_SetBits(GPIOB, GPIO_Pin_12);
  52.       delay(i);                                 
  53.                   }
  54.                         for(i=0;i<b;i++)
  55.       {
  56.       GPIO_ResetBits(GPIOB, GPIO_Pin_12);                                
  57.       delay(i);
  58.       GPIO_SetBits(GPIOB, GPIO_Pin_12);
  59.       delay(b-i);                                 
  60.                   }
  61.                         delay(100);
  62.                 }
  63. int huxi2(int d)  //第一個和第2個呼吸燈運行函數(shù)
  64. {
  65.           int i,a,b;
  66.           a=4000;
  67.           b=3800;
  68.       for(i=0;i<a;i++)
  69.       {
  70.       GPIO_ResetBits(GPIOB, GPIO_Pin_12);
  71.       GPIO_ResetBits(GPIOB, GPIO_Pin_13);                                 
  72.       delay(a - i);
  73.       GPIO_SetBits(GPIOB, GPIO_Pin_12);
  74.                         GPIO_SetBits(GPIOB, GPIO_Pin_13);
  75.       delay(i);                                 
  76.                   }
  77.                         for(i=0;i<b;i++)
  78.       {
  79.       GPIO_ResetBits(GPIOB, GPIO_Pin_12);
  80.       GPIO_ResetBits(GPIOB, GPIO_Pin_13);                        
  81.       delay(i);
  82.       GPIO_SetBits(GPIOB, GPIO_Pin_12);
  83.                         GPIO_SetBits(GPIOB, GPIO_Pin_13);
  84.       delay(b-i);                                 
  85.                   }
  86.                         delay(100);
  87.                 }
  88. int huxi3(int e)        //第三個呼吸燈運行函數(shù)
  89. {
  90.           int i,a,b;
  91.           a=4000;
  92.           b=3800;
  93.       for(i=0;i<a;i++)
  94.       {
  95.       GPIO_ResetBits(GPIOB, GPIO_Pin_12);
  96.       GPIO_ResetBits(GPIOB, GPIO_Pin_13);
  97.       GPIO_ResetBits(GPIOB, GPIO_Pin_14);                                 
  98.       delay(a - i);
  99.       GPIO_SetBits(GPIOB, GPIO_Pin_12);
  100.                         GPIO_SetBits(GPIOB, GPIO_Pin_13);
  101.                         GPIO_SetBits(GPIOB, GPIO_Pin_14);
  102.       delay(i);                                 
  103.                   }
  104.                         for(i=0;i<b;i++)
  105.       {
  106.       GPIO_ResetBits(GPIOB, GPIO_Pin_12);
  107.       GPIO_ResetBits(GPIOB, GPIO_Pin_13);
  108.       GPIO_ResetBits(GPIOB, GPIO_Pin_14);                        
  109.       delay(i);
  110.       GPIO_SetBits(GPIOB, GPIO_Pin_12);
  111.                         GPIO_SetBits(GPIOB, GPIO_Pin_13);
  112.                         GPIO_SetBits(GPIOB, GPIO_Pin_14);
  113.       delay(b-i);                                 
  114.                   }
  115.                         delay(100);
  116.                 }
  117. int huxi4(int f)        //第四個呼吸燈運行函數(shù)
  118. {
  119.           int i,a,b;
  120.           a=4000;
  121.           b=3800;
  122.       for(i=0;i<a;i++)
  123.       {
  124.       GPIO_ResetBits(GPIOB, GPIO_Pin_12);
  125.       GPIO_ResetBits(GPIOB, GPIO_Pin_13);
  126.       GPIO_ResetBits(GPIOB, GPIO_Pin_14);
  127.       GPIO_ResetBits(GPIOB, GPIO_Pin_15);                                 
  128.       delay(a - i);
  129.       GPIO_SetBits(GPIOB, GPIO_Pin_12);
  130.                         GPIO_SetBits(GPIOB, GPIO_Pin_13);
  131.                         GPIO_SetBits(GPIOB, GPIO_Pin_14);
  132.                         GPIO_SetBits(GPIOB, GPIO_Pin_15);
  133.       delay(i);                                 
  134.                   }
  135.                         for(i=0;i<b;i++)
  136.       {
  137.       GPIO_ResetBits(GPIOB, GPIO_Pin_12);
  138.       GPIO_ResetBits(GPIOB, GPIO_Pin_13);
  139.       GPIO_ResetBits(GPIOB, GPIO_Pin_14);
  140.       GPIO_ResetBits(GPIOB, GPIO_Pin_15);                                 
  141.       delay(i);
  142.       GPIO_SetBits(GPIOB, GPIO_Pin_12);
  143.                         GPIO_SetBits(GPIOB, GPIO_Pin_13);
  144.                         GPIO_SetBits(GPIOB, GPIO_Pin_14);
  145.                         GPIO_SetBits(GPIOB, GPIO_Pin_15);
  146.       delay(b-i);                                 
  147.                   }
  148.                         delay(100);
  149.                 }
復(fù)制代碼


回復(fù)

使用道具 舉報

ID:517466 發(fā)表于 2019-7-20 23:31 | 顯示全部樓層
第一次的時候,沒有執(zhí)行呼吸燈的處理。按鍵的循環(huán)掃描很快。一旦執(zhí)行了呼吸燈,呼吸燈處理中的for循環(huán)會占用MPU的執(zhí)行時間,不執(zhí)行完呼吸燈的處理,程序不會退出到main程序中檢查按鍵是否按下的。如果想快速響應(yīng)按鍵,最好改成中斷方式響應(yīng)按鍵。
回復(fù)

使用道具 舉報

ID:377268 發(fā)表于 2019-7-20 23:50 | 顯示全部樓層
你好哦,你的呼吸燈子函數(shù)是個大的for循環(huán),這個寫法的話,程序只在每次跑完for后去掃描按鍵1次,就是說,每呼吸1次才能掃描到1次按鍵的。你第1次按按鍵時沒循環(huán)在跑,程序在不斷掃按鍵,開啟呼吸燈之后不管哪個程序都存在for循環(huán),這就導(dǎo)致按鍵在大部分時間都是處在沒被掃描的狀態(tài),不想動大體的結(jié)構(gòu)的話,你在每個for里面放個按鍵檢測,按鍵按下就break.但是別清flag.OK,希望你能理解
回復(fù)

使用道具 舉報

ID:587834 發(fā)表于 2019-7-24 17:05 | 顯示全部樓層
只看了問題,沒看你程序。你檢查一下按鍵延時,防抖延時看看
回復(fù)

使用道具 舉報

ID:588192 發(fā)表于 2019-7-24 19:57 | 顯示全部樓層
建議加一個防抖動程序和延時配套使用
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表