第九讲 单片机驱动彩色液晶屏 控制RA8889软件:显存操作

单片机驱动TFT彩色液晶屏系列讲座

目录

第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频
第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架
第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化
第四讲 单片机驱动彩色液晶屏 控制RA8889软件:绘图
第五讲 单片机驱动彩色液晶屏 控制RA8889软件:显示文字:Part1.内部字库
第六讲 单片机驱动彩色液晶屏 控制RA8889软件:显示文字:Part2.外接字库
第七讲 单片机驱动彩色液晶屏 控制RA8889软件:显示文字:Part3.自建字库
第八讲 单片机驱动彩色液晶屏 控制RA8889软件:显示图片
第九讲 单片机驱动彩色液晶屏 控制RA8889软件:显存操作
第十讲 单片机驱动彩色液晶屏 控制RA8889软件:图像运算
第十一讲 单片机驱动彩色液晶屏 控制RA8889软件:播放avi视频
第十二讲 单片机驱动彩色液晶屏 如何打包bin档
第十三讲 单片机驱动彩色液晶屏 bin档的烧录方法

RA8889内建128Mb显存;RA8876有两种,一种内建64Mb显存,另一种是外扩自己加SDRAM,内建或者外扩硬件上兼容,可灵活选用。

分辨率与显存的关系

举例来说明比较容易理解,比如800x480的分别率,要求显示16位色深,那么显存要求是:800x480*16/8=768000(Bytes);
如果要求显示的是24位色,那么显存要求是:800x480x24/8=1152000(Bytes)。

RA8889内建128Mb显存,即128/8=16MBytes,用在800x480@16位色,显示缓冲区为:16x1024/768≈21个;用在800x480@24位色,显示缓冲区为:16x1024/1152≈14个。

画布图像宽度、主图像宽度和活动窗口
  • 画布图像宽度(Canvas Image Width),是将显存规划出最大宽度,宽度一般设定为屏宽的倍数。用户必须配置画布图像宽度以确定图像大小,并在将数据写入图像缓冲区之前配置活动窗口(Active_Window)范围。
  • 主图像宽度(Main Image Width),规划出显示缓存宽度,这个值设定和画布图像宽度(Canvas Image Width)一样即可。通过设定Main_Window_Start_XY坐标,定位当前显示窗口要显示哪个区域的图像。
  • 活动窗口(Active_Window),在图层范围内规划一个区域用于写入数据,需要设定坐标和宽、高参数。

下图举例,假设液晶屏宽是800,画布图像宽度和主图宽度均设为1600,显示区域可以任意指定的,活动区域也可以任意指定的。
在这里插入图片描述
主要调用以下API函数:

    Canvas_Image_Start_address(0);    			//**[50h][51h][52h][53h]**//Canvas_image_width(canvas_image_width);		//**[54h][55h]**//Main_Image_Start_Address(0);				//**[20h][21h][22h][23h]**//Main_Image_Width(main_image_width);			//**[24h][25h]**//Main_Window_Start_XY(0, 0);    				//**[26h][27h][28h][29h]**//Active_Window_XY(0, 0);    					//**[56h][57h][58h][59h]**//Active_Window_WH(LCD_Width, LCD_Height);    //**[5Ah][5Bh][5Ch][5Dh]**//
SDRAM的读写

写点函数:

// Write pixel to SDRAM
// Not support MCU_16bit_ColorDepth_24bpp_Mode_1
void putPixel(unsigned short x // x of coordinate,unsigned short y // y of coordinate,unsigned long color/*color : 8bpp:R3G3B216bpp:R5G6B524bpp:R8G8B8 */
)
{Goto_Pixel_XY(x, y);LCD_CmdWrite(0x04);Check_Mem_WR_FIFO_not_Full();#ifdef MCU_8bit_ColorDepth_8bppLCD_DataWrite(color);
#endif
#ifdef MCU_8bit_ColorDepth_16bppLCD_DataWrite(color);Check_Mem_WR_FIFO_not_Full();LCD_DataWrite(color >> 8);
#endif
#ifdef MCU_8bit_ColorDepth_24bppLCD_DataWrite(color);Check_Mem_WR_FIFO_not_Full();LCD_DataWrite(color >> 8);Check_Mem_WR_FIFO_not_Full();LCD_DataWrite(color >> 16);
#endif
#ifdef MCU_16bit_ColorDepth_16bppLCD_DataWrite(color);
#endif
#ifdef MCU_16bit_ColorDepth_24bpp_Mode_2LCD_DataWrite(color);Check_Mem_WR_FIFO_not_Full();LCD_DataWrite(color >> 16);
#endif
}

