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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8003|回復: 0
打印 上一主題 下一主題
收起左側

[零基礎學習STM32]第二講:GPIO輸入實驗—讀取按鍵狀態

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 heart藍色CD 于 2018-1-29 16:37 編輯

一、概述
1、按鍵簡介
      按鍵是一種機械器件,按鍵兩端分別對應某電路的兩個斷點,我們可以通過按鍵接通和斷開控制該電路的電壓等參數,我們利用按鍵做的應用通常有控制繼電器、鍵盤、復位等。隨著應用的擴展,按鍵已成為電路板上不可或缺的一部分。
如下圖是常開按鍵:

2、按鍵類別簡介
      按鍵主要有四種類型:常開帶復位、常開不帶復位、常閉帶復位、常閉不帶復位。(本次實驗使用的是常開帶復位按鍵)
按鍵主要有以下4種工作模式:
  • 常開帶復位:初始默認狀態是開路,當受力按下時按鍵使電路連通,受力結束后其自動返回開路狀態。
  • 常開帶不復位:初始默認狀態是開路,每按下一次按鍵改變一次開閉狀態。
  • 常閉帶復位:初始默認狀態是連通,當受力按下時按鍵使電路開路,受力結束后其自動返回連通狀態。
  • 常閉不帶復位:初始默認狀態是連通,每按下一次按鍵改變一次開閉狀態。
3、按鍵消抖
      使用手動按鍵的時候, 由于機械抖動可能造成按鍵的錯誤識別。一般手動按下按鍵然后釋放, 按鍵兩片金屬膜接觸的時間大約為50ms,按鍵松開到穩定的時間為5-10ms。因此,如果在首次檢測到按鍵被按下后延時20ms 左右再次檢測,即可確認是否真的有按鍵被按下,從而消除按鍵抖動造成的錯誤識別。本實驗通過給于一定延時后再進行檢測,從而有效的避免了按鍵抖動帶來的誤判。

二、硬件電路

在iCore3雙核心開發板中,采用一個獨立的按鍵與STM32F407的PH15相連,限流電阻為1K。
三、實驗原理

      按鍵的一端與STM32GPIOPH15)相連,另外一端接地,且PH15外接一個1K電流大小的上拉電阻。初始化時把PH15設置成輸入模式,當按鍵彈起時,PH15由于上拉電阻的作用呈高電平(3.3V);當按鍵按下時,PH15直接被按鍵短接到GND,呈低電平。因此判斷PH15的電平變化,可得到按鍵狀態。

