GC9A01驱动移植(HALL库)

最近在做LVGL的移植,用到的屏幕驱动时GC9A01的,记录一下学习历程,防止日后遗忘。

这款屏幕我使用的是SPI协议,参考了部分稚辉菌大佬这个项目的程序:

【自制】我做了个能动的迷你电脑配件!【软核】_哔哩哔哩_bilibili

目录

​编辑使用C实现SPI通信(标准库写法):

HALL库 

SPI的通信部分是:CS和CLK拉低后即可通信,拉高结束通信

使用C实现SPI通信(标准库写法):

void LCD_Writ_Bus(u8 dat) 
{	u8 i;LCD_CS_Clr();//拉低for(i=0;i<8;i++){			  LCD_SCLK_Clr();//拉低if(dat&0x80){LCD_MOSI_Set();}else{LCD_MOSI_Clr();}LCD_SCLK_Set();//拉高dat<<=1;}	LCD_CS_Set();//拉高	
}

作为一个LCD最重要的就是画点函数了,长这样:

void LCD_DrawPoint(u16 x,u16 y,u16 color)
{//	void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)//{//		LCD_WR_REG(0x2a);//列地址设置//		LCD_WR_DATA(x1);//		LCD_WR_DATA(x2);//		LCD_WR_REG(0x2b);//行地址设置//		LCD_WR_DATA(y1);//		LCD_WR_DATA(y2);//		LCD_WR_REG(0x2c);//储存器写//}LCD_Address_Set(x,y,x,y);//设置光标位置 LCD_WR_DATA(color);
} 

翻下数据手册 这是命令的作用(这个发送的是16位命令,上边介绍的是8位的):

HALL库 

现在我们可以画点了,通过调用这个函数*(HALL库):

下图是调用2A命令,设置列地址的起始位置和结束位置,发一个16位的data就是设置起始地址,发两个16位的data就是设置起始和结束地址

