STM32使用1.69寸液晶显示模块使用缓冲区实现快速刷新全屏显示字符串功能

这篇具有很好参考价值的文章主要介绍了STM32使用1.69寸液晶显示模块使用缓冲区实现快速刷新全屏显示字符串功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一个1.69寸SPI接口的液晶显示模块,有320*240=76800个点,每个点有2个字节表示RGB的颜色,所以需要153.6K个字节的数据来刷新全屏,如果SPI口输出数据不是高速并且不紧密排列的话,刷新就会比较慢,有从下到下的肉眼可见的刷新过程,现就是希望使用数据缓冲区(我理解这就是显存的概念吧)来快速刷新显示区域。
原始的单个字符的显示程序:

/******************************************************************************
      函数说明:显示单个字符
      入口数据:x,y显示坐标
                num 要显示的字符
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值:  无
******************************************************************************/
void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
	uint8_t temp,sizex,t,m=0;
	uint16_t i,TypefaceNum;//一个字符所占字节大小
	uint16_t x0=x;
	sizex=sizey/2;
	TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
	num=num-' ';    //得到偏移后的值
	LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  //设置光标位置
	for(i=0;i<TypefaceNum;i++)
	{ 
		if(sizey==12)temp=ascii_1206[num][i];		       //调用6x12字体
		else if(sizey==16)temp=ascii_1608[num][i];		 //调用8x16字体
		else if(sizey==24)temp=ascii_2412[num][i];		 //调用12x24字体
		else if(sizey==32)temp=ascii_3216[num][i];		 //调用16x32字体
		else return;
		for(t=0;t<8;t++)
		{
			if(!mode)//非叠加模式
			{
				if(temp&(0x01<<t))LCD_WR_DATA(fc);		//每一个点发送2个字节数据
				else LCD_WR_DATA(bc);
				m++;
				if(m%sizex==0)
				{
					m=0;
					break;
				}
			}
			else//叠加模式
			{
				if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//画一个点
				x++;
				if((x-x0)==sizex)
				{
					x=x0;
					y++;
					break;
				}
			}
		}
	}   	 	  
}

由if(temp&(0x01<<t))LCD_WR_DATA(fc); //每一个点发送2个字节数据
else LCD_WR_DATA(bc);
这几句说明每个点,由SPI发送2个字节的数据出去,而且是一边计算数据,一边发送数据,速度较慢,可以肉眼可见的逐字显示的。

改用缓冲区显示单个字符:

void LCD_ShowChar_new(uint16_t x,uint16_t y,uint8_t num,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
	uint8_t temp,sizex,t,m=0;
	uint16_t i,TypefaceNum;//一个字符所占字节大小
	uint16_t x0=x;
	sizex=sizey/2;
	TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
	num=num-' ';    //得到偏移后的值
	//LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  	//设置光标位置
	//uint8_t data[TypefaceNum * 2 * 8];	//=========
	static uint8_t data[1024];				//=========重要,用静态变量,或者用全局变量,一个字符作为一个缓冲区
	uint16_t xx = 0;
	for(i=0; i<TypefaceNum; i++)
	{
		if(sizey==12)temp=ascii_1206[num][i];		       	//调用6x12字体
		else if(sizey==16)temp=ascii_1608[num][i];		 	//调用8x16字体
		else if(sizey==24)temp=ascii_2412[num][i];		 	//调用12x24字体
		else if(sizey==32)temp=ascii_3216[num][i];		 	//调用16x32字体
		else return;
		for(t=0;t<8;t++)
		{
			if(!mode)//非叠加模式  带缓冲区,实现快显示功能
			{
				if(temp&(0x01<<t))
				{
					data[xx++] = fc>>8;
					data[xx++] = fc;
//					data[i*2*8 + t] == fc<<8;
//					data[i*2*8 + t + 1] == fc;
//					LCD_WR_DATA(fc);
				}
				else
				{
					data[xx++] = bc>>8;
					data[xx++] = bc;
//					data[i*2*8 + t] == bc<<8;
//					data[i*2*8 + t + 1] == bc;
//					LCD_WR_DATA(bc);
				}
				m++;
				if(m%sizex==0)
				{
					m=0;
					break;
				}
			}
			else//叠加模式
			{
				if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//画一个点
				x++;
				if((x-x0)==sizex)
				{
					x=x0;
					y++;
					break;
				}
			}
		}
	}
	while(HAL_SPI_GetState(&hspi1)==HAL_SPI_STATE_BUSY_TX);    	//等待SPI发送完成
	LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  //设置光标位置
	//while(HAL_SPI_GetState(&hspi1)==HAL_SPI_STATE_BUSY_TX);    	//等待SPI发送完成
	HAL_SPI_Transmit_DMA(&hspi1, &data, TypefaceNum * 2 * 8);		//这句有严重问题,会死机,OK
//	while(HAL_SPI_GetState(&hspi1)==HAL_SPI_STATE_BUSY_TX);    	//等待SPI发送完成

}