四、源代碼
1、主函數
  1. /*
  2. * Name                : main
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. int main(void)
  15. {
  16.         int i;
  17.         static int work_status = 0;                         //三色LED燈工作狀態
  18.         static int key_status = 1;                          //按鍵松開標置
  19.         led.initialize();                                   //三色LED燈端口初始化
  20.         key.initialize();     
  21. while(1){
  22.                 if(KEY_INPUT)key_status = 1;
  23.                 if(key_status == 1){
  24.                         if(!KEY_INPUT){
  25.                                 for(i = 0;i < 10000;i++);     //按鍵防抖動
  26.                                 if(!KEY_INPUT){
  27.                                         key_status = 0;
  28.                                         work_status += 1;
  29.                                         if(work_status > 2)work_status = 0;
  30.                                         //操作 LED
  31.                                         switch(work_status){
  32.                                                 case 0:
  33.                                                         LED_RED_ON;
  34.                                                         LED_GREEN_OFF;
  35.                                                         LED_BLUE_OFF;
  36.                                                         break;
  37.                                                 case 1:
  38.                                                         LED_RED_OFF;
  39.                                                         LED_GREEN_ON;
  40.                                                         LED_BLUE_OFF;
  41.                                                         break;
  42.                                                 case 2:
  43.                                                         LED_RED_OFF;
  44.                                                         LED_GREEN_OFF;
  45.                                                         LED_BLUE_ON;
  46.                                                         break;
  47.                                                 default:

  48.                                                         break;
  49.                                         }

  50.                                 }
  51.                         }
  52.                 }
  53.         }
  54. }
復制代碼
2、GPIO初始化
LED的GPIO初始化配置方式與上一講一致,以下是按鍵的GPIO初始化程序
  1. /*
  2. * Name                : initialize
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. static int initialize(void)
  15. {
  16.         GPIO_InitTypeDef   GPIO_uInitStructure;

  17.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
  18.         //設置連接按鍵的IO端口
  19.         GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_15;                           
  20.         //設置端口為輸入模式
  21.         GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_IN;                          
  22.         //設置速度為第三級
  23.         GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_100MHz;                    
  24.         //設置輸入端口不變化
  25.         GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;                     
  26.         //把設置的參數用到結構體
  27.         GPIO_Init(GPIOH, &GPIO_uInitStructure);                                

  28.         return 0;
  29. }
復制代碼
3、小知識
void RCC_AHB1PeriphClockCmd
(uint32_t RCC_AHB1Periph,FunctionalState NewState)
此函數為外設使能函數,第一個參數為需要被使能的外設,第二個參數為使能與否。可能很多讀者看到這函數不知道如何入手,不知道參數填啥子好,別急,咱先查看一下他的定義:


查看定義方法:雙擊函數名選中,右擊再點GO TODefinition of ...就可以查看咯。
RCC_AHB1PeriphClockCmd函數定義如下:
  1. void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
  2. {
  3.   /* Check the parameters */
  4.   assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
  5.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  6.   if (NewState != DISABLE)
  7.   {
  8.     RCC->AHB1ENR |= RCC_AHB1Periph;
  9.   }
  10.   else
  11.   {
  12.     RCC->AHB1ENR &= ~RCC_AHB1Periph;
  13.   }
  14. }
復制代碼
注意被我標紅的字符串,按照剛剛查定義的方法,它會告訴我們函數的參數可以填啥。如查看IS_FUNCTIONAL_STATE:
  1. #define IS_FUNCTIONAL_STATE(STATE)
  2. (((STATE) == DISABLE) || ((STATE) == ENABLE))
復制代碼
我們可以看出第二個參數可填寫DISABLE(使能)和ENABLE(不使能)。

小結:上面用外設的使能函數為大家介紹了查看函數的方法,此方法在實際應用經?梢杂玫,當我們在閱讀、修改程序的時候,遇到哪些不太清楚的函數,就可以用這種方法查看。

五、實驗現象
按鍵每按下一次,ARM·LED顏色變換(紅色、綠色、藍色輪流交換)一次。

六、代碼包下載
復制網址到瀏覽器可下載pan.baidu.com/s/1sjrHnM9

51hei本地下載:
iCore3_2_KEY.zip (960.18 KB, 下載次數: 16)



評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美久久久久久久久中文字幕 | 四虎永久免费黄色影片 | 欧美日韩高清在线一区 | 99精品一区二区 | 亚洲精品亚洲人成人网 | 欧美日本免费 | 国产精品久久久久永久免费观看 | 91免费入口 | 日韩精品一| 欧美日产国产成人免费图片 | 超碰超碰 | 亚洲精选久久 | 国产九九av | a级毛片国产 | 日韩一区二区在线播放 | 天天操操| 丁香一区二区 | 欧美天堂一区 | 国产一级网站 | 99精品国产成人一区二区 | 国产精品一区二区三区在线播放 | 成人av网站在线观看 | 久久久久久久久久爱 | 农村黄性色生活片 | 亚洲网站在线观看 | 日日夜夜操天天干 | 国内91在线 | 欧美一级一区 | 欧美日韩一区二区在线播放 | 日韩欧美在线观看 | 成人性生交大片免费看中文带字幕 | av中文字幕在线播放 | 五月网婷婷 | 午夜小电影 | 国产日韩精品在线 | 欧美jizzhd精品欧美巨大免费 | 999视频在线播放 | 国产伦精品一区二区三区精品视频 | 天天爽综合网 | www久久国产 | 国产情侣啪啪 |