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

目录

一、LED

1、原理图介绍

  如果所示,STM32G431RBT6中有八个LED ,由八个GPIO控制,分别为PC8-15 ,当输出为低电平时点亮 。其中,74HC573(U1)表示为锁存器,当锁存器打开的时候,右侧GPIO的输出(即锁存器的输入D)可以通过锁存器到达左侧(即锁存器的输出Q) 。加锁存器的目的是由于PC8-15引脚有复用功能,当作为其他功能使用时,防止影响LED。

  74HC573芯片 内部结构图如下图所示,LE引脚高电平有效,OE则低电平有效。在上面图中,OE已经接地,所以PD2控制的LE输入为高电平时锁存器打开,低电平时锁存器关闭

2、程序代码

c 复制代码
// 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
c 复制代码
// 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);
}
c 复制代码
// 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函数,经典四行:
c 复制代码
   key_val = KEY_Scan();
   key_down = key_val & (key_val ^ key_old);
   key_up = ~key_val & (key_val ^ key_old);
   key_old = key_val;

以下是完整程序代码:

c 复制代码
// key.h
#ifndef __KEY_H__
#define __KEY_H__

extern void KEY_Init(void);
extern unsigned char KEY_Scan(void);

#endif
c 复制代码
// 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;
}
c 复制代码
// 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 *)进行显示。

c 复制代码
char lcd_disp[21];

sprintf(lcd_disp, "     i num: %03d      ", key_num);
LCD_DisplayStringLine(Line4, (u8 *)lcd_disp);
相关推荐
朝发如雪15 小时前
快速掌握单片机基础(1)(嵌入式基本概念)
单片机
szxinmai主板定制专家15 小时前
【嵌入式实战】RK3588+GMSL多路相机采集方案|SerDes长距离低延时视频流落地教程
人工智能·单片机·机器人·边缘计算·zynq
LCG元15 小时前
STM32F103 SPI 驱动 W5500 以太网模块实战:硬件协议栈寄存器体系、Socket 状态机避坑与 TCP 吞吐实测
stm32·单片机·嵌入式硬件
Zhang.Yi16 小时前
STM32-SPI
stm32·单片机·嵌入式硬件
en.en..16 小时前
网络分层封装 与 TCP粘包的因果关系
网络·单片机·嵌入式硬件
天空'之城16 小时前
单片机基础核心知识点汇总(三十九)
单片机·嵌入式硬件
mk01516 小时前
电动自行车汽车工业系统电机驱动100V高压恒定导向芯片进口替代
驱动开发·单片机·硬件工程·智能硬件·pcb工艺
yuanxi20018 小时前
圣湘生物的三重转变:用PSS⁵价值力看懂从卖单品到卖经营价值
职场和发展·创业创新·学习方法
逐步前行18 小时前
ESP32-S3-FreeRTOS-同步互斥(IPC)
单片机
单片机仿真设计19 小时前
【proteus仿真】基于 STM32F103 的汽车温度监测系统(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·课设