1、分析按键的电路图
分析电路可知,当按键没按下时,key1处电压为3.3V,gaodianping
按下后,电压为0,低电平
2、分析芯片手册
1. RCC_MP_AHB4ENSETR 使用GPIOF外设时钟源
2. GPIOx_MODER 设置gpio引脚为输入模式
3. GPIOx_PUPDR 禁止GPIO引脚的上下组电阻
4. GPIOx_IDR 检测gpio引脚的输入的状态
3、编写KEY1按键轮询检测的代码
轮询检测就是在while(1)的死循环中不停的检测KEY1按键对应的引脚的输入的状态。
检测KEY1按键的状态,然后控制LED1灯的状态。
直接复制上一个实验的文件,新建以下文件
key.h
封装key
#ifndef _KEY_H_
#define _KEY_H_
#include "../include/gpio.h"
#define KEY1 GPIO_PIN_9
#define KEY2 GPIO_PIN_7
#define KEY3 GPIO_PIN_8
void key_init();
gpio_statu_t key_scan(gpio_t *GPIOx, uint32_t keys);
#endif /*_KEY_H_*/
key.c
key的初始化key_init(){
输入模式
禁用上下拉电阻(按键自带上拉电阻)
配置IDR
}
gpio_statu_t key_scan(key_t keyx,key_statue_t keystatue){
按键消抖
松手检测
将按键的状态返回出去
}
#include "../include/key.h"
extern void delay_ms(unsigned int ms);
void key_init(){
//使GPIOF时钟
RCC->MP_AHB4ENSETR |=(1<<5);
//GPIO配置
gpioinit_t keyInit;
keyInit.mode=Input_mode;
keyInit.pupd=No_pull_up_down;
keyInit.pins=GPIO_PIN_9 | GPIO_PIN_7 |GPIO_PIN_8;//三个按键全部初始化
hal_gpio_init(GPIOF,&keyInit);
}
gpio_statu_t key_scan(gpio_t *GPIOx, uint32_t keys){
if(GPIOF->IDR & keys){//检测按下
delay_ms(5);//消抖
if(GPIOF->IDR & keys){
while(!(GPIOF->IDR & keys));//没松手就一直在循环里
return GPIO_Reset_Pin;//按键确实按下,返回低电平
}
}
return GPIO_Set_Pin;//抖动,按键没按下,返回高电平
}
main.c
在main里进行判断判断,哪个按键按下,哪个灯亮
#include "include/led.h"
#include "include/key.h"
void delay_ms(unsigned int ms){
int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 1800; j++)
;
}
int main(){
led_init();
key_init();
while (1){
if(key_scan(GPIOF,KEY1)){
hal_gpio_tooglePin(GPIOE,GPIO_PIN_10);
}
if(key_scan(GPIOF,KEY2)){
hal_gpio_tooglePin(GPIOF,GPIO_PIN_10);
}
if(key_scan(GPIOF,KEY3)){
hal_gpio_tooglePin(GPIOE,GPIO_PIN_8);
}
}
}