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

ops/2025/2/13 21:11:41/

目录

  • 一、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/ops/157068.html

相关文章

spring 中 AspectJ 基于注解的实现分析

前面的文章介绍了 spring 引入 AspectJ 后&#xff0c;基于注解的 AOP 实现&#xff0c;今天我们来分析下这个实现的具体逻辑是怎么样的。 aspectj-autoproxy 解析 我们知道&#xff0c;基于注解的实现&#xff0c;在 xml 中除了需要配置切面类&#xff0c;还需要配置 aspecj…

使用rustDesk搭建私有远程桌面

一、rustDesk官方网站 RustDesk – 开源远程桌面访问软件 二、下载地址 客户端&#xff1a;https://github.com/rustdesk/rustdesk/releases/tag/1.2.7 服务端&#xff1a;https://github.com/rustdesk/rustdesk-server/releases/tag/1.1.11-1 三、服务端安装&#xff08;…

Visual Basic语言的区块链

Visual Basic语言与区块链技术的结合 引言 在当今数字化迅猛发展的时代&#xff0c;区块链技术以其去中心化、安全性和透明性等特点&#xff0c;逐渐成为各行各业的重要解决方案。与此同时&#xff0c;作为一种古老而经典的编程语言&#xff0c;Visual Basic&#xff08;VB&a…

RISCV基础知识

一、ISA指令集 ISA 命名格式&#xff1a;RV [###] [abc…xyz] RV&#xff1a;用于标识 RISC-V体系架构的前缀&#xff0c;既 RISC-V 的缩写。 [###] &#xff1a;{32, 64, 128} 用于标识处理器的字宽&#xff0c;也就是处理器的寄存器的宽度&#xff08;单位为bit&#xff0…

wordpressAI工具,已接入Deepseek 支持自动生成文章、生成图片、生成长尾关键词、前端AI窗口互动、批量采集等

基于关键词或现有内容生成SEO优化的文章&#xff0c;支持多种AI服务&#xff08;如OpenAI、百度文心一言、智谱AI等&#xff09;&#xff0c;并提供定时任务、内容采集、关键词生成等功能。 核心功能 文章生成 关键词生成&#xff1a;根据输入的关键词生成高质量文章。 内容…

亚博microros小车-原生ubuntu支持系列:24 巡线驾驶

这篇跟之前的颜色识别类似&#xff0c;亚博microros小车-原生ubuntu支持系列&#xff1a;21 颜色追踪-CSDN博客 1、程序功能说明 程序启动后&#xff0c;调整摄像头的俯仰角&#xff0c;把摄像头往下掰动&#xff0c;使得摄像头可以看到线&#xff0c;然后点击图像窗口&#…

【MySQL系列】记插入产生的死锁问题

???欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

DeepSeek R1本地化部署 Ollama + Chatbox 打造最强 AI 工具

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; Ollama &#x1f98b; 下载 Ollama&#x1f98b; 选择模型&#x1f98b; 运行模型&#x1f98b; 使用 && 测试 二&#xff1a;&#x1f525; Chat…