按鍵輸入實(shí)驗(yàn)
1.首先,按鍵實(shí)驗(yàn)是GPIO口的另一應(yīng)用,上一次的跑馬燈實(shí)驗(yàn)是將GPIO口作為輸出,此次按鍵實(shí)驗(yàn)是將GPIO口作為輸入。
2.GPIO作為輸入時(shí)和輸入的不同:
(1)首先,上拉電阻是為了保證在沒(méi)有信號(hào)輸入的時(shí)候,IO口保持高電平,若按鍵為低電平有效,則沒(méi)有信號(hào)的時(shí)候,IO應(yīng)呈現(xiàn)高電平,所以,此處應(yīng)設(shè)置為上拉輸入。
同理,下拉電阻是為了保證在沒(méi)有信號(hào)輸入的時(shí)候,IO口保持低電平,若按鍵為高電平有效,則沒(méi)有信號(hào)的時(shí)候,IO應(yīng)呈現(xiàn)低電平。
然后再配置一下IO口引腳,初始化PA0即可。作為輸入時(shí),不需要配置速度。
(2)GPIO口各項(xiàng)功能配置完畢之后就是編寫按鍵函數(shù)。庫(kù)函數(shù)操作為:GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);若是很簡(jiǎn)單要實(shí)現(xiàn)按鍵控制LED燈的功能,只需如下的代碼:
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-702440.html
這里led燈的轉(zhuǎn)換是通過(guò)位帶操作的,具體操作是在LED.h里寫如下代碼:#define LED0 PAout(0)即可
考慮道按鍵防抖,寫了如下的按鍵掃描函數(shù):
?
一.STM32 IO 口簡(jiǎn)介
STM32 的 IO 口 做輸入使用的時(shí)候,是通過(guò)調(diào)用函數(shù) GPIO_ReadInputDataBit()來(lái)讀取 IO 口的狀態(tài)的。 這一節(jié),我們將通過(guò) MiniSTM32 開(kāi)發(fā)板上載有的 3 個(gè)按鈕(KEY0/KEY1/WK_UP),來(lái)控 制板上的 2 個(gè) LED,其中 KEY0 控制 DS0,按一次亮,再按一次,就滅。KEY1 控制 DS1,效 果同 KEY0。WK_UP 按鍵則同時(shí)控制 DS0 和 DS1,按一次,他們的狀態(tài)就翻轉(zhuǎn)一次。
二.硬件設(shè)計(jì)
本實(shí)驗(yàn)用到的硬件資源有: 1) 指示燈 DS0、DS1 2) 3 個(gè)按鍵:KEY0、KEY1 和 KEY_UP。 DS0、DS1 和 STM32 的連接在上一節(jié)跑馬燈已經(jīng)介紹了,在 MiniSTM32 開(kāi)發(fā)板上的按鍵 KEY0連接在 PC5 上、KEY1 連接在 PA15 上、WK_UP 連接在 PA0 上。如下圖所示:
?
三.軟件設(shè)計(jì)
??????? 打開(kāi)我們的按鍵實(shí)驗(yàn)工程可以看到,我們引入了key.c文件以及頭文件key.h。下面我們首先打開(kāi)key.c文件,代碼如下:
??? #include "key.h"
??? #include "delay.h"
??? //按鍵初始化函數(shù) ?
??? //PA15和 PC5 設(shè)置成輸入
??? void KEY_Init(void)
??? { ?
??????? GPIO_InitTypeDefGPIO_InitStructure;
??????? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//使能 PORTA,PORTC時(shí)鐘
??????? GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //關(guān)閉 jtag,使能 SWD,可以用 SWD模式調(diào)試
??????? GPIO_InitStructure.GPIO_Pin? = GPIO_Pin_15;//PA15 ?
??????? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置成上拉輸入 ?
??????? GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 GPIOA15?? ?
??????? GPIO_InitStructure.GPIO_Pin? = GPIO_Pin_5;//PC5 ?
??????? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置成上拉輸入? ?
??????? GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
??????? GPIOC5?? ?
??????? GPIO_InitStructure.GPIO_Pin? = GPIO_Pin_0;//PA0 ?
??????? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0設(shè)置成輸入,默認(rèn)下拉??? ?
??????? GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 GPIOA.0 ?
??? }
??? //按鍵處理函數(shù)
??? //返回按鍵值
??? //mode:0,不支持連續(xù)按;1,支持連續(xù)按;
??? //返回值:
??? //0,沒(méi)有任何按鍵按下
??? //KEY0_PRES,KEY0按下
??? //KEY1_PRES,KEY1按下
??? //WKUP_PRES,WK_UP按下 ?
??? //注意此函數(shù)有響應(yīng)優(yōu)先級(jí),KEY0>KEY1>WK_UP!!
??? u8 KEY_Scan(u8 mode)
??? {??? static u8 key_up=1;//按鍵按松開(kāi)標(biāo)志 ?
???????? if(mode)key_up=1;? //支持連按???? ?
???????? if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
???????? {? ?
?????????? delay_ms(10);//去抖動(dòng)?? ?
?????????? key_up=0;? ?
?????????? if(KEY0==0)return KEY0_PRES;? ?
?????????? else if(KEY1==0)return KEY1_PRES;? ?
?????????? else if(WK_UP==1)return WKUP_PRES;? ?
???????? }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;??????? ?
???????? return 0;// 無(wú)按鍵按下
??? }
??? ?
??? ????????????????
這段代碼包含2個(gè)函數(shù),void KEY_Init(void)和u8 KEY_Scan(u8 mode),KEY_Init是用來(lái)初始化按鍵輸入的IO口的。實(shí)現(xiàn)PA0、PA15和PC5的輸入設(shè)置。接下來(lái)我們看看頭文件key.h里面的代碼。
?
??? #ifndef __KEY_H
??? #define __KEY_H? ?
??? #include "sys.h"
??? #define KEY0? GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//讀取按鍵 0
??? #define KEY1? GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//讀取按鍵 1
??? #define WK_UP? GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//讀取按鍵 2?? ?
??? #define KEY0_PRES 1? //KEY0? ?
??? #define KEY1_PRES 2? //KEY1 ?
??? #define WKUP_PRES 3? //WK_UP
#endif這段代碼里面最關(guān)鍵就是3個(gè)宏定義: ?
??? #define KEY0??? GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//讀取按鍵 0
??? #define KEY1??? GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//讀取按鍵 1
??? #define WK_UP?? GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//讀取按鍵 2
?
main.c里面編寫的主函數(shù)代碼如下:
??? #include "led.h"
??? #include "delay.h"
??? #include "sys.h"
??? #include "key.h"
??? //按鍵輸入實(shí)驗(yàn)???? ?
??? int main(void) ?
??? {?? u8 t;??? ?
??????? delay_init();?????? //延時(shí)函數(shù)初始化??? ?
??????? LED_Init();????? //初始化與 LED連接的硬件接口
??????? KEY_Init();?????????? //初始化與按鍵連接的硬件接口
??????? LED0=0;???? //點(diǎn)亮 LED ?
??????? while(1) ?
??????? {? ?
????????? t=KEY_Scan(0);? //得到鍵值? ?
????????? switch(t)? ?
????????? {??????? ?
??????????? case KEY0_PRES:??? ?
??????????? LED0=!LED0;??? ?
??????????? break;?? ?
??????????? case KEY1_PRES:??? ?
??????????? LED1=!LED1;??? ?
??????????? break;?? ?
??????????? case WKUP_PRES:?????? ?
??????????? LED0=!LED0;?? ?
??????????? LED1=!LED1;??? ?
??????????? break;?? ?
??????????? default:??? ?
??????????? delay_ms(10);?? ?
??????????? }? ?
??????? }?? ?
??? }
最后編程運(yùn)行程序出現(xiàn)下圖表示沒(méi)有錯(cuò)誤:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-702440.html
?
到了這里,關(guān)于按鍵輸入實(shí)驗(yàn)--GPIO做輸入-學(xué)習(xí)筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!