蓝桥杯嵌入式备赛(三)—— 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);
相关推荐
程序员三藏3 分钟前
软件测试之功能测试详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
集思广益的灰太狼31 分钟前
静电的起因与静电效应:技术分析与应用
单片机·硬件工程
憧憬一下1 小时前
stm32之FLASH
stm32·单片机·嵌入式
@NachoNEKO3 小时前
一种资源有限单片机处理cJSON数据的方法
单片机·嵌入式硬件
qq_301881693 小时前
XD08M3232接近感应单片机的接近感应模块的工作原理
单片机·嵌入式硬件·硬件架构
爱学习的小旭3 小时前
STMCubeMX使用TB6612驱动编码轮并进行测速
单片机·嵌入式硬件
技能咖4 小时前
探索AI新领域:生成式人工智能认证(GAI认证)助力职场发展
人工智能·职场和发展
不脱发的程序猿4 小时前
MCU裸机程序如何移植到RTOS?
单片机·嵌入式硬件·rtos
PAQQ4 小时前
【python】windows实现与k230使用socket通信并传输文件
python·stm32·单片机
小智学长 | 嵌入式4 小时前
单片机-STM32部分:14、SPI
单片机·嵌入式硬件