这个小实验主要还是利用到GPIO:
下面这个bsp_led.h文件使用寄存器版本写的
#ifndef __LED_H #define __LED_H #include"stm32f10x.h" //定义端口,时钟,引脚 #define red_PORT GPIOB #define red_PIN GPIO_Pin_5 #define red_LCK RCC_APB2Periph_GPIOB #define green_PORT GPIOB #define green_PIN GPIO_Pin_0 #define green_LCK RCC_APB2Periph_GPIOB #define blue_PORT GPIOB #define blue_PIN GPIO_Pin_1 #define blue_LCK RCC_APB2Periph_GPIOB #define ON 0 #define OFF 1 #define digitalHi(p,i) {p->BSRR=i;} //引脚输出高电平 #define digitalLo(p,i) {p->BRR=i;} //引脚输出低电平 #define digitalToggle(p,i) {p->ODR ^=i;} //反转 #define red_TOGGLE digitalToggle(red_PORT,red_PIN) #define red_OFF digitalHi(red_PORT,red_PIN) #define red_ON digitalLo(red_PORT,red_PIN) #define green_TOGGLE digitalToggle(green_PORT,green_PIN) #define green_OFF digitalHi(green_PORT,green_PIN) #define green_ON digitalLo(green_PORT,green_PIN) #define blue_TOGGLE digitalToggle(blue_PORT,blue_PIN) #define blue_OFF digitalHi(blue_PORT,blue_PIN) #define blue_ON digitalLo(blue_PORT,blue_PIN) void LED_GPIO_Config(void); #endif
下面是bsp_key.h文件:
#ifndef __KEY_H #define __KEY_H #include"stm32f10x.h" #define key_1_PORT GPIOA #define key_1_PIN GPIO_Pin_0 #define key_1_CLK RCC_APB2Periph_GPIOA #define key_2_PORT GPIOC #define key_2_PIN GPIO_Pin_13 #define key_2_CLK RCC_APB2Periph_GPIOC #define KEY_ON 1 #define KEY_OFF 0 void Key_GPIO_Config(void); uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin); #endif
下面是bsp_key.c文件:
#include"bsp_key.h" void Key_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(key_1_CLK|key_2_CLK,ENABLE); GPIO_InitStructure.GPIO_Pin=key_1_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(key_1_PORT,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=key_2_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(key_2_PORT,&GPIO_InitStructure); } 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; //才返回一个KEY_ON } else return KEY_OFF; }
下面是main.c文件
#include"stm32f10x.h" #include"bsp_led.h" #include"bsp_key.h" int main(void) { LED_GPIO_Config(); red_ON; Key_GPIO_Config(); while(1) { if(KEY_Scan(key_1_PORT,key_1_PIN) == KEY_ON )// { red_TOGGLE; //red(OFF); } if( KEY_Scan(key_2_PORT,key_2_PIN) == KEY_ON ) { green_TOGGLE; //green(ON); } } }
以上就是一个简单的通过按键反转LED的亮灭的代码文件,如有不妥,望请指正。