本次的代碼全是在上次代碼之上添加的.
1.user下新建文件夾key,新建bsp_key.h bsp_key.c文件.
2.keil項目添加bsp_key.c,魔術棒C/C++中include path添加key文件夾.
3.相應的源碼為:
bsp_key.h中內容
//條件編譯,防止重復定義頭文件(stm32f10x.h在這里引入,但是在主函數中仍然引入,會被加載兩次,若沒有添加編譯會報錯.)
#ifndef BSP_KEY_H_ #define BSP_KEY_H_ #include "stm32f10x.h" #define KEY_ON 1 #define KEY_OFF 0 #define KEY_LED_GPIO_PIN GPIO_Pin_13 #define KEY_LED_GPIO_PORT GPIOC #define KEY_LED_GPIOC_CLOCK RCC_APB2Periph_GPIOC void KEY_LED_Config(void); uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin); #endif
bsp_key.c中內容
//只需要包含自身的頭文件即可
#include "bsp_key.h"
//配置按鍵的GPIOC,配置完成后通過檢測GPIOC的pin13引腳(對應的寄存器為GPIOC-IDR-PIN13)的高低電平 判斷鍵是否被按下,高--按下,低--未按下 void KEY_LED_Config(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(KEY_LED_GPIOC_CLOCK, ENABLE); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Pin=KEY_LED_GPIO_PIN; GPIO_Init(KEY_LED_GPIO_PORT, &GPIO_InitStruct); }
//檢測案件是否按下函數 GPIO_ReadInputDataBit 庫函數中函數,含義為 檢測某個GPIOX的某個pin的電平
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin){ /*檢測是否有按鍵按下 */ if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==KEY_ON){ /*等待按鍵釋放 */ while(GPIO_ReadInputDataBit( GPIOx, GPIO_Pin)==KEY_ON) ; return KEY_ON ; }else return KEY_OFF; }
main函數中內容
#include "stm32f10x.h" // 相當於51單片機中的 #include <reg51.h> #include "bsp_led.h" #include "bsp_key.h" #define SOFT_DELAY Delay(0x0FFFFF); //void Delay(__IO u32 nCount); void Delay( uint32_t count){ for( ;count!=0;count--); } int main(void) { // 來到這里的時候,系統的時鍾已經被配置成72M。 LED_GPIO_Config();
//默認情況,燈為滅的.(LED電路圖為低電平點亮,配置完成后默認為低電平,即便是不賦值也會亮起來) LED_OFF; KEY_LED_Config(); while(1){ if(Key_Scan(KEY_LED_GPIO_PORT,KEY_LED_GPIO_PIN)==KEY_ON){ LED_TOGGLE; //有按鍵按下,燈的亮滅翻轉一次 } } }