读点函数:

// Read pixel from SDRAM
// Not support MCU_16bit_ColorDepth_24bpp_Mode_1
unsigned long ReadPixel(unsigned int x // x of coordinate,unsigned int y // y of coordinate/*color : 8bpp:R3G3B216bpp:R5G6B524bpp:R8G8B8 */
)
{unsigned long tmp;Check_2D_Busy();Goto_Pixel_XY(x, y);LCD_CmdWrite(0x04);LCD_DataRead(); // need a nop before reading dataCheck_Mem_RD_FIFO_not_Empty();#ifdef MCU_8bit_ColorDepth_8bpptmp = LCD_DataRead();
#endif
#ifdef MCU_8bit_ColorDepth_16bppLCD_DataRead(); // need a nop before reading datatmp = LCD_DataRead();tmp = tmp << 8;tmp += LCD_DataRead();
#endif
#ifdef MCU_8bit_ColorDepth_24bpptmp = LCD_DataRead();tmp += LCD_DataRead() << 8;tmp += LCD_DataRead() << 16;
#endif
#ifdef MCU_16bit_ColorDepth_16bppLCD_DataRead(); // need a nop before reading datatmp = LCD_DataRead();
#endif
#ifdef MCU_16bit_ColorDepth_24bpp_Mode_2tmp = LCD_DataRead();tmp += LCD_DataRead() << 16;
#endifCheck_Mem_RD_FIFO_Full();return tmp;
}

不同色深定义,数据的存放格式不同,故读写显存时需要根据色深定义区别操作,详细数据格式在此不展开说明,详细请参考RA8889/RA8876的规格书。

第九讲 THE END

了解更多信息:http://www.lcdvision.com.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习10种attention机制(快收藏)

1️⃣标准注意力机制&#xff1a; Soft Attention&#xff1a;一种灵活的注意力分配方式&#xff0c;允许模型在序列的不同部分分配不同程度的关注。 Hard Attention&#xff1a;一种严格的注意力分配方式&#xff0c;模型只关注序列中的特定部分。 2️⃣自注意力&#xff08;…

kafka入门(六):日志分段(LogSegment)

日志分段&#xff08;LogSegment&#xff09; Kafka的一个 主题可以分为多个分区。 一个分区可以有一至多个副本&#xff0c;每个副本对应一个日志文件。 每个日志文件对应一个至多个日志分段&#xff08;LogSegment&#xff09;。 每个日志分段还可以细分为索引文件、日志存储…

选择交换.

给出长为 n 的序列 a,你可以对序列 a 进行以下操作&#xff1a; 选择 l,r (1 ≤ l,r ≤ n) &#xff0c;交换 a[l],a[r]. 请求出在任意多次操作后&#xff0c;序列 a 能否满足 a[1]a[n] a[2]a[n-1] a[3]a[n-2] ……a[n/2]a[n1-(n/2)]. 可以证明如果有解&#xff0c;操作次数…

【Mybatis系列】Mybatis空值关联

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux 内核学习 2 - 用户程序如何被塞进内核进行调度?

Shell是系统的用户界面&#xff0c;提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。 fork里copy了父进程的信息&#xff0c;并激活task放到运行队列&#xff0c;当系统发生调度并获得执行机会时开始执行&#xff0c;但这时还不是hello程序…

C++力扣题目700--二叉搜索树中的搜索

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,1,3], val 2 输出&#xff1a;[2,1,…

网络安全全栈培训笔记(52-WEB攻防-通用漏洞弱口令安全社工字典生成服务协议web应用)

第52天 WEB攻防-通用漏洞&弱口令安全&社工字典生成&服务协议&web应用 知识点&#xff1a; 1、弱口令安全&配置&初始化等 2、弱口令对象&Web&服务&应用等 3、弱口令字典&查询&列表&列表等 #前置知识&#xff1a; 弱口令(weak…

getWriter() has already been called for this response

这个错误通常表明您尝试从Spring MVC返回一个已使用的HttpServletResponse对象。 原因&#xff1a;这可能是由于直接调用HttpServletResponse的getWriter()或getOutputStream()方法&#xff0c;或者由于在控制器方法中抛出异常而自动调用HttpServletResponse的write()方法。 修…

