蓝桥杯嵌入式备赛(三)—— 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);
相关推荐
森焱森34 分钟前
垂起固定翼无人机介绍
c语言·单片机·算法·架构·无人机
独行soc1 小时前
2025年渗透测试面试题总结-2025年HW(护网面试) 33(题目+回答)
linux·科技·安全·网络安全·面试·职场和发展·护网
brave and determined2 小时前
国产MCU学习Day11——CW32F030C8T6 低电压检测器(LVD)详解与应用
单片机·嵌入式硬件·嵌入式·国产mcu·cw32f030c8t6·cw32f030c8t6lvd·低电压检测器
金色光环6 小时前
stm32与tp-linkv2接线、解决识别不到芯片问题
stm32·单片机·嵌入式硬件
森焱森8 小时前
APM与ChibiOS系统
c语言·单片机·算法·架构·无人机
Thomas_YXQ9 小时前
Unity3D游戏内存优化指南
游戏·unity·职场和发展·性能优化·蓝桥杯·游戏引擎·unity3d
Y1nhl10 小时前
力扣_链表_python版本
开发语言·python·算法·leetcode·链表·职场和发展
Wangshanjie_9810 小时前
【STM32】-单片机数据通讯基本概念
stm32·单片机