蓝桥杯STM32自学笔记_LCD显示屏实践
前言
笔记是人类的第二大脑,以前的我也总是在记录上所懈怠,遇到不会的就csdn cv 一顿操作,始终不得其内涵。从这个赛事开始,我来学习大佬在嵌入式上的理解,自己做好每次记录,辅助记忆的同时也能亲手过一次知识与项目。希望能在赛事上大放光彩
一、LCD常见函数
//常用函数
/* 初始化LCD显示屏 */
void LCD_Init(void);
/* 设置文本颜色 */
void LCD_SetTextColor(vu16 Color);
/* 设置背景颜色 */
void LCD_SetBackColor(vu16 Color);
/* 清除指定行的内容 */
void LCD_ClearLine(u8 Line);
/* 清除整个屏幕并设置背景颜色 */
void LCD_Clear(u16 Color);
/* 设置光标位置 */
void LCD_SetCursor(u8 Xpos, u16 Ypos);
/* 绘制一个字符 */
void LCD_DrawChar(u8 Xpos, u16 Ypos, uc16 *c);
/* 在指定行和列上显示一个ASCII字符 */
void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii);
/* 在指定行上显示一个字符串,这个字符串从ptr指向的内存地址开始,直到遇到空字符结束*/
void LCD_DisplayStringLine(u8 Line, u8 *ptr);
//不常用函数
/* 设置显示窗口的位置和大小 */
void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width);
/* 禁用窗口模式 */
void LCD_WindowModeDisable(void);
/* 绘制线条 */
void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction);
/* 绘制矩形 */
void LCD_DrawRect(u8 Xpos, u16 Ypos, u8 Height, u16 Width);
/* 绘制圆形 */
void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius);
/* 绘制单色图像 */
void LCD_DrawMonoPict(uc32 *Pict);
/* 写入BMP图像 */
void LCD_WriteBMP(u32 BmpAddress);
/* 绘制BMP图像 */
void LCD_DrawBMP(u32 BmpAddress);
/* 绘制指定格式的图片 */
void LCD_DrawPicture(const u8* picture);
/* 写入LCD寄存器 */
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue);
/* 读取LCD寄存器的值 */
u16 LCD_ReadReg(u8 LCD_Reg);
/* 准备写入RAM的操作 */
void LCD_WriteRAM_Prepare(void);
/* 写入RGB颜色值到RAM中 */
void LCD_WriteRAM(u16 RGB_Code);
/* 从RAM中读取颜色值 */
u16 LCD_ReadRAM(void);
/* 配置LCD控制线 */
void LCD_CtrlLinesConfig(void);
/* 配置数据总线为输入模式 */
void LCD_BusIn(void);
/* 配置数据总线为输出模式 */
void LCD_BusOut(void);
二、LCD原理图
移植例程的函数有配置引脚,所以看看就好~
三、使用LCD流程
1.移植官方例程LCD库及字符库并调用
3.配置keil5的.c文件
4.main.c引用led.h文件
#include "lcd.h"
5.初始化lcd
切记!得放在2,我原先放在1然后怎么都显示不出来,最后才发现gpio口还没弄就初始化肯定没办法哇(浪费了好多时间 哭死)
LCD_Init(void);
至此,可以使用LCD显示屏啦!
四、代码实战
实验目标
按下按键1,显示页面1 TEST ON
按下按键2,显示页面2 TEST OFF
按下按键3,显示“number:”,蓝底黑字,并将之前的按键次数综合显示出来
实验步骤
1.配置按键函数,配置LCD
前文及以前文章有配置,不再赘述
2.修改一下LCD库
lcd.c文件
#include "stido.h"
void page1(void)
{
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line0, (uint8_t *)" ");
LCD_DisplayStringLine(Line1, (uint8_t *)" ");
LCD_DisplayStringLine(Line2, (uint8_t *)" ");
LCD_DisplayStringLine(Line3, (uint8_t *)" ");
LCD_DisplayStringLine(Line4, (uint8_t *)" TEST ");
LCD_SetBackColor(White);
LCD_SetTextColor(Blue);
LCD_DisplayStringLine(Line5, (uint8_t *)" ON ");
LCD_DisplayStringLine(Line6, (uint8_t *)" ");
LCD_DisplayStringLine(Line7, (uint8_t *)" ");
LCD_DisplayStringLine(Line8, (uint8_t *)" ");
LCD_DisplayStringLine(Line9, (uint8_t *)" ");
}
void page2(void)
{
LCD_Clear(Blue);
LCD_SetBackColor(Red);
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line0, (uint8_t *)" ");
LCD_DisplayStringLine(Line1, (uint8_t *)" ");
LCD_DisplayStringLine(Line2, (uint8_t *)" ");
LCD_DisplayStringLine(Line3, (uint8_t *)" ");
LCD_DisplayStringLine(Line4, (uint8_t *)" TEST ");
LCD_SetBackColor(Red);
LCD_SetTextColor(Blue);
LCD_DisplayStringLine(Line5, (uint8_t *)" OFF ");
LCD_DisplayStringLine(Line6, (uint8_t *)" ");
LCD_DisplayStringLine(Line7, (uint8_t *)" ");
LCD_DisplayStringLine(Line8, (uint8_t *)" ");
LCD_DisplayStringLine(Line9, (uint8_t *)" ");
}
void lcd_print(int backcolor,int textcolor,int Variable)
{
LCD_SetBackColor(backcolor);
LCD_SetTextColor(textcolor);
char text[30];
sprintf(text,"NUMBER:%d ",Variable);
LCD_DisplayStringLine(Line9, (uint8_t *)text);
}
lcd.h文件
/*----- myself -----*/
void page1(void);
void page2(void);
void lcd_print(int backcolor,int textcolor,int Variable);
3.编写主函数代码
/* USER CODE BEGIN WHILE */
int cnt=1;
int number[2]={0};
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int num=keynum();
if(num>0)
{
cnt++;
}
if(cnt<3)
{
number[cnt-1]=num;
}
if(cnt>2)
{
number[0]=number[1];
number[1]=num;
}
switch(number[1])
{
case 1:
page1();
break;
case 2:
page2();
break;
case 3:
lcd_print(Blue,Black,cnt-1);
break;
}
}
/* USER CODE END 3 */
至此,实验现象完成!
五、LCD与LED引脚冲突问题
原理图可知,LED的引脚是跟LCD引脚冲突的,复用引脚嘛。
根据csdn的大佬所教,在这三个函数的头尾加上操作寄存器的语句就能解决了。
//函数头加上:
u16 pcout = GPIOC->ODR;
//函数尾加上:
GPIOC->ODR = pcout;
理由:
GPIOC->ODR 是一个寄存器,ODR 通常代表输出数据寄存器(Output Data Register),用于控制连接到 GPIOC 端口的引脚的高低电平状态。
本例中LCD和LED使用了相同的GPIOC,并且在操作LCD时可能会不小心改变了应该控制LED的引脚状态。为了避免这种情况,你可以在操作LCD之前保存当前GPIOC端口的状态,并在操作完成后恢复它。这样可以确保在LCD操作期间不会影响到LED的状态。
总结
太粗心没注意配置顺序,导致花了很多很多无用功的时间,这是继“锁存器”后第二个马虎的地方,切记。
作者:道池浅