蓝桥杯第十二届省赛真题
一、所遇问题
(1)
这个程序的应用是在LCD上面,打印字符出来。这个问题的出现是因为头文件没有包含#include"stdio.h"包含之后就不会报错了
(2)
记住要把所有的浮点数后面都要加上f才不会有警告 ,或者写成double也不会出现警告
(3)
too few arguments in function call LCD_Clear();这句话的意思就是在LCD_Clear()这个函数里面缺少参数,所以要写成LCD_Clear(Black);才不会报错
二、底层配置
(1)LED底层配置
在CubeMx里面除了要配置SYS、RCC 、时钟树 24 80 之外,还要配置一下LED的GPIO口:PC8~PC15,还有要记住开一下PD2,然后就可以创建文件了
根据原理图来看,只有把PC8~PC15都拉高,这样上电之后的LED才是灭掉的
这个图就是解释了左移八位的原理,以及6 5 转化为二进制的简要方法,这个图应用于LED的Keil底层函数里面
led.c
#include "led.h"
void LED_Disp(uchar dsLED)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
led.h
#ifndef __LED_H
#define __LED_H
#include "main.h"
void LED_Disp(uchar dsLED);
#endif
main.c
首先就是头文件要包含“led.h”,然后要初始化LED:LED_Disp(0x00);最后要在while循环里面写一个 LED测试的代码
LED_Disp(0x00);
LED_Disp(0x01);
HAL_Delay(500);
LED_Disp(0x00);
HAL_Delay(500);
(2)LCD底层配置
CubeMx
在CubeMx里面什么都不需要配置,只需要配置一个RCC、SYS以及时钟树的24 80 然后生成文件就可以了
Keil
在生成的文件里面建一个BSP包,并且在BSP包里面放进LCD的驱动文件:lcd.c lcd.h 要在keil里面添加好这两个文件
main.c
首先要添加一下头文件 #include "lcd.h",注意使用到sprintf的时候要写“stdio.h”这个头文件,不然会有警告
然后我们要在int main ()函数里面,根据题目要求,我们要写一下LCD的初始化、LCD的文本颜色设置和背景颜色设置
LCD_Init();
LCD_Clear(Black);
LCD_SetTextColor(Black);
LCD_SetBackColor(White);
然后我们要写一下LCD显示封装函数,在int main ()函数外面 首先最上面一行是固定显示的,所以直接可以用LCD_DisplayStringLine(Line2,(uint8_t *)" Data ");使用这个函数前面一定要加上(uint8_t *)虽然不知道为什么,但是如果不加的话就会有警告。
LCD_DisplayStringLine()这个函数里面有两个参数,一个就是显示的行数,一个就是(uint8_t*)加上要显示的内容。如果要显示的是一个“hello” ,就直接(uint8_t*)加上一个"hello",如果要显示的是一个可以实时变换的变量,那么可以(uint8_t *)加上text这个字符串变量。综上也就是(uint8_t*)加上你要显示的东西
LCD_DisplayStringLine(Line2,(uint8_t *)" Data ");
如果想要将某变量的值实时显示在LCD屏幕上,就要通过spritf函数将变量赋值到一个字符串数组中,再通过LCD_DisplayStingLine函数显示该字符串数组
char text[30];
uint i=2;
sprintf(text," CNBR:%d ",i);
LCD_DisplayStringLine(Line3,(uint8_t*)text);
在一个函数中如果需要多个sprintf来显示字符串,那么也只需要一个char text[30];来封装想要表达的字符串,下面的LCD_DisplayStringLine也只需要选定行数然后显示text
如果需要显示变量的话,那么就在sprintf后面写上这个变量,同时在前面用%d或者%f等来表达这个变量,具体的%d%f的使用方法看后面解释
int a=2,b=4,c=2;
double A=3.50,B=2.00;
void disp_proc(void)
{
char text[30];
if(view==0)
{
LCD_DisplayStringLine(Line2,(uint8_t*)" Data ");
sprintf(text," CNBR:%d ",a);
LCD_DisplayStringLine(Line4,(uint8_t *)text);
sprintf(text," VNBR:%d ",b);
LCD_DisplayStringLine(Line6,(uint8_t*)text);
sprintf(text," IDLE:%d ",c);
LCD_DisplayStringLine(Line8,(uint8_t*)text);
}
if(view==1)
{
LCD_DisplayStringLine(Line2,(uint8_t*)" Para ");
sprintf(text," CNBR:%.2f ",A);
LCD_DisplayStringLine(Line4,(uint8_t *)text);
sprintf(text," VNBR:%.2f ",B);
LCD_DisplayStringLine(Line6,(uint8_t *)text);
}
}
(3) Key底层配置