蓝桥杯嵌入式 省赛题思路梳理+代码 第十一届 第2场


题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


一、题目分析及CubeMX配置

基于官方给的HAL_06_LCD

1.题目分析

在这里插入图片描述

2.CubeMX配置

2.1 GPIO

在这里插入图片描述

2.2 TIM3_CH1

在这里插入图片描述

2.3 TIM17_CH1

在这里插入图片描述

2.4 ADC

在这里插入图片描述

二、LCD

//1.lcd 
u8 lcd_state = 0; //0:Data   1:Para
u8 display_buf[20];
u8 mode = 0; //0:AUTO 1:MANU
u8 pulse6 = 10;
u8 pulse7 = 10;
double volt;
void LCD_Process(void) {
	if (lcd_state == 0) {  //0:Data
		LCD_DisplayStringLine(Line0, (uint8_t *)"      Data");
		sprintf((char *)display_buf,"    V:%4.2fV",volt);
		LCD_DisplayStringLine(Line2,display_buf);
		if (!mode) {  //AUTO 
			LCD_DisplayStringLine(Line4, (uint8_t *)"    Mode:AUTO");
		}else {       //MANU
			LCD_DisplayStringLine(Line4, (uint8_t *)"    Mode:MANU");
		}
	}
	if (lcd_state == 1) {  //1:Para
		LCD_DisplayStringLine(Line0, (uint8_t *)"      Para");
		sprintf((char *)display_buf,"    PA6:%2d",pulse6);
		LCD_DisplayStringLine(Line2,display_buf);
		sprintf((char *)display_buf,"    PA7:%2d",pulse7);
		LCD_DisplayStringLine(Line4,display_buf);
	}
}

三、按键

//2.key
__IO uint32_t keyTick = 0;
void KEY_Process(void) {
	if (uwTick - keyTick < 10)  return ;
	keyTick = uwTick;
	
	Key_read();
	if (Trg & 0x01) { //B1
		lcd_state = (lcd_state + 1)%2;
		LCD_Clear(Black);
	}
	if (Trg & 0x02) { //B2
		if ((lcd_state == 1)&&(mode == 1)) {  //Para&MANU
			if ((pulse6 + 10) <= 90) pulse6 = pulse6 + 10;
			else pulse6 = 10;
		}
	}
	if (Trg & 0x04) { //B3
		if ((lcd_state == 1)&&(mode == 1)) {  //Para&MANU
			if ((pulse7 + 10) <= 90) pulse7 = pulse7 + 10;
			else pulse7 = 10;
		}
	}
	if (Trg & 0x08) { //B4
		mode = (mode + 1 )%2;
	}
}

key.c

#include "key.h"

#define KB1 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)
#define KB2 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
#define KB3 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)
#define KB4 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)

#define KEYPORT KB1 | (KB2 << 1) | (KB3 << 2) | (KB4 << 3) | 0XF0

u8 Trg; //全局变量,单次触发
u8 Cont;//全局变量,长按

void Key_read(void)
{
	u8 ReadData = (KEYPORT)^0XFF;
	Trg = ReadData & (ReadData ^ Cont);
	Cont = ReadData;
}

key.h

#ifndef __KEY_H
#define __KEY_H

#include "main.h"

extern u8 Trg; //全局变量,单次触发
extern u8 Cont;//全局变量,长按

void Key_read(void);

#endif

四、ADC

//3.adc
u32 adc_val;
void ADC_Process(void) {
	adc_val = HAL_ADC_GetValue(&hadc2);
	volt = adc_val/4095.0f * 3.3f;
	HAL_ADC_Start(&hadc2);
}

五 、PWM

//4.pwm
void PWM_Process(void) {
	if (mode == 0) {//AUTO 
		pulse6 = pulse7 = (int)(volt/3.3*100);
		TIM3->CCR1 = (int)(pulse6/100 * 10000);
		TIM17->CCR1 = (int)(pulse7/100*5000);
	} else {  //MANU
		TIM3->CCR1 = (int)(pulse6/100 * 10000);
		TIM17->CCR1 = (int)(pulse7/100*5000);
	}
}

六 、LED

//5.led
u8 led_ctrl = 0x00;
void LED_Process(void) {
	if (mode == 0) {
		led_ctrl |= 0x01;
	}else {
		led_ctrl &= ~0x01;
	}
	if (lcd_state == 0) {
		led_ctrl |= 0x02;
	}else {
		led_ctrl &= ~0x02;
	}
	
	LED_Ctrol(led_ctrl);
}

led.c

#include "led.h"


void LED_Ctrol(u8 led_ctrl)
{
	HAL_GPIO_WritePin(GPIOC, 0xff00, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
	
	HAL_GPIO_WritePin(GPIOC, led_ctrl<<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 Liushuideng(void) {
	int i;
	for (i = 0; i <= 7; i++) {
		LED_Ctrol(0x01 << i);
		HAL_Delay(500);
	}
}

led.h

#ifndef __LED_H
#define __LED_H

#include "main.h"

void LED_Ctrol(u8 led_ctrl);
void Liushuideng(void);

#endif

七、初始化部分以及while循环

  /* USER CODE BEGIN 2 */
	
	LCD_Init();
	HAL_ADC_Start(&hadc2);
	LED_Ctrol(0X00);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		LCD_Process();
		KEY_Process();
		ADC_Process();
		PWM_Process();
		LED_Process();
  }
  /* USER CODE END 3 */

视频演示

蓝桥杯嵌入式 省赛题 第十一届 第2场

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小唐YiJiaTang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值