久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6827|回復: 4
收起左側

STM32單片機按鍵按下較長時間才有反應

[復制鏈接]
ID:483399 發表于 2019-7-20 19:21 | 顯示全部樓層 |閱讀模式
剛學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;    //按鍵次數變量
  13.     int flag1=0;       //按鍵標志位
  14.           int a,b;
  15.                 int c,d,e,f;
  16.                 LED_Init();                          //初始化與LED連接的硬件接口
  17.           delay_init();            //延時函數初始化
  18.                 a=4000;
  19.           b=3800;
  20.           LED_D2=1;          //四個LED燈剛開始處于熄滅狀態
  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++;        //按鍵按下則計數加1,按四次,則有四個呼吸燈亮
  31.                         }
  32.          
  33.                         switch(key_number)     //通過按鍵按下次數來決定有多少個呼吸燈亮
  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)       //第一個呼吸燈運行函數
  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個呼吸燈運行函數
  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)        //第三個呼吸燈運行函數
  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)        //第四個呼吸燈運行函數
  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.                 }
復制代碼


回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品成人av久久 | 91亚洲国产成人久久精品网站 | 国产精品精品视频一区二区三区 | 日日操av| 九九热在线观看 | 亚洲福利 | 久草网站 | 成人中文字幕在线观看 | 成年人的视频免费观看 | 亚洲高清免费视频 | 四虎影音 | 欧美激情va永久在线播放 | 91久久久久久久久久久久久 | 青青久视频 | 久久久久免费观看 | 国产在线一区二区三区 | 亚洲在线| 欧美精品免费观看二区 | 日本高清视频网站 | 另类专区成人 | 久久九九99 | www日本在线播放 | www国产成人免费观看视频,深夜成人网 | av在线免费播放 | 日韩av一区在线观看 | 国产99视频精品免视看9 | 欧美日韩高清 | 久草资源在线视频 | 黄色大片视频 | 久久久成人免费一区二区 | 久久精品免费一区二区 | 午夜一区二区三区在线观看 | 在线日韩 | 香蕉视频在线播放 | 中文字幕在线视频免费视频 | 国产精品久久久久久久午夜 | 91精品国产日韩91久久久久久 | 欧美中文字幕一区二区三区亚洲 | 青青草在线视频免费观看 | 男插女下体视频 | 亚洲一区|