python企业级技能

python企业级技能 @contact: 微信 1257309054 @file: 书籍 @time: 2024/1/13 11:16 @author: LDC内容简介 ​ 通过本书籍可以学习到python在企业中是如何使用的,用来解决哪些业务问题? ​ python

C#人力资源管理系统源码

C#人力资源管理系统源码 源码描述&#xff1a; 该系统利用asp.net中mvc,linq搭建开发&#xff0c; 分权限管理 权限级别分为&#xff1a;管理员&#xff0c;经理&#xff0c;专员&#xff0c;员工等 管理员可以管理角色、菜单 经理可以管理 组织规划&#xff0c;员工管理&#…

python,序列的切片

序列的切片就是指从一个序列中取出子序列 语法&#xff1a; 序列[起始下标&#xff1a;结束下标&#xff1a;步长] 步长为1表示一个一个的取元素&#xff0c;步长为2表示每次跳过一个元素的取元素&#xff0c;步长为负数表示反向切片&#xff0c;取元素时取到结束下标&#…

分裂联邦学习论文-混合联邦分裂学习GAN驱动的预测性多目标优化

论文标题&#xff1a;《Predictive GAN-Powered Multi-Objective Optimization for Hybrid Federated Split Learning》 期刊&#xff1a;IEEE Transactions on Communications, 2023 一、论文介绍 背景&#xff1a;联邦学习作为一种多设备协同训练的边缘智能算法&#xff0…

linux 安装sipp

sudo apt-get install libnet1-dev libpcap0.8-dev openssl libssl-dev 从 sipp - Browse /sipp/3.2 at SourceForge.net 下载最新版的sipp.svn.tar.gz&#xff0c;解压之后就得到一个rpm文件 tar -zxvf sipp.svn.tar.gz cd sipp make pcapplay_ossl

SpringBoot中 如何优雅的 重试调用 第三方API?

引言 在实际的应用中&#xff0c;我们经常需要调用第三方API来获取数据或执行某些操作。然而&#xff0c;由于网络不稳定、第三方服务异常等原因&#xff0c;API调用可能会失败。为了提高系统的稳定性和可靠性&#xff0c;我们通常会考虑实现重试机制。 本文将深入探讨如何在…

MySQL深入——12

我们今天来谈谈临键锁 next-key lock&#xff08;临键锁&#xff09;是记录锁与间隙锁的结合&#xff0c;锁定一个范围。 他被主要应用于解决幻读的问题 临键锁的几个要点&#xff1a; 1.他是前开后闭区间 2.查找过程中访问到的对象会加锁 优化&#xff1a;1.在索引上的等…

2401C++,C++模板用来解耦

原文 模板还可用来解耦. 看这样一个场景: 类 连接 { 公:空 发送() {//干活输出<<缓冲_<<"\n";//...} 私:串 缓冲_; };有这样一个连接对象,它里面有个发送函数,发送的逻辑比较复杂(这里省略具体逻辑),然后刚好另外一个A对象可复用这部分代码,于是就把发送…

多语言生成式语言模型用于零样本跨语言事件论证提取(ACL2023)

1、写作动机&#xff1a; 经过预训练的生成式语言模型更好地捕捉实体之间的结构和依赖关系&#xff0c;因为模板提供了额外的声明性信息。先前工作中模板的设计是依赖于语言的&#xff0c;这使得很难将其扩展到零样本跨语言转移设置。 2、主要贡献&#xff1a; 作者提出了一…

AI-图片转换中国风动漫人物

&#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI卡通秀原理 2. …

【PyQt小知识 - 8】:QFileDialog — 文件选择对话框(选择文件夹/文件)

文章目录 QFileDialog的介绍和使用 QFileDialog的介绍和使用 QFileDialog是Qt框架中提供的一个文件选择对话框。它可以让用户通过图形界面的方式选择文件或目录&#xff0c;并提供了许多与文件操作相关的实用功能&#xff0c;例如文件过滤、文件类型限制、文件名默认值、默认目…

17. C++ static、const 和 static const 类型成员变量声明以及初始化

1. C static、const 和 static const 类型成员变量声明以及初始化 const 定义的常量在超出其作用域之后其空间会被释放&#xff1b; static 定义的静态常量在函数执行后不会释放其存储空间&#xff1b; 1.2 static static 表示的是静态的 类的静态成员函数、静态成员变量是…