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

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

目录

  • 一、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.kler.cn/a/535080.html

相关文章:

  • SpringBoot+Dubbo+zookeeper 急速入门案例
  • 洛谷网站: P3029 [USACO11NOV] Cow Lineup S 题解
  • [25] cuda 应用之 nppi 实现图像色彩调整
  • 【Linux网络编程】:URL(encode),HTTP协议,telnet工具
  • Got socket exception during request. It might be caused by SSL misconfiguration
  • “AI智能分析综合管理系统:企业管理的智慧中枢
  • 虚拟机搭建---K8S环境
  • GoFrame 微服务脚手架模块 (v2.8.x)
  • LeetCode 72.编辑距离
  • UE5 蓝图学习计划 - Day 14:搭建基础游戏场景
  • MySQL InnoDB引擎 高度为3的B+树,可以存储的数据量
  • 高级java每日一道面试题-2025年01月30日-框架篇[SpringBoot篇]-如何理解 Spring Boot 配置加载顺序 ?
  • 树欲静而凤不止
  • redis之RDB持久化过程
  • Spring Boot整合MQTT
  • 2025游戏行业的趋势预测
  • GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读
  • Docker镜像管理:掌握save/load与export/import的精髓
  • 90.子集||
  • python学opencv|读取图像(五十五)使用cv2.medianBlur()函数实现图像像素中值滤波处理
  • node.js使用mysql2对接数据库
  • 【分布式理论五】分布式调用(3):服务注册与发现
  • Python批量重命名文件的实用案例
  • 【Linux高级IO】五种IO模型
  • 手写MVVM框架-渲染v-for列表(修改List)
  • VUE 集成企微机器人通知