文章目录
- 一、按键轮询
- (一)分析按键的电路连接
- 1. 按键原理图
- 2. 按键消抖
- 二、分析芯片手册
- (一) GPIO章节
- (二)RCC章节
- 三、代码
- (一)key.c
- (二)key.h
一、按键轮询
(一)分析按键的电路连接
KEY1----PF9
1. 按键原理图
原理图可知,左侧有一个上拉电阻,当按键抬起时,key1处悬空,电压为3.3V;
当按键按下时,电路导通,key1处电压为0。
因此检测到低电平时,说明按键按下;高电平,说明按键抬起状态。
2. 按键消抖
机械按键本身就存在抖动,因此需要进行滤波处理
硬件滤波:滤波电容,用于硬件滤波,电容会充电放电,使key1处的电压变化不会过快
软件消抖:延时消抖,当检测到按键按下时,延时一段时间,再次检测按键的状态
二、分析芯片手册
(一) GPIO章节
(二)RCC章节
三、代码
(一)key.c
#include "../include/key.h"
extern void delay_ms(unsigned int ms);void key_init(void){//使能时钟__HAL_RCC_GPIOF_CLOCK_ENABLE();//配置按键gpio_init_t gpioInit;gpioInit.pin=KEY1_PIN;gpioInit.Moder_init=GPIO_INPUT_MODE;gpioInit.Pupdr_init=GPIO_NO_PUPD;gpio_init(GPIOF,&gpioInit);
}key_state_t key1_pull(void){if(gpio_read_pin(GPIOF,KEY1_PIN)==GPIO_PIN_RESET){//低电平说明按键按下delay_ms(10);//延时消抖if(gpio_read_pin(GPIOF,KEY1_PIN)==GPIO_PIN_RESET){while(gpio_read_pin(GPIOF,KEY1_PIN)==GPIO_PIN_RESET);//等待按键松开return KEY_DOWN;}}return KEY_UP;
}
(二)key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "../include/gpio.h"
#include "../include/rcc.h"
/**** KEY1---PF9* KEY2---PF7* KEY3---PF8***/
#define KEY1_PIN PIN_9
#define KEY2_PIN PIN_7
#define KEY3_PIN PIN_8typedef enum{KEY_DOWN=0, //按键按下为低电平KEY_UP //按键抬起为高电平
}key_state_t;void key_init(void);key_state_t key1_pull(void);#endif