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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6611|回復: 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.                 }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 | 只看該作者
只看了問題,沒看你程序。你檢查一下按鍵延時,防抖延時看看
回復

使用道具 舉報

5#
ID:588192 發表于 2019-7-24 19:57 | 只看該作者
建議加一個防抖動程序和延時配套使用
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费精品 | 女朋友的闺蜜3韩国三级 | 国产亚洲精品久久yy50 | 岛国av免费观看 | 国产精品99久久久久久www | 综合二区| 久久成人免费视频 | 欧美视频在线免费 | 亚洲欧美日韩在线不卡 | 黑人性hd | 卡通动漫第一页 | 日韩中文不卡 | 91精品国产高清一区二区三区 | 国产精品久久久久一区二区三区 | 国产影音先锋 | 亚洲成av人片在线观看 | 性欧美hd | 久久精品视频在线播放 | 欧美日韩国产一区二区三区 | 刘亦菲国产毛片bd | 久久中文字幕一区 | 欧美激情久久久 | 99日韩| 中文字幕国产视频 | 久久久蜜臀国产一区二区 | 欧美在线a| 国产精品国产成人国产三级 | 国产高潮av | a国产视频| 精品久久久999 | 精品亚洲永久免费精品 | 亚洲精品9999| 日韩中文在线视频 | 9191av | 欧洲毛片| 九九热精品视频 | 特黄特色大片免费视频观看 | 激情黄色在线观看 | 久久免费观看一级毛片 | 日韩二区 | 99久久国产免费 |