欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 蓝桥杯嵌入式备赛(三)—— LED +按键 + LCD

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

2025/2/8 13:58:50 来源:https://blog.csdn.net/qq_51405411/article/details/145478984  浏览:    关键词:蓝桥杯嵌入式备赛(三)—— 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);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com