|
這期教程重點(diǎn)講GPIO的按鍵實(shí)驗(yàn)。
準(zhǔn)備材料
- 帶有按鍵的Stm32開發(fā)板一塊
- Stm32庫(kù)函數(shù)參考,
按鍵實(shí)驗(yàn)和點(diǎn)燈實(shí)驗(yàn)其實(shí)差不多, GPIO點(diǎn)燈是向led的pin腳輸出高低電平, 而按鍵則是向pin口輸入高低電平。 對(duì)于按鍵有兩種輸入模式可以選擇, 一,采用上拉輸入模式,二,采用浮動(dòng)浮空輸入模式,上拉輸入模式在沒有按鍵按下的時(shí)候是默認(rèn)是高電平。正好符合這個(gè)要求。電路原理圖如圖所示:
%E7%94%B5%E8%B7%AF.jpg (19.35 KB, 下載次數(shù): 159)
下載附件
2015-7-9 01:15 上傳
本實(shí)驗(yàn)采用了GPIO與RCC片上外設(shè),因此要添加stm32f10x_gpio.h stm32f10x_rcc.h到工程模板中。
關(guān)鍵代碼
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#define ON 1
#define OFF 0
#define KEY_ON 0
#define KEY_OFF 1
void Key_GPIO_Config() //按鍵初始化
{
GPIO_InitTypeDef GPIO_InitStructrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructrue.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_IPU; //使用上拉輸入
GPIO_Init(GPIOC, &GPIO_InitStructrue);
}
uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) //鍵盤掃描函數(shù)
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON) //讀取電平狀態(tài)
{
Delay(0x7ffff);
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
{
return KEY_ON;
}
return KEY_OFF;
}
else
{
return KEY_OFF;
}
}
int main()
{
Led_GPIO_Config(); // led初始化
Key_GPIO_Config(); // 按鍵初始化
GPIO_SetBits(GPIOB, GPIO_Pin_5); //點(diǎn)亮led燈
while(1)
{
if(Key_Scan(GPIOC, GPIO_Pin_5) == KEY_ON) //鍵盤掃描函數(shù)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5)))); //led狀態(tài)反轉(zhuǎn)
}
}
return 0;
}
代碼分析
首先從main函數(shù)開始,Led_GPIO_Config該函數(shù)是初始化按鍵要點(diǎn)亮熄滅的led燈,Key_GPIO_Config函數(shù)為初始化按鍵的 GPIO口,這里要注意輸入模式為上拉輸入,接著進(jìn)入鍵盤掃描函數(shù)Key_Scan, 不斷掃描該按鍵對(duì)應(yīng)的pin口, 判斷其電平是否有變化。
進(jìn)入該函數(shù)里面用了GPIO_ReadInputDataBit該函數(shù)來讀取pin口電平狀態(tài)。打開stm32庫(kù)函數(shù)參考手冊(cè),
QQ%E5%9B%BE%E7%89%8720141119231632.jpg (39.63 KB, 下載次數(shù): 203)
下載附件
2015-7-9 01:15 上傳
可以看到, 該函數(shù)的的返回值即為輸入端口額管腳值。注意:在按鍵中,必須要有一個(gè)防抖動(dòng)的檢測(cè)。判斷按鍵是否真的被按下了。 如果真的被按下,則使led狀態(tài)反轉(zhuǎn)。
接下來我們來分析下這條語句GPIO_WriteBit(GPIOB, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5)))); 最外層GPIO_WriteBit函數(shù)功能如圖所示,
WriteBit.jpg (39.45 KB, 下載次數(shù): 159)
下載附件
2015-7-9 01:15 上傳
功能為設(shè)置或清除該端口值, 還有要注意第三個(gè)參數(shù)的類型, BitAction 在代碼中追蹤下,
BitActipon.jpg (6.64 KB, 下載次數(shù): 150)
下載附件
2015-7-9 01:15 上傳
便可知道,這個(gè)是個(gè)枚舉類型, 這條語句的具體意思就讀取PB5的當(dāng)前輸出電平,然后再用1減去讀取電平的數(shù)據(jù)狀態(tài), 相當(dāng)于與當(dāng)前的輸出的狀態(tài)相反。給開發(fā)板供電DC5V, 插上J-Link,將編譯好的程序下載到開發(fā)板, LED1亮,按下按鍵時(shí), LED1熄滅。
|
|