当前位置: 首页 > article >正文

32单片机——KEY

        KEY0、KEY1和KEY2是低电平有效的,而KEY_UP则是高电平有效的,并且外部都没有上下拉电阻,所以需要在STM32F103内部设置上下拉,来确定设置空闲电平状态 

代码 

通过开发板上的三个独立按键控制LED灯:KEY_UP控制蜂鸣器翻转,KEY1控制LED1翻转,KEY2控制LED0翻转,KEY0控制LED0/LED1同时翻转

led.h

#ifndef _LED_H
#define _LED_H
//led初始化
void led_init(void);
#endif

led.c

#include "./BSP/LED/led.h"
#include "./SYSTEM/sys/sys.h"
//led初始化

void led_init(void){
    GPIO_InitTypeDef g_gppio_struct;
    __HAL_RCC_GPIOE_CLK_ENABLE();  //使能时钟--PE5
    __HAL_RCC_GPIOB_CLK_ENABLE();  //使能时钟--PB5
    
    g_gppio_struct.Pin=GPIO_PIN_5;
    g_gppio_struct.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    g_gppio_struct.Pull=GPIO_NOPULL;  //无上下拉
    g_gppio_struct.Speed=GPIO_SPEED_FREQ_HIGH;  //高速
    HAL_GPIO_Init(GPIOE,&g_gppio_struct);  //初始化LED1
    
    g_gppio_struct.Pin=GPIO_PIN_5;
    g_gppio_struct.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    g_gppio_struct.Pull=GPIO_NOPULL;  //无上下拉
    g_gppio_struct.Speed=GPIO_SPEED_FREQ_HIGH;  //高速
    HAL_GPIO_Init(GPIOB,&g_gppio_struct);  //初始化LED0
}

beep.h

#ifndef _BEEP_H
#define _BEEP_H
#include "./SYSTEM/sys/sys.h"
//beep初始化
void beep_init(void);
void set_beep(uint8_t flag);
#endif

beep.c

#include "./BSP/BEEP/beep.h"
//beep初始化
void beep_init(void){
    GPIO_InitTypeDef g_gppio_struct;
    __HAL_RCC_GPIOB_CLK_ENABLE();  //使能beepIO口时钟
    
    g_gppio_struct.Pin=GPIO_PIN_8;  //引脚号
    g_gppio_struct.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    g_gppio_struct.Pull=GPIO_NOPULL;  //没有上下拉
    g_gppio_struct.Speed=GPIO_SPEED_FREQ_HIGH;  //高速
    HAL_GPIO_Init(GPIOB,&g_gppio_struct);
}
void set_beep(uint8_t flag){
   if(flag){
       HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
   }else{
       HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
   }
}

key.h

#ifndef _KEY_H
#define _KEY_H
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#define KEY0 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)
#define KEY1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)
#define KEY2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)
#define KEY_UP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
//key初始化
void key_init(void);
//按键扫描函数
uint8_t scan(uint8_t mode);
#endif

key.c

#include "./BSP/KEY/key.h"
//key初始化
/*
KEY0----PE4----输入上拉
KEY1----PE3----输入上拉
KEY2----PE2----输入上拉
KEY_UP----PA0----输入下拉
*/
void key_init(void){
    GPIO_InitTypeDef g_key_struct;
    //时钟使能
    __HAL_RCC_GPIOE_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    //KEY0
    g_key_struct.Pin=GPIO_PIN_4;
    g_key_struct.Mode=GPIO_MODE_INPUT;  //输入模式
    g_key_struct.Pull=GPIO_PULLUP;  //上拉
    g_key_struct.Speed=GPIO_SPEED_FREQ_HIGH;  //高速
    HAL_GPIO_Init(GPIOE,&g_key_struct);
    //KEY1
    g_key_struct.Pin=GPIO_PIN_3;
    HAL_GPIO_Init(GPIOE,&g_key_struct);
    //KEY2
    g_key_struct.Pin=GPIO_PIN_2;
    HAL_GPIO_Init(GPIOE,&g_key_struct);
    //KEY_UP
    g_key_struct.Pin=GPIO_PIN_0;
    g_key_struct.Pull=GPIO_PULLDOWN;  //下拉
    HAL_GPIO_Init(GPIOA,&g_key_struct);
}
//按键扫描函数
uint8_t scan(uint8_t mode){
    static uint8_t key_up = 1; /*按键按松开标志*/
    uint8_t keyval= 0;
    if (mode)key_up = 1; /*支持连按*/
    if (key_up && ( KEY0 == 0 ||KEY1 == 0 ||KEY2 == 0 ||KEY_UP == 1)){ /*按键松开标志为1,且有任意一个按键按下了*/
        delay_ms(20);  /*去抖动*/
        key_up = 0;
        if (KEY0== 0) keyval=1;
        if (KEY1== 0) keyval=2;

        if (KEY2== 0) keyval=3;
        if (KEY_UP== 1) keyval=4;
    }else if (KEY0== 1 && KEY1 == 1 && KEY2 == 1 && KEY_UP == 0){ /*没有任何按键按下,标记按键松开*/
        key_up = 1;
    }
    return keyval; /*返回键值*/
}

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"

int main(void){
    HAL_Init();
    sys_stm32_clock_init(RCC_PLL_MUL9);
    delay_init(72);
    led_init();
    beep_init();
    while(1){
        set_beep(1);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);  //熄灭
        HAL_Delay(2000);
        set_beep(0);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);  //点亮
        HAL_Delay(2000);
    }
}


http://www.kler.cn/a/582950.html

相关文章:

  • Linux第19节 --- 用户缓冲区和文件系统
  • Hi3516DV300 移植Qt
  • PyTorch深度学习框架进阶学习计划 - 第21天:自然语言处理基础
  • 尚硅谷爬虫note16
  • 计算机操作系统(二) 操作系统的发展过程
  • 从学习ts的三斜线指令到项目中声明类型的最佳实践
  • winform中chart控件解决显示大量曲线数据卡顿方法——删旧添新法
  • linux下的离线升级替换脚本参考
  • ThinkPHP6用户登录系统的全过程
  • WPS二次开发系列:Android 第三方应用如何获取WPS端内文档
  • 计算机网络——DHCP
  • 蓝桥杯软件比赛_蓝桥杯软件比赛:软考前的实战演练场
  • 编写Dockerfile制作Redis镜像,生成镜像名为redis:v1.1,并推送到私有仓库。
  • 面试之《vue keep-alive原理》
  • Redis存数据就像存钱:RDB定期存款 vs AOF实时记账
  • 《HTML视觉大框架:构建现代网页设计的基石》
  • JVM内存结构笔记04-字符串常量池
  • CentOS 7系统初始化及虚拟化环境搭建手册
  • 基于django+vue的购物商城系统
  • 05.基于 TCP 的远程计算器:从协议设计到高并发实现