实验二 按键轮询检测实验

1、分析按键的电路图

image-20230717145328406

分析电路可知,当按键没按下时,key1处电压为3.3V,gaodianping

按下后,电压为0,低电平                                                                                                               

image-20230717145351868

image-20230717150432502

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);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值