蓝桥杯STM32自学记录_LCD显示屏

本文介绍了如何在嵌入式开发中使用LCD显示屏,包括LCD的基本函数如初始化、颜色设置和内容清除,以及在实际项目中的按键控制和页面切换。还提到了LCD与LED引脚冲突的解决方法。
摘要由CSDN通过智能技术生成

前言

笔记是人类的第二大脑,以前的我也总是在记录上所懈怠,遇到不会的就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的状态。


总结

太粗心没注意配置顺序,导致花了很多很多无用功的时间,这是继“锁存器”后第二个马虎的地方,切记。

  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值