使用缓冲区的方法还是和全屏刷新一样,先把数据都放在数组,然后一次性SPI口发送出去。
缓冲区的大小是按照32字体大小的字符来计算,32字体是 16*32=512个点,1024个字节,所以使用data是1024个字节的缓冲区,这个缓冲区必须是静态或者全局的(这个问题困扰了我好久,一开始就是显示不正常,或者死机),我的理解是SPI要取数据发送,但缓冲区没有了,被系统回收了。
使用缓冲区后,字符显示都是直接显示,不再是一个一个字符逐个显示的感觉了文章来源地址https://www.toymoban.com/news/detail-809135.html

到了这里,关于STM32使用1.69寸液晶显示模块使用缓冲区实现快速刷新全屏显示字符串功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)

    LCD (Liquid Crystal Display) 液晶显示屏是一种广泛使用的一种字符型液晶显示模块。其中型号1602表示每行显示16个字符、一共2行。LCD1602相比于OLED最大的好处就是不用使用SPI或I2C等任何通信协议,而是由mbed直接将命令传给LCD从而实现控制。 LCD1602主要参数如下: 显示字符:16×2个

    2024年02月05日
    浏览(51)
  • STM32—LCD液晶显示屏

    目录 LCD液晶显示屏介绍 液晶的组成  物理特性 液晶显示屏内部构造  颜色深度 点亮LCD显示屏 查看原理图 图片显示 保存到工程用户代码的Inc目录下 参数为数组名 字符显示  汉字显示 某些物质在熔融状态或被溶剂溶解之后,尽管失去固态物质的刚性,却获得了液体的易流动

    2024年02月04日
    浏览(50)
  • LCD-STM32液晶显示中英文-(7.字模及显示原理)

    目录 字模介绍 什么是字模 字模的构成 字模显示原理 字模制作 如何制作字模 字模寻址公式 存储字模文件         有了编码,我们就能在计算机中处理、存储字符了,但是如果计算机处理完字符后直接以编码的形式输出,人类将难以识别。因此计算机与人交互时,一般会

    2024年02月17日
    浏览(63)
  • STM32学习记录0010——TFTLCD液晶显示屏

    《STM32不完全手册》第18章 《ILI9341数据手册》 TFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使

    2023年04月09日
    浏览(48)
  • LCD—STM32液晶显示(1.显示器简介及LCD显示原理)(6000字详细介绍)

    目录 显示器简介 液晶显示器 液晶 像素 液晶屏缺点 LED显示器 OLED显示器 显示器的基本参数 STM32板载液晶控制原理(不带微控制器) 液晶控制原理 控制信号线(不带液晶控制器) 液晶数据传输时序 显存 总结 3.2寸液晶屏介绍(搭载液晶控制器) 3.2寸电阻触摸屏实物 ILI9341液晶

    2024年02月17日
    浏览(52)
  • LCD—STM32液晶显示(3.NOR FLASH时序结构体)

    目录 LCD结构体配置  NOR FLASH时序结构体 FSMC的NOR FLASH初始化结构体         与控制SRAM时一样,控制FSMC使用NOR FLASH存储器时主要是配置时序寄存器以及控制寄存器,利用ST标准库的时序结构体以及初始化结构体可以很方便地写入参数。 FSMC_AddressSetupTime 本成员设置地址建立

    2024年02月17日
    浏览(47)
  • LCD-STM32液晶显示中英文-(5.字符编码)

    目录 字符编码 字符编码说明参考网站 字符编码 ASCII编码 ASCII编码介绍 ASCII编码表 中文编码 1. GB2312标准 区位码  2. GBK编码 3. GB18030 各个标准的对比说明 4. Big5编码 字符编码及转换测试:导航菜单 - 千千秀字 Unicode官网:Index。 使用举例: keil5设置编码如下:         由于

    2024年02月17日
    浏览(52)
  • STM32之LCD液晶屏(ILI9341)显示图片

    本文章基于STM32F103VET6,参考野火的驱动程序,用LCD液晶屏显示静态图像。 有纰漏请指出,转载请说明。 学习交流请发邮件 1280253714@qq.com 显示一个像素点 将rgb888图片转为rgb555 输出rgb555的C语言数组 数组的每一个元素对应一个像素点的rgb三个通道的数据,用stm32的FSMC模拟8080时

    2024年02月09日
    浏览(48)
  • LCD-STM32液晶显示中英文-(6.unicode字符集)

    目录 Unicode字符集和编码 UTF-32 UTF-16 UTF-8(重点:必须掌握) BOM ANSI         由于各个国家或地区都根据使用自己的文字系统制定标准,同一个编码在不同的标准里表示不一样的字符,各个标准互不兼容,而又没有一个标准能够囊括所有的字符,即无法用一个标准表达所有

    2024年02月16日
    浏览(41)
  • 基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块+DHT11温湿度采集+MQ系列 烟雾及可燃气体+蜂鸣器+步进电机模拟窗帘+OLED液晶显示+

    ## **基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块(阿里云 或ONENET或局域网)+DHT11温湿度采集+MQ系列 烟雾及可燃气体+蜂鸣器+步进电机模拟窗帘+OLED液晶显示+手机APP)** 本文采用LD3320语音识别芯片+ESP8266 WIFI模块+DHT11温湿度采集+MQ系列 烟雾及可

    2024年02月04日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包