void SetDataOrCommand(bool _isData)
{if (_isData) {LCD_DC_GPIO_Port->BSRR = LCD_DC_Pin;} else {LCD_DC_GPIO_Port->BSRR = (uint32_t) LCD_DC_Pin << 16U;}
}void WriteCommand(uint8_t _cmd)
{SetDataOrCommand(false);HAL_SPI_Transmit(spi, &_cmd, 1, 100);
}void Setpoint(uint16_t _startX, uint16_t _startY,uint16_t color)
{ChipSelect(true);uint8_t data[4];WriteCommand(0x2A); // COL_ADDR_SETdata[0] = (_startX >> 8) & 0xFF;data[1] = _startX & 0xFF;WriteData(data, sizeof(data), false);WriteCommand(0x2B); // ROW_ADDR_SETdata[0] = (_startY >> 8) & 0xFF;data[1] = _startY & 0xFF;WriteData(data, sizeof(data), false);WriteCommand(0x2C); // ROW_ADDR_SETdata[0] = (color >> 8) & 0xFF;data[1] = color & 0xFF;WriteData(data, sizeof(data), false); ChipSelect(false);
}
//这里传入的是一组数据,使用指针来接收数据
void Setwindow(uint16_t _startX, uint16_t _endX, uint16_t _startY, uint16_t _endY,uint16_t *color)
{ChipSelect(true);uint16_t height, width;uint16_t i, j;width = _endX - _startX + 1;            /* 得到填充的宽度 */height = _endY - _startY + 1;           /* 高度 */for (i = 0; i < height; i++){for (j = 0; j < width; j++){//将像素的值通过坐标写入Setpoint(_startX+j,_startY+i,color[i * width + j]);}}ChipSelect(false);
}

如果画一个区域就是这样的,依次进行设置,最后写内存的部分,本质上就是给像素点写颜色,因为这个芯片本质上就是一个巨大的RAM,一共320x18x240 bits,RGB的模式也分几种,上述代码主要是LVGL进行缓存更新时候调用的画区域的函数,本质上是对GRAM的内存进行更新

 如有描述不对的地方,欢迎评论区指证!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

PCIe板卡标准尺寸

一、板卡尺寸说明 两种PCIe外接卡的高度&#xff0c;即全高&#xff08;Standard height&#xff09;111.15 mm (4.376 inches)和半高&#xff08;half height&#xff09;68.90 mm (2.731 inches)&#xff1b; 两种PCIe外接卡的长度&#xff1a;全长&#xff08;full length&a…

docker 阿里云镜像加速

在阿里云首页点击产品-容器-容器镜像服务ACR 无需购买&#xff0c;直接进去控制台创建个人版 完成后点击镜像加速器 选择对应的系统&#xff0c;按照操作文档完成

KPaaS洞察|异构系统中用户角色与权限分类及管理解决方案

多个异构系统的使用已经成为企业常态。每个系统通常有自己独立的用户角色和权限设置&#xff0c;导致权限管理复杂且容易出现冲突。如何在多个异构系统中统一、有效地进行用户角色和权限管理&#xff0c;已成为企业保障数据安全和提升管理效率的关键挑战。通过集中式权限管理平…

食品配送管理系统(源码+文档+部署+讲解)

食品配送管理系统是成品商业化项目&#xff0c;系统可基于源码二开。 系统概述 餐饮食品配送&#xff0c;包含配送人APP、下单APP、管理端等&#xff0c;实现订餐、配餐&#xff0c;用于食品店、中央厨房等订餐、团餐业务 本项目名称为食品配送系统&#xff0c;是针对食品配…

领夹麦克风哪个品牌音质最好?无线领夹麦克风可以唱歌吗?

随着短视频和直播行业的蓬勃发展&#xff0c;无线领夹麦克风已成为内容创作者提升音质体验的关键一环。但遗憾的是&#xff0c;市场上充斥着太多夸大其词、华而不实的宣传&#xff0c;诸如“一键降噪”、“无损传输”等概念满天飞&#xff0c;让消费者难以分辨真伪。许多朋友在…

大模型学习笔记------BLIP模型的再思考

大模型学习笔记------BLIP模型的再思考 1、BLIP推理---如何进行“图生文”2、BLIP推理---如何进行视觉问答&#xff08;Visual Question Answering, VQA&#xff09;3、BLIP推理---如何进行图文检索&#xff08;Image-text retrieval&#xff09;任务4、总结 上一篇文章上文中讲…

c# 调用c++ 的dll 出现找不到函数入口点

今天在调用一个设备的dll文件时遇到了一点波折&#xff0c;因为多c 不熟悉&#xff0c;调用过程张出现了找不到函数入口点&#xff0c;一般我们使用c# 调用c 文件&#xff0c;还是比较简单。 [DllImport("AtnDll2.dll",CharSet CharSet.Ansi)]public static extern …

H5BuildX发行uniapp h5版本的正确姿势

在manifest.json中配置基础路径 在上传到服务器后&#xff0c;需要将打包后的文件夹修改为基础路径中相同的文件名 否则网页的css、js等资源文件会因为路径问题始终访问不了

C++(Qt)软件调试---符号转换工具cv2pdb (24)

C(Qt)软件调试—符号转换工具cv2pdb &#xff08;24&#xff09; 文章目录 C(Qt)软件调试---符号转换工具cv2pdb &#xff08;24&#xff09;[toc]1、概述&#x1f41c;2、下载cv2pdb&#x1fab2;3、qt程序使用cv2pdb&#x1f9a7;1.1 方法1&#xff1a;命令行1.2 方法2&#…

MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中

MySQL技巧之跨服务器数据查询&#xff1a;高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中 基础篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的…

ReactPress与WordPress:两大开源发布平台的对比与选择

ReactPress与WordPress&#xff1a;两大开源发布平台的对比与选择 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。两款备受欢迎的开源发布平台——ReactPress和WordPress&#xff0c;各自拥有独特的优势和特点&am…

Python多进程间通讯(包含共享内存方式)

文章目录 1 通过非共享内存配合队列方式2 通过共享内存配合队列方式 注&#xff1a;本博文测试环境为Linux系统。 1 通过非共享内存配合队列方式 下面是一个常见的生产者与消费者的模式示例&#xff0c;这里分别启动了两个子进程&#xff0c;一个为生产者&#xff08;producer…

djang5 官网_polls_app_05( 关于代码测试)

这篇教程从 教程4 结束的地方开始。已经构建了一个网络投票应用程序&#xff0c;现在将为其创建一些自动化测试。 1. 原因&#xff1a; 雅各布卡普兰-莫斯&#xff08;Jacob Kaplan-Moss&#xff09;&#xff0c;Django的原始开发者之一&#xff0c;说过&#xff1a;“没有测…

准双向/弱上拉(标准8051输出模式)、仅为输入(高阻)、开漏输出、推挽输出、上拉电阻、下拉电阻都是什么?

准双向/弱上拉&#xff08;标准8051输出模式&#xff09;&#xff1a; 弱上拉&#xff1a;即输出的1驱动能力是有限的 准双向&#xff1a;可以输入也可以输出 为什么是弱上拉呢&#xff1f; 当三极管断开的时候&#xff0c;“内部输入”处应该是高电平&#xff08;前提的后端…

Linux高阶——1110—死锁问题原子访问线程控制与调度线程同步

目录 1、旋转锁 2、死锁问题 死锁问题举例&#xff1a; 1、双线程死锁 代码 成功截图 2、单线程死锁 死锁问题处理&#xff1a; 死锁问题预防&#xff1a; 有向图 3、原子访问 1、原子访问概念 2、原子访问可用函数 原代码 未加锁代码输出 修改后代码 修改后截…

python入门3

IDE的概念 IDE(Integrated Development Environment)又被称为集成开发环境。说白了&#xff0c;就是有一款图形化界面的软件&#xff0c;它集成了编辑代码&#xff0c;编译代码&#xff0c;分析代码&#xff0c;执行代码以及调试代码等功能。在我们Python开发中&#xff0c;最常…

Ollama—87.4k star 的开源大模型服务框架!!

这一年来&#xff0c;AI 发展的越来越快&#xff0c;大模型使用的门槛也越来越低&#xff0c;每个人都可以在自己的本地运行大模型。今天再给大家介绍一个最厉害的开源大模型服务框架——ollama。 项目介绍 Ollama 是一个开源的大语言模型&#xff08;LLM&#xff09;服务工具…

mysql中的EXISTS和NOT EXISTS使用详解

本文来编写一个实例说下mysql中的EXISTS和NOT EXISTS使用详解 文章目录 exists用法SQL中in, not in, exists, not exists的区别使用实例本文小结 exists用法 exists: 如果括号内子查询语句返回结果不为空&#xff0c;说明where条件成立&#xff0c;就会执行主SQL语句。如果括号…

海量数据去重的哈希与布尔过滤器

目录 散列表 hash与平衡二叉树比较: 散列表组成: hash函数 作用&#xff1a; 怎么选择hash&#xff1a; 选择标准: 常用hash: hash的操作: hash冲突 产生原因 如何描述冲突程度: 解决冲突: 在合理范围内:used < size: 不在合理范围内&#xff08;used > s…

快速掌握——python类 封装[私有属性方法]、继承【python进阶】(内附代码)

1.类的定义 与 实例化对象 在python中使用class关键字创建一个类。 举例子 class Stu(object):id 1001name 张三def __init__(self):passdef fun1(self):pass# 实例化对象 s1 Stu() s2 Stu() print(s1.name) print(s2.name) 第一个方法 __init__是一种特殊的方法&#x…