本帖最后由 heart藍色CD 于 2018-1-29 16:37 編輯
一、概述
1、按鍵簡介
按鍵是一種機械器件,按鍵兩端分別對應某電路的兩個斷點,我們可以通過按鍵接通和斷開控制該電路的電壓等參數,我們利用按鍵做的應用通常有控制繼電器、鍵盤、復位等。隨著應用的擴展,按鍵已成為電路板上不可或缺的一部分。
如下圖是常開按鍵:
2_0.png (2.72 KB, 下載次數: 58)
下載附件
2018-1-27 14:09 上傳
2、按鍵類別簡介 按鍵主要有四種類型:常開帶復位、常開不帶復位、常閉帶復位、常閉不帶復位。(本次實驗使用的是常開帶復位按鍵) 按鍵主要有以下4種工作模式: - 常開帶復位:初始默認狀態是開路,當受力按下時按鍵使電路連通,受力結束后其自動返回開路狀態。
- 常開帶不復位:初始默認狀態是開路,每按下一次按鍵改變一次開閉狀態。
- 常閉帶復位:初始默認狀態是連通,當受力按下時按鍵使電路開路,受力結束后其自動返回連通狀態。
- 常閉不帶復位:初始默認狀態是連通,每按下一次按鍵改變一次開閉狀態。
3、按鍵消抖
使用手動按鍵的時候, 由于機械抖動可能造成按鍵的錯誤識別。一般手動按下按鍵然后釋放, 按鍵兩片金屬膜接觸的時間大約為50ms,按鍵松開到穩定的時間為5-10ms。因此,如果在首次檢測到按鍵被按下后延時20ms 左右再次檢測,即可確認是否真的有按鍵被按下,從而消除按鍵抖動造成的錯誤識別。本實驗通過給于一定延時后再進行檢測,從而有效的避免了按鍵抖動帶來的誤判。
二、硬件電路
2_1.png (19.48 KB, 下載次數: 64)
下載附件
2018-1-27 14:10 上傳
2_2.png (12.03 KB, 下載次數: 69)
下載附件
2018-1-27 14:10 上傳
在iCore3雙核心開發板中,采用一個獨立的按鍵與STM32F407的PH15相連,限流電阻為1K。 三、實驗原理
2_3.png (15.59 KB, 下載次數: 54)
下載附件
2018-1-27 14:11 上傳
按鍵的一端與STM32的GPIO(PH15)相連,另外一端接地,且PH15外接一個1K電流大小的上拉電阻。初始化時把PH15設置成輸入模式,當按鍵彈起時,PH15由于上拉電阻的作用呈高電平(3.3V);當按鍵按下時,PH15直接被按鍵短接到GND,呈低電平。因此判斷PH15的電平變化,可得到按鍵狀態。
四、源代碼 1、主函數 - /*
- * Name : main
- * Description : ---
- * Author : ysloveivy.
- *
- * History
- * --------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * --------------------
- */
- int main(void)
- {
- int i;
- static int work_status = 0; //三色LED燈工作狀態
- static int key_status = 1; //按鍵松開標置
- led.initialize(); //三色LED燈端口初始化
- key.initialize();
- while(1){
- if(KEY_INPUT)key_status = 1;
- if(key_status == 1){
- if(!KEY_INPUT){
- for(i = 0;i < 10000;i++); //按鍵防抖動
- if(!KEY_INPUT){
- key_status = 0;
- work_status += 1;
- if(work_status > 2)work_status = 0;
- //操作 LED
- switch(work_status){
- case 0:
- LED_RED_ON;
- LED_GREEN_OFF;
- LED_BLUE_OFF;
- break;
- case 1:
- LED_RED_OFF;
- LED_GREEN_ON;
- LED_BLUE_OFF;
- break;
- case 2:
- LED_RED_OFF;
- LED_GREEN_OFF;
- LED_BLUE_ON;
- break;
- default:
- break;
- }
- }
- }
- }
- }
- }
復制代碼2、GPIO初始化 LED的GPIO初始化配置方式與上一講一致,以下是按鍵的GPIO初始化程序 - /*
- * Name : initialize
- * Description : ---
- * Author : ysloveivy.
- *
- * History
- * --------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * --------------------
- */
- static int initialize(void)
- {
- GPIO_InitTypeDef GPIO_uInitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
- //設置連接按鍵的IO端口
- GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_15;
- //設置端口為輸入模式
- GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_IN;
- //設置速度為第三級
- GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- //設置輸入端口不變化
- GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- //把設置的參數用到結構體
- GPIO_Init(GPIOH, &GPIO_uInitStructure);
- return 0;
- }
復制代碼3、小知識 void RCC_AHB1PeriphClockCmd (uint32_t RCC_AHB1Periph,FunctionalState NewState) 此函數為外設使能函數,第一個參數為需要被使能的外設,第二個參數為使能與否。可能很多讀者看到這函數不知道如何入手,不知道參數填啥子好,別急,咱先查看一下他的定義:
2_4.png (33.26 KB, 下載次數: 69)
下載附件
2018-1-27 14:13 上傳
查看定義方法:雙擊函數名選中,右擊再點GO TODefinition of ...就可以查看咯。 RCC_AHB1PeriphClockCmd函數定義如下: - void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
- {
- /* Check the parameters */
- assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
- assert_param(IS_FUNCTIONAL_STATE(NewState));
- if (NewState != DISABLE)
- {
- RCC->AHB1ENR |= RCC_AHB1Periph;
- }
- else
- {
- RCC->AHB1ENR &= ~RCC_AHB1Periph;
- }
- }
復制代碼 注意被我標紅的字符串,按照剛剛查定義的方法,它會告訴我們函數的參數可以填啥。如查看IS_FUNCTIONAL_STATE:
- #define IS_FUNCTIONAL_STATE(STATE)
- (((STATE) == DISABLE) || ((STATE) == ENABLE))
復制代碼我們可以看出第二個參數可填寫DISABLE(使能)和ENABLE(不使能)。
小結:上面用外設的使能函數為大家介紹了查看函數的方法,此方法在實際應用經?梢杂玫,當我們在閱讀、修改程序的時候,遇到哪些不太清楚的函數,就可以用這種方法查看。
五、實驗現象 按鍵每按下一次,ARM·LED顏色變換(紅色、綠色、藍色輪流交換)一次。
六、代碼包下載 復制網址到瀏覽器可下載pan.baidu.com/s/1sjrHnM9
51hei本地下載:
iCore3_2_KEY.zip
(960.18 KB, 下載次數: 16)
2018-1-27 17:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|