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

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

相关文章:

  • Java 泛型
  • 生活之味:苦与甜的交织-中小企实战运营和营销工作室博客
  • 大模型叙事下的百度智能云:比创新更重要的,是创新的扩散
  • 第九课:WebSocket与实时通信技术解析
  • TCP三次握手与四次挥手详解:建立与断开连接的底层逻辑
  • mysql主从复制
  • python pip及常用国内镜像源
  • Java爬虫测试淘宝快递费接口的完整指南
  • Visual Studio 安装及使用教程(Windows)【安装】
  • QT系列教程(15) 鼠标事件
  • LuaJIT 学习(1)—— LuaJIT介绍
  • RabbitMQ重复消费如何解决
  • flutter 如何与原生框架通讯安卓 和 ios
  • 虚拟展览馆小程序:数字艺术与文化展示的新形式探索
  • Java EE 进阶:SpringBoot 配置⽂件
  • Day07 -实例 非http/s数据包抓取工具的使用:科来 wrieshark 封包监听工具
  • mingw32编译ffmpeg
  • 【Python】Selenium根据网页页面长度,模拟向下滚动鼠标,直到网页底部的操作
  • es6 尚硅谷 学习
  • 面试之《实现Event Bus》
  • “铁血防守”制造8年最快丢球,恐惧中的阿森纳什么也做不了
  • 北大深圳研究生院成立科学智能学院:培养交叉复合型人才
  • 成都世运会倒计时100天,中国代表团运动员规模将创新高
  • 辽宁辽阳市白塔区一饭店发生火灾,事故已造成22人遇难3人受伤
  • 鄂湘赣“中三角”,能否走向文旅C位?
  • “天链”继续上新!长三乙火箭成功发射天链二号05星