因为是按键输入,所以创立两个文件 bsp_key.c和bsp_key.h文件。
一、bsp_key.c中需要对按键进行初始化,这个和LED的类似,GPIOA-G均是挂在APB2上的。
1、时钟:故时钟均为RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)。不同的是,KEY1是在GPIOA,KEY2是在GPIOC。故时钟分别为RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);和RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
KEY1_GPIO_CLK和KEY2_GPIO_CLK需要在头文件里定义。
2、模式:GPIO_Mode_IN_FLOATING; //浮动输入
3、按键检测函数:uint8_t key_scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);需要有两个参数,和LED一样,1个是确定GPIO,1个是哪个位(GPIO_Pin控制的是BSRR和BRR寄存器)
二、bsp_key.h文件对按键1和2进行宏定义,以及按键初始化函数和按键检测函数的声明。这里面宏定义的KEY_ON和KEY_OFF是为了方便判断按键是否按下
因为GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)的返回值是0和1,宏定义是为了更加直观的判断按键是否按下,故才宏定义1和0
三、在bsp_led.h中
#define LED1_TOGGLE {LED1_GPIO_PORT->ODR ^=LED1_GPIO_PIN;} //绿灯状态翻转
#define LED3_TOGGLE {LED3_GPIO_PORT->ODR ^=LED3_GPIO_PIN;} //红灯状态翻转
四、在main.c中
int main(void)
{
LED_GPIO_Config();
KEY_GPIO_Config();
while(1)
{
if(key_scan(GPIOA,KEY1_GPIO_PIN)==KEY_ON)
LED1_TOGGLE;
if(key_scan(GPIOC,KEY2_GPIO_PIN)==KEY_ON)
LED3_TOGGLE;
}
}
代码如下
main.c
//bsp_key.c
//bsp_key.h
bsp_led.c
bsp_led.h
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!