蓝桥杯嵌入式备赛(三)—— LED +按键 + LCD

news/2025/2/8 13:01:10/

目录

  • 一、LED
    • 1、原理图介绍
    • 2、程序代码
  • 二、按键
    • 1、原理图介绍
    • 2、程序代码
  • 三、LCD
    • 1、原理图介绍
    • 2、程序代码

一、LED

1、原理图介绍

  如果所示,STM32G431RBT6中有八个LED,由八个GPIO控制,分别为PC8-15,当输出为低电平时点亮。其中,74HC573(U1)表示为锁存器,当锁存器打开的时候,右侧GPIO的输出(即锁存器的输入D)可以通过锁存器到达左侧(即锁存器的输出Q)。加锁存器的目的是由于PC8-15引脚有复用功能,当作为其他功能使用时,防止影响LED。
在这里插入图片描述
  74HC573芯片内部结构图如下图所示,LE引脚高电平有效,OE则低电平有效。在上面图中,OE已经接地,所以PD2控制的LE输入为高电平时锁存器打开,低电平时锁存器关闭
在这里插入图片描述

2、程序代码

// led.h
#ifndef __LED_H__
#define __LED_H__extern void LED_Init(void);						
extern void LED_Disp(unsigned char uch);
extern void LED_Tog(unsigned char uch);#endif
// led.c
#include "led.h"
#include "main.h"void LED_Init(void)
{//此处省略 CUBEMX自动生成代码
}
void LED_Disp(unsigned char uch)
{// 先将八个LED置为高电平,熄灭,然后锁存器打开关闭HAL_GPIO_WritePin(GPIOC, 0xff << 8, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);// 将uch8中为1的bit位点亮,然后锁存器打开关闭HAL_GPIO_WritePin(GPIOC, uch << 8, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}void LED_Tog(unsigned char uch)
{// 将uch8中为1的bit位反转HAL_GPIO_TogglePin(GPIOC, uch << 8);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
// main.c
#include "main.h"
#include "led.h"void SystemClock_Config(void);// 示例代码
int main(void)
{HAL_Init();SystemClock_Config();LED_Init();while (1){LED_Disp(0xaa);HAL_Delay(2000);LED_Tog(0x03);HAL_Delay(2000);LED_Tog(0xff);HAL_Delay(2000);}
}

二、按键

1、原理图介绍

  如果所示,STM32G431RBT6中有4个按键,由4个GPIO控制,分别为PB0、PB1、PB2和PA0当按键按下时GPOIO为低电平
在这里插入图片描述

2、程序代码

编写程序有三步:

  1. 在key.c中编写key_scan函数,返回哪个按键被按下;
  2. 定义变量:嘀嗒定时器开始值,四个key变量(unsigned char);
  3. 在main.c中编写key_proc函数,经典四行:
   key_val = KEY_Scan();key_down = key_val & (key_val ^ key_old);key_up = ~key_val & (key_val ^ key_old);key_old = key_val;

以下是完整程序代码:

// key.h
#ifndef __KEY_H__
#define __KEY_H__extern void KEY_Init(void);
extern unsigned char KEY_Scan(void);#endif
// key.c
#include "key.h"
#include "main.h"void KEY_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin : PA0 */GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/*Configure GPIO pins : PB0 PB1 PB2 */GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}unsigned char KEY_Scan()
{unsigned char key_num = 0;if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET){key_num = 1;}else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET){key_num = 2;}else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET){key_num = 3;}else if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){key_num = 4;}else{key_num = 0;}return key_num;
}
// main.c
#include "main.h"
#include "led.h"
#include "key.h"//定义变量
__IO uint32_t uwTick_start;		
unsigned char key_val, key_down, key_up, key_old;//定义函数
void SystemClock_Config(void);
void key_proc(void);int main(void)
{HAL_Init();SystemClock_Config();LED_Init();KEY_Init();while (1){key_proc();}
}void key_proc(void)
{//按键消抖if(uwTick - uwTick_start < 100) return;uwTick_start = uwTick;//四行key_val = KEY_Scan();key_down = key_val & (key_val ^ key_old);key_up = ~key_val & (key_val ^ key_old);key_old = key_val;//正式程序if(key_down == 4){LED_Tog(0xff);}if(key_down == 1)LED_Disp(0x00);}

三、LCD

1、原理图介绍

在这里插入图片描述

2、程序代码

   只需要将原有程序进行迁移即可。下面sprintf作用是:将key_num的值写入lcd-disp,然后将lcd_disp强转为(u8 *)进行显示。

char lcd_disp[21];sprintf(lcd_disp, "     i num: %03d      ", key_num);
LCD_DisplayStringLine(Line4, (u8 *)lcd_disp);

http://www.ppmy.cn/news/1570323.html

相关文章

python下载的包都在哪里

python下载的包所在位置 打开python的安装文件夹 找到Lib文件夹双击打开 找到site-packages文件夹打开&#xff0c;然后显示的就是下载的所有python包

python12-字段串操作

课程&#xff1a;B站大学 记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 字符串那些事儿 字符串转换类字符串对齐类字符串去除空白类字符串分割类字符串连接类编码解码…

JUC常见类

JUC是java.util.concurrent的简称&#xff0c;当中有我们需要熟知的常见类&#xff0c;此文为你带来相关知识 前面我们学习了3种创建线程的方法&#xff0c;分别是&#xff1a; 继承Thread类&#xff0c;重写run方法实现Runnable接口&#xff0c;重写run方法创建线程池&#x…

阿里云平台使用 DeepSeek 模型:完整开发指南

本文将详细介绍如何在阿里云平台上使用 DeepSeek 大语言模型,包括环境配置、基础调用、高级特性以及最佳实践等内容。 一、入门准备 1.1 环境配置 首先需要配置必要的开发环境: # 安装阿里云 DashScope SDK pip install alibabacloud_dashscope# 安装其他依赖包 pip insta…

CSS 伪类(Pseudo-classes)的详细介绍

CSS 伪类详解与示例 在日常的前端开发中&#xff0c;CSS 伪类可以帮助我们非常精准地选择元素或其特定状态&#xff0c;从而达到丰富页面表现的目的。本文将详细介绍以下伪类的使用&#xff1a; 表单相关伪类 :checked、:disabled、:enabled、:in-range、:invalid、:optional、…

CRM系统中的数据分析和报表功能如何帮助企业?

CRM系统中的数据分析和报表功能&#xff1a;企业战略决策的得力助手 在当今竞争激烈的商业环境中&#xff0c;企业要想保持竞争力并实现持续增长&#xff0c;必须依靠精准的数据分析来制定有效的战略决策。而客户关系管理&#xff08;CRM&#xff09;系统的数据分析与报表生成…

Canny 边缘检测

步骤 1.降噪 应用高斯滤波器&#xff0c;以平滑图像&#xff0c;滤除噪声。 边缘检测易受噪声影响&#xff0c;所以使用高斯滤波器平滑图像&#xff0c;降低噪声。 2.梯度 计算图像中每个像素点的梯度大小和方向。 计算大小 Sobel算子是一种常用的边缘检测滤波器&#xff…

深度剖析 C++17 中的 std::byte:解锁字节级编程新境界

文章目录 一、引入背景二、基本定义三、特性详解不可隐式转换为整型显式转换为unsigned char位运算支持字面量支持四、使用场景内存操作数据序列化与反序列化网络通信文件读写操作五、与其他数据类型的交互与字符类型的交互与整数类型的交互与指针类型的交互六、注意事项避免混…