蓝桥杯嵌入式备赛(三)—— 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);
相关推荐
小杨爱搞嵌入式9 分钟前
【STM32】GPIO的输入输出
c语言·笔记·stm32·单片机·学习
牛客企业服务1 小时前
AI面试系统助手深度评测:6大主流工具对比分析
数据库·人工智能·python·面试·职场和发展·数据挖掘·求职招聘
不会先思考2 小时前
A3.0:防反接和防倒灌的物理意义
单片机·嵌入式硬件
饶宇航4 小时前
嵌入式开发硬件——单片机
单片机·嵌入式硬件
CC呢7 小时前
基于单片机万年历/时钟/语音时钟
单片机·嵌入式硬件·万年历·智能时钟
爱coding的橙子13 小时前
每日算法刷题Day58:8.7:leetcode 单调栈5道题,用时2h
算法·leetcode·职场和发展
Monika Zhang13 小时前
【面试攻略】回答Java面试问题「挑战与解决方案」技巧
面试·职场和发展
Net_Walke14 小时前
【FreeRTOS 】任务通知
单片机·物联网
BOB_BOB_BOB_14 小时前
【ee类保研面试】数学类---概率论
面试·职场和发展·概率论·保研
爱coding的橙子14 小时前
每日算法刷题Day57:8.6:leetcode 单调栈6道题,用时2h
算法·leetcode·职场和发展