一、LCD结构体

定义LCD为LCD_TypeDef类型的指针,指向0x6C000000的地址空间(bank1分区4的地址范围)。

为什么需要并上0x000007FE呢?

因为虽然驱动SRAM的时序和16位8080接口时序(驱动LCD时序)很像,但是8080的RS(寄存器选择)信号需要解决,解决方法是使用SRAM地址信号中的A10作为RS位。

0x000007FE是内部地址,指向一个8位的存储空间。同时也是A10引脚的偏移值,因为A10是外部存储器16位的地址,所以我们要先把该地址变成外部地址(右移一位或除以2),也就是说

111 1111 1110 -> 011 1111 1111

也就是该结构体变量的首地址是011 1111 1111(对于外部存储器来说),那么结构体变量成员LCD_REG的地址就是011 1111 1111,而LCD_RAM的地址是外部地址加1,即100 0000 0000。

这种设计使得,两个变量所在地址空间的A10不同,解决了RS的问题。

二、lcddev结构体

用来设置LCD的结构体。

三、底层接口函数

四、LCD初始化函数

五、LCD坐标设置函数

六、LCD画点函数

七、LCD字符显示函数

以下是针对图片中 LCD_ShowChar 函数的逐行解析,结合其功能实现和硬件交互逻辑:


1. 函数功能概述

void LCD_ShowChar(u16 x, u16 y, u8 num, u8 size, u8 mode)
  • 作用​:在LCD屏幕的指定位置 (x,y) 显示一个ASCII字符。
  • 参数​:
    • x, y:字符左上角起始坐标(像素单位)。
    • num:要显示的字符(ASCII码,范围从空格 ' ''~')。
    • size:字体大小(12/16/24像素)。
    • mode:显示模式(0非叠加,1叠加。叠加模式下保留背景,仅绘制字符像素)。

2. 关键变量与初始化

u8 temp, t1, t;
u16 y0 = y;  // 保存起始y坐标
u8 csize = (size/8 + ((size%8)?1:0)) * (size/2);  // 计算字符点阵数据占用的字节数
num = num - ' ';  // ASCII字库偏移(字库从空格开始存储)
  • ​**csize 计算逻辑​:
    字体点阵通常按
    行存储**,每行像素用1字节表示(每bit代表1像素)。例如:

    • 12像素字体​:每行12像素 → 占用2字节(12/8=1.5 → 向上取整为2字节)。
    • 总字节数 = (行字节数) * (行数) = (size/8 + 余数处理) * (size/2)
  • ​**num 偏移**​:
    字库数组(如 asc2_1206)从空格字符(ASCII 32)开始存储,减去 ' ' 得到正确的索引。


3. 字符点阵数据获取

