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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6565|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:483399 發(fā)表于 2019-7-20 19:21 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
剛學(xué)STM32的小白,寫了stm32一個(gè)按鍵按幾下就亮幾個(gè)呼吸燈的程序,呼吸燈運(yùn)行正常,但就是在按第二下按鍵時(shí)需要按下按鍵較長時(shí)間才會(huì)亮第二個(gè)呼吸燈,以后幾個(gè)也都是這樣,是在哪里有問題呢?望大佬指教
單片機(jī)源程序如下:
  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í)函數(shù)初始化
  18.                 a=4000;
  19.           b=3800;
  20.           LED_D2=1;          //四個(gè)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++;        //按鍵按下則計(jì)數(shù)加1,按四次,則有四個(gè)呼吸燈亮
  31.                         }
  32.          
  33.                         switch(key_number)     //通過按鍵按下次數(shù)來決定有多少個(gè)呼吸燈亮
  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)       //第一個(gè)呼吸燈運(yùn)行函數(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)  //第一個(gè)和第2個(gè)呼吸燈運(yùn)行函數(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)        //第三個(gè)呼吸燈運(yùn)行函數(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)        //第四個(gè)呼吸燈運(yùn)行函數(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ù)制代碼


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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

地板
ID:587834 發(fā)表于 2019-7-24 17:05 | 只看該作者
只看了問題,沒看你程序。你檢查一下按鍵延時(shí),防抖延時(shí)看看
回復(fù)

使用道具 舉報(bào)

5#
ID:588192 發(fā)表于 2019-7-24 19:57 | 只看該作者
建議加一個(gè)防抖動(dòng)程序和延時(shí)配套使用
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美国产一区二区三区 | 中文字幕四虎 | 自拍偷拍亚洲欧美 | 亚洲精品一区二区在线观看 | 亚洲精品美女在线观看 | 久久在线视频 | 欧美天堂在线观看 | 亚洲国产自产 | a在线观看 | 久久久一区二区三区四区 | 成年人在线视频 | 久久久国产精品 | 国产日韩欧美一区二区 | 日韩中文字幕一区 | 国产精品性做久久久久久 | 亚洲自拍一区在线观看 | 亚洲精品久久久久中文字幕欢迎你 | 欧美特级黄色 | 亚洲精品视频在线播放 | h片免费看 | av天天看| 一级黄色在线 | 国产成人精品免费视频 | 在线一级片 | 久久国产亚洲 | 亚洲午夜在线 | 久久夜色精品国产 | 天天操天天怕 | 欧美日韩在线一区二区 | 天堂资源 | 色综合久 | 久久综合av| 国产精久久久 | 久久久久久久综合 | 日韩伦理电影免费在线观看 | 成人在线视频免费看 | 一区二区三区四区国产 | 狠狠躁18三区二区一区 | 免费国产成人av | 激情毛片 | 精品欧美一区二区中文字幕视频 |