實驗 5 STM32單片機實現按鍵功能
前面幾章,我們介紹了 STM32 的 IO 口作為輸出以及系統時鐘的使用,這
一章,我們將向大家介紹如何使用 STM32 的 IO 口作為輸入用。在本章中,我
們將利用板載的 4 個按鍵,來控制板子上的 4 個 LED。 通過本章的學習, 你
將了解到 STM32 的 IO 口作為輸入口的使用方法。 本章分為以下學習目標:
1、了解按鍵輸入的原理。
2、了解 STM32 的輸入模式。
1.1 硬件電路設計
通過前面的學習,我們學會了如何使用 GPIO 輸出模式,接下來,我們來學
習怎么使用 GPIO 的輸入模式。 首先我們來看在我們開發板上面按鍵的原理圖。
0.png (49.12 KB, 下載次數: 123)
下載附件
2017-5-6 19:56 上傳
0.png (51.08 KB, 下載次數: 120)
下載附件
2017-5-6 19:57 上傳
通過上面的原理圖,我可能看到四個按鍵分別接到單片機的 PA0、 PE2、
PE3、PE4。
1.2 按鍵消抖
通常的按鍵所用開關為機械彈性開關,當機械觸點斷開 、閉合時,電壓信號 如
下圖:
0.png (56 KB, 下載次數: 97)
下載附件
2017-5-6 19:57 上傳
由于機械點的彈性作用,一個按鍵開關在閉合時不會馬上穩定的接通,在斷
開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動。抖動
時間的長短由按鍵的機械特性決定的,一般為 5ms 到 10ms。按鍵穩定閉合時間
的長短則由操作人員的按鍵動作決定的,一般為零點幾秒至數秒。按鍵抖動會引
起按鍵被誤讀多次。為了確保 CPU 對鍵的一次閉合僅作一次處理,必須去除按
鍵抖動。一般來說一個簡單的按鍵消抖就是先讀取一次按鍵的狀態,如果得到按
鍵按下之后,延時 10ms,再次讀取一次按鍵的狀態,如果按鍵還是按下狀態,
那么說明按鍵已經按下。
1.3 V3.5 庫函數輸入函數介紹
在第一章 LED 燈中我們已經介紹了,STM32 的 IO 口配置方式了,那么這
里 我們就不在作介紹了,我們直接介紹庫函數中的輸入讀取函數。 輸入讀取函
數有多個函數,詳細大家可以查看《STM32 固件庫使用手冊(中 文 翻 譯
版 ).pdf 》, 在 這 里 我 們 簡 單 介 紹 一 個 要 用 到 的 輸 入 函 數
GPIO_ReadInputDataBit()函數:
0.png (116.04 KB, 下載次數: 83)
下載附件
2017-5-6 19:58 上傳
這個函數是讀取一個設置為輸出模式時,一個 IO 口的狀態值。當讀取的 IO 口
為 1 的時候,輸出 1,當 IO 口輸出為 0 的時候,輸出 0。
- /*******************************************************************************
- *
- --------------------------------------------------------------------------------
- * 實 驗 名 : 按鍵實驗
- * 實驗說明 : 按鍵按下點亮D1-D4對應LED燈
- * 連接方式 :
- * 注 意 : 所用函數在systick.c和led.c,key.c文件內
- *******************************************************************************/
- #include "public.h"
- #include "led.h"
- #include "key.h"
- #include "systick.h"
- /*******************************************************************************
- * 函 數 名 : key_pros
- * 函數功能 : 按鍵處理函數,判斷按鍵按下控制對應的LED燈
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void key_pros() //按鍵處理函數
- {
- if(k_up==1) //判斷按鍵k_up是否按下
- {
- delay_ms(10); //消抖處理
- if(k_up==1) //再次判斷按鍵k_up是否按下
- {
- GPIO_Write(GPIOC,(u16)0xfe);
- }
- while(k_up); //等待按鍵松開
- }
- if(k_down==0)
- {
- delay_ms(10);
- if(k_down==0)
- {
- GPIO_Write(GPIOC,(u16)(0xfd));
- }
- while(!k_down);
- }
- if(k_left==0)
- {
- delay_ms(10);
- if(k_left==0)
- {
- GPIO_Write(GPIOC,(u16)(0xfb));
- }
- while(!k_left);
- }
- if(k_right==0)
- {
- delay_ms(10);
- if(k_right==0)
- {
- GPIO_Write(GPIOC,(u16)(0xf7));
- }
- while(!k_right);
- }
- }
- /****************************************************************************
- * Function Name : main
- * Description : Main program.
- * Input : None
- * Output : None
- * Return : None
- ****************************************************************************/
- int main()
- {
- LED_Init(); //LED初始化
- key_init(); //按鍵端口初始化函數
- GPIO_Write(GPIOC,(u16)(0xff));
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (56.53 KB, 下載次數: 90)
下載附件
2017-5-6 19:53 上傳
下載:
32單片機實現按鍵功能.zip
(2.85 MB, 下載次數: 84)
2017-5-6 09:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|