按鍵和小燈一樣,也是通過GPIO外設與主板連接,也是通過GPIO_InitStruct類型結構體控制其工作。
查閱技術手冊,按鈕連接GPIOA控制下的管腳0.
但與之不同的是,按鍵是一種輸入設備,輸入設備的工作狀態也有四類,模擬輸入,浮空輸入,下拉輸入和上拉輸入。
模擬輸入就是輸入一個波形,浮空輸入指的是未按下按鈕時,不確定此管腳的信號狀態。
上拉輸入指按下按鈕時,輸出低電平,即0,松開按鈕時,輸出高電平,即1.
下拉輸入則相反。
但是因為STM32的構造問題,按鈕只能采用上拉輸入,如果將此管腳工作狀態定義為下拉輸入,則輸出會保持0.
可能是因為管腳A1STM32的設計上就是接地的,因此,下拉輸入,按下按鈕后依然保持了低電平。
用GPIO_ReadInputDataBit函數讀取某個管腳的輸入輸出,注意此函數返回值是u8,無符號8位整數。
在key.h/.c文件中定義和實現按鈕初始化和讀取按鈕功能。
#include <stm32f10x.h> #ifndef _KEY_H #define _KEY_H void KEY_configer(void); u8 KEY_scan(void); #endif //key.h
#include <stm32f10x.h> #include <key.h> void KEY_configer(){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_KEY_INIT; GPIO_KEY_INIT.GPIO_Pin=GPIO_Pin_0; GPIO_KEY_INIT.GPIO_Speed=GPIO_Speed_2MHz; GPIO_KEY_INIT.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(GPIOA,&GPIO_KEY_INIT); } u8 KEY_scan(){ return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0); } //key.c
在led.h/.c中定義小燈初始化和開關
#include <stm32f10x.h> #ifndef _LED_H #define _LED_H void LED_configer(void); void LED_on(void); void LED_off(void); #endif //led.h
#include <led.h> #include <stm32f10x.h> void LED_configer(){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_LED_INIT; GPIO_LED_INIT.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; GPIO_LED_INIT.GPIO_Speed=GPIO_Speed_2MHz; GPIO_LED_INIT.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&GPIO_LED_INIT); } void LED_on(){ GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4); } void LED_off(){ GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4); } //led.c
主函數的實現邏輯是,不斷詢問按鈕狀態,若按下則打開小燈,若未按下則關閉小燈
#include <stdio.h> #include <stm32f10x.h> #include <led.h> #include <key.h> int main(){ KEY_configer(); LED_configer(); while(1){ if(KEY_scan()==0){ LED_on(); }else{ LED_off(); } } return 0; } //main.c