for(t=0; t<csize; t++) {if(size==12) temp = asc2_1206[num][t];      // 12像素字体else if(size==16) temp = asc2_1608[num][t]; // 16像素字体else if(size==24) temp = asc2_2412[num][t]; // 24像素字体else return;                                // 不支持的字体大小
  • 字库结构​:
    字库为二维数组(如 asc2_1206[字符数][点阵字节数]),每个字符的点阵数据按行排列。
  • 示例​:
    若显示字符 'A'(ASCII 65),则 num = 65 - 32 = 33,从字库中获取第33个字符的点阵。

4. 逐像素绘制字符

for(t1=0; t1<8; t1++) {if(temp & 0x80) LCD_Fast_DrawPoint(x, y, POINT_COLOR);  // 当前bit=1,绘制字符颜色else if(mode==0) LCD_Fast_DrawPoint(x, y, BACK_COLOR);  // 非叠加模式,绘制背景色temp <<= 1;  // 左移检查下一bity++;         // 移动到下一行像素if(y >= lcddev.height) return;  // 超出屏幕高度if((y - y0) == size) {         // 完成一列绘制y = y0;  // y坐标复位x++;     // 移动到下一列if(x >= lcddev.width) return;  // 超出屏幕宽度break;}
}
  • 像素绘制逻辑​:
    1. 检查最高位(temp & 0x80)​​:
      • 若为1,调用 LCD_Fast_DrawPoint 绘制字符颜色(POINT_COLOR)。
      • 若为0且 mode=0,绘制背景色(BACK_COLOR,覆盖原有内容)。
    2. 坐标更新​:
      • 每处理1bit,y++ 向下移动一行像素。
      • y - y0 == size 时,表示一列像素绘制完成,复位 y 并右移一列(x++)。

5. 边界检查与优化

  • 屏幕边界处理​:
    每次更新坐标后检查 xy 是否超出屏幕尺寸(lcddev.width/height),避免越界。
  • 性能优化​:
    LCD_Fast_DrawPoint 应为优化后的快速画点函数(可能直接操作FSMC或显存)。

6. 字库与硬件交互

  • 字库存储​:
    字库数组(如 asc2_1206)通常存储在代码区(Flash)或外部SPI Flash,通过查表获取点阵。
  • LCD写入​:
    LCD_Fast_DrawPoint 内部通过FSMC或GPIO模拟8080接口,向LCD显存写入像素颜色值。

总结:字符显示流程

  1. 参数校验​ → 2. ​计算字模数据位置​ → 3. ​逐字节读取点阵​ →
  2. 逐bit绘制像素​ → 5. ​坐标更新与边界检查​ → 6. ​循环直至字符绘制完成

此函数通过硬件加速的像素操作高效的字模解析,实现了灵活的字符显示功能。如需显示中文或自定义图形,需扩展字库和绘制逻辑。

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

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

相关文章

SQL性能调优

MySQL出现性能差的原因有哪些? 可能是 SOL查询使用了全表扫描&#xff0c;也可能是查询语句过于复杂&#xff0c;如多表 IOIN 或嵌套子查询。 也有可能是单表数据量过大。 通常情况下&#xff0c;添加索引就能解决大部分性能问题。对于一些热点数据&#xff0c;还可以通过增加…

dapo:开源大规模llm强化学习系统的突破与实现

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; ✨ 1. dapo概述&#xff1a;开源llm强化学习系统的重要突破 dapo&…

【车载开发系列】ParaSoft集成测试环境配置(五)

【车载开发系列】ParaSoft集成测试环境配置(五) 【车载开发系列】ParaSoft集成测试环境配置(五) 【车载开发系列】ParaSoft集成测试环境配置(五) 一. 剥离硬件环境的设置 二. 灵活使用编译开关 三. 导入修改后的bdf文件 四. 自动生成底层桩函数 五. 开始跑集成测试用例 六…

大模型(一)什么是 MCP?如何使用 Charry Studio 集成 MCP?

目录一、什么是 MCP&#xff1f;1.1 &#x1f914; 开始之前的思考1.2 MCP 的定义1.3 MCP 结构二、MCP 的使用2.1 uv 的安装2.2 MCP 广场2.3 MCP 的配置2.4 MCP 的依赖安装2.5 Charry Studio2.6 测试结果背景&#xff1a; MCP 这个概念大概是 2025 年上半年火起来的&#xff0c…

源码导航页

一、Python捕捉动作发送到Unity驱动模型跟着动&#xff08;获取源码&#xff09; 二、AI输入法源码&#xff08;获取源码&#xff09; 三、Java企业级后台管理系统-登录授权角色菜单&#xff08;获取源码&#xff09; 四、Jetson实现纯视觉导航&#xff08;获取源码&#xff09…

HTTP/2 性能提升的核心原因

一、协议架构优化‌‌二进制分帧&#xff08;Binary Framing&#xff09;‌HTTP/2 将传统文本格式的报文&#xff08;如请求头、数据体&#xff09;拆分为独立的二进制帧&#xff08;Frame&#xff09;&#xff0c;每个帧包含流标识符&#xff08;Stream ID&#xff09;&#x…

vulnhub-billu_b0x靶机渗透

一、靶场详情 Billu_b0x 是 Vulnhub 上的经典中等难度靶机&#xff0c;主要考察从信息收集到提权的完整渗透流程&#xff1a;先通过端口和目录扫描发现网站入口&#xff0c;利用 SQL 注入或文件包含进入后台并上传 WebShell&#xff0c;再通过反弹 Shell 获取低权限用户&#…

C# 相机内存复用(减少图像采集耗时)以及行数复用

背景我们在做图像处理时&#xff0c;都会对一些相机的SDK进行开发完成图像采集的操作&#xff0c;为后续图像处理做准备。本文主要的目的是降低图像采集的耗时&#xff0c;应用在一些高速检测的场景下。利用循环队列内存复用的方式&#xff0c;去掉或者减少新建内存的时间。线扫…

MTK Linux DRM分析(十三)- Mediatek KMS实现mtk_drm_drv.c(Part.1)

一、简介 MediaTek (MTK) 的DRM驱动(基于mtk_drm_drv.c)是为MediaTek SoC(如MT6985、MT6895等)设计的显示子系统(Display Subsystem)驱动程序。它实现了Linux DRM/KMS框架,支持多CRTC、多平面(plane)、连接器(connector)和编码器(encoder)的显示管道。驱动处理硬…

Wireshark笔记-DHCP流程与数据包解析

背景DHCP从大学上网络课时就开始知道了&#xff0c;当时只知道&#xff0c;能让计算机上网&#xff0c;要不就静态配IP&#xff0c;要不就DHCP获取&#xff0c;就能上网。2021年时&#xff0c;毕业好几年了&#xff0c;想学习下网络知识&#xff0c;就准备考一个软考网工。按要…

Coze用户账号设置修改用户头像-前端源码

概述 Coze Studio的用户头像修改功能是用户账号设置中的重要组成部分&#xff0c;允许用户上传和更新个人头像。本文将深入分析该功能的前端实现&#xff0c;包括组件架构、文件上传处理、API设计和用户体验优化等方面。 技术架构 整体架构设计 Coze Studio采用现代化的前端架构…

新手Github提交PR(Pull requests)详细教程

一、什么是Pull requests&#xff1f; Pull Requests&#xff08;PR&#xff09;是代码协作平台&#xff08;如 GitHub、GitLab 等&#xff09;中的一种功能&#xff0c;用于提议将某分支的代码变更合并到另一个分支&#xff08;通常是主分支&#xff09;。它允许开发者在合并…

本地通过跳板机连接无公网IP的内网服务器

本地环境&#xff1a;SSH client 堡垒机&#xff1a;有公网IP&#xff0c;有连接内网服务器的秘钥 SSH配置&#xff1a; Host jmsHostName [堡垒机的公网IP]Port 22User rootIdentityFile ~/.ssh/id_rsaHost appHostName 10.0.0.14Port 22User rootIdentityFile ~/.ssh/svc-p…

B树,B+树,B*树

下面我们来详细讲解一下 B树、B树、B*树 这三种非常重要的多路平衡查找树。它们在数据库和文件系统中有着极其广泛的应用。一、为什么需要这些树结构&#xff1f;在开始之前&#xff0c;我们先思考一个问题&#xff1a;为什么已经有了二叉搜索树&#xff08;BST&#xff09;、A…

汽车零部件工厂ESOP系统工业一体机如何选型

在汽车零部件工厂的生产管理中&#xff0c;ESOP 系统发挥着至关重要的作用。而工业一体机作为 ESOP 系统的关键硬件支撑&#xff0c;其选型的合理性直接关系到生产效率的提升、生产过程的精准控制以及生产数据的可靠采集与分析。因此&#xff0c;为汽车零部件工厂选择一款适合的…

​维基框架 (Wiki Framework) 1.1.0 版本发布​ 提供多模型AI辅助开发

介绍 多模型AI辅助开发​ 维基框架1.1.0集成了主流AI引擎的统一接口&#xff0c;支持开发者按需调用不同模型的优势能力&#xff1a; ​DeepSeek​&#xff1a;专注代码生成与重构&#xff0c;擅长复杂业务逻辑实现 ​ChatGPT​&#xff1a;多模态推理能力&#xff0c;适用于…

LabVIEW调用MATLAB 的分形生成

LabVIEW 调用 MATLAB&#xff0c;可借前者可视化流程与硬件交互优势&#xff0c;结合后者强数值计算、算法能力&#xff0c;复用成熟算法提速开发&#xff0c;还能灵活改代码。但需匹配版本、装运行环境&#xff0c;数据传递有性能损耗&#xff0c;脚本出错需跨软件调试。​优点…

ubuntu20.04开发ros2,使用docker安装部署的详细教程

学习docker的教程&#xff1a;可以直接在菜鸟教程上学习即可阶段 0&#xff1a;系统检查| 内容 | 建议 | |------|------| | 操作系统 | Ubuntu 22.04&#xff08;与 ROS2 Humble 最匹配&#xff09; | | 用户权限 | 能执行 sudo |&#x1f9e9; 阶段 1&#xff1a;在 Ubuntu 上…

SQL Server缩小日志文件.ldf的方法(适用于开发环境)

SQL Server缩小日志文件.ldf的方法&#xff08;适用于开发环境&#xff09; 核心概念&#xff1a;为什么日志文件会变大&#xff1f; 首先&#xff0c;理解原因至关重要。事务日志文件在以下情况下会增长&#xff1a; 大量操作&#xff1a;执行了大批量插入、更新或删除操作&am…

2.3零基础玩转uni-app轮播图:从入门到精通 (咸虾米总结)

还在uni-app中的轮播图组件头疼吗&#xff1f;看完这篇&#xff0c;让你轻松掌握swiper的所有秘密&#xff01;轮播图的重要性 在现代移动应用开发中&#xff0c;轮播图&#xff08;Swiper&#xff09;已成为展示焦点内容、广告推广和产品展示的首选组件。无论是电商平台的商品…