文章目录
题目描述
一、题目分析及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场