2026/4/18 11:47:33
网站建设
项目流程
企业网站脚本语言,人人做全免费网站,手机淘宝网官网,怎么查看Wordpress根目录玩转LCD1602#xff1a;如何用代码“画”出自定义图标#xff1f;你有没有在电子秤上看到过一个小小的“砝码”符号#xff1f;或者在温控器的屏幕上见过闪烁的温度计图标#xff1f;这些可不是标准键盘能打出来的字符——它们是程序员一笔一划“画”出来的图形#xff0c…玩转LCD1602如何用代码“画”出自定义图标你有没有在电子秤上看到过一个小小的“砝码”符号或者在温控器的屏幕上见过闪烁的温度计图标这些可不是标准键盘能打出来的字符——它们是程序员一笔一划“画”出来的图形而实现这一切的核心就是那块看起来普普通通的LCD1602液晶屏。别看它只能显示两行、每行16个字符一旦你掌握了它的“隐藏技能”这块黑白小屏就能变成你的迷你图形画布。今天我们就来揭开这个秘密如何通过编程在LCD1602上自定义显示箭头、电池、心形甚至动画帧为什么还在用LCD1602它不早就过时了吗坦率说现在满大街都是彩色TFT触摸屏动辄几百上千分辨率LCD1602确实显得有点“复古”。但它依然活跃在无数设备中——从工厂里的PLC控制面板到家里的智能电表、空气净化器甚至一些高端示波器的状态栏。原因很简单省资源、够稳定、成本低。它不需要操作系统不消耗MCU太多算力静态显示几乎不耗电接线简单4根数据线3根控制线就能跑起来最关键的是便宜几块钱一片。尤其是在STM8、51单片机这类资源紧张的小系统里给用户一点直观反馈LCD1602仍是首选。但问题来了ASCII字符集就那么几十个字母数字和标点怎么表达“当前正在加热”、“信号弱”这种状态呢答案就是自定义字符Custom Character。自定义字符是怎么“画”出来的点阵背后的逻辑LCD1602每个字符的位置其实是一个5×8 像素的小网格。你可以把它想象成一张 tiny 的像素画板每一列宽5个点高8行。比如你想画一个向上的箭头 ↑大概是这样● ●●● ● ● ● ● ● ● ●我们把“亮”的点记为1“灭”的点记为0每一行转换成一个字节的二进制数只取低5位因为宽度只有5列高位补0。于是上面这个图案就变成了8个字节的数据const uint8_t up_arrow[8] { 0b00100, // 第1行中间亮 0b01110, // 第2行中间三个亮 0b10101, // 第3行两边和中间亮 0b00100, 0b00100, 0b00100, 0b00100, 0b00000 // 最后一行留空避免粘连 };这8个字节就是一个完整的自定义字符的“图纸”。图纸画好了往哪儿存CG RAM揭秘LCD1602内部有个叫CG RAMCharacter Generator RAM的地方专门用来存放这些“图纸”。它总共有64字节分成8组每组8字节刚好容纳8个自定义字符。也就是说你最多可以同时定义8个不同的图标。这些字符编号从0到7不是ASCII码而是内部索引。当你后续往屏幕写入数据时只要写入0就会显示第一个自定义图形写入1就显示第二个……⚠️ 注意CG RAM 是易失性内存断电即清空。所以每次上电后必须重新把这8组数据写一遍。那怎么告诉LCD“我现在要往CG RAM里写东西了”这就涉及到LCD控制器的一个关键机制地址指针切换。控制核心HD44780是如何管理内存的几乎所有字符型LCD都基于HD44780 或其兼容芯片如ST7066U。它内部有两块主要的RAM区域名称作用DD RAMDisplay Data RAM —— 存放屏幕上实际显示的字符编码CG RAMCharacter Generator RAM —— 存放自定义字符的点阵数据还有一个地址计数器AC决定了当前操作的是哪块内存。要写入自定义字符流程非常清晰发送命令0x40 | (n 3)设置CG RAM地址指针n为字符编号连续写入8字节点阵数据切回DD RAM模式向DD RAM写入字符编号 n即可显示对应图形举个例子想把上面的箭头存为第0号字符起始地址就是0x40 0*8 0x40。发送命令0x40后接下来的8次数据写入都会进入CG RAM。实战代码封装一个可复用的创建函数下面这段C语言代码适用于STM32、AVR、51等常见MCU平台假设你已经有了基本的IO驱动函数如LCD_WriteCommand,LCD_WriteData。/** * brief 创建一个自定义字符 * param location: 字符编号 (0~7) * param char_map: 指向8字节数组的指针 */ void LCD_CreateChar(uint8_t location, const uint8_t* char_map) { location 0x07; // 限制范围防止越界 // 设置CG RAM地址0x40 location * 8 LCD_WriteCommand(0x40 | (location 3)); for (int i 0; i 8; i) { LCD_WriteData(char_map[i]); } }是不是很简洁只需要传入编号和数组一行命令加一个循环搞定。再来看怎么使用它// 定义几个实用图标 const uint8_t icon_temp[8] { /* 温度计 */ }; const uint8_t icon_battery_full[8] { /* 满电量 */ }; const uint8_t icon_arrow_up[8] { /* 上箭头 */ }; void LCD_InitWithIcons(void) { LCD_Init(); // 先初始化LCD // 一次性加载所有需要的图标 LCD_CreateChar(0, icon_temp); LCD_CreateChar(1, icon_battery_full); LCD_CreateChar(2, icon_arrow_up); // 清屏 LCD_WriteCommand(0x01); Delay_ms(2); } // 显示示例Temp: 25°C ↑ void ShowTemperature(float temp) { LCD_GotoXY(0, 0); LCD_Print(Temp: ); LCD_PrintFloat(temp, 1); // 显示带一位小数 LCD_WriteData(0xDF); // 输出 ° 符号部分型号支持 LCD_WriteData(C); LCD_WriteData(2); // 显示↑图标编号2 }注意最后这句LCD_WriteData(2)—— 我们并没有发送字符’B’或’X’而是直接发了个数字2。LCD会自动查找CG RAM中编号为2的图形并显示出来。小技巧还能玩出什么花样✅ 动态效果模拟虽然LCD1602不能真正“刷新”局部画面但你可以利用多个自定义字符实现简单的动画。例如定义三个风扇叶片旋转的不同姿态编号分别为1、2、3const uint8_t fan_frame1[8] { ..., 0b01110, ... }; // 叶片朝右 const uint8_t fan_frame2[8] { ..., 0b00100, ... }; // 垂直 const uint8_t fan_frame3[8] { ..., 0b00010, ... }; // 斜向然后在主循环中轮询切换while (1) { LCD_GotoXY(10, 1); LCD_WriteData((frame % 3) 1); // 循环显示三帧 Delay_ms(300); }视觉上就有了一种“转动”的感觉。✅ 电量条/进度条可以用不同填充程度的方块表示电量编号图形含义0▁0%1▂25%2▃50%3▄75%4▅100%然后根据ADC读数选择对应的字符输出比打印“Battery: 75%”更直观。踩坑提醒新手最容易忽略的几个细节写完CG RAM记得切回DD RAM- 如果忘记切换后续所有写入都会继续修改CG RAM导致显示异常。- 建议在LCD_CreateChar末尾加一句LCD_WriteCommand(0x80);回到DD RAM首地址。对比度调节Vo千万别接错- Vo引脚控制液晶偏压直接影响是否能看清内容。- 正确做法是接一个10kΩ电位器两端分别接Vcc和GND滑动端接Vo。- 接错了可能全黑或全白。避免频繁重载CG RAM- 每次写入都有延迟建议只在初始化阶段集中写入一次。- 若需动态更换图标提前规划好编号分配。背光节能设计- LED可通过NPN三极管由MCU控制长时间无操作自动关闭背光。- 对电池供电设备尤为重要。不同厂家略有差异- 有些LCD对时序要求更严格延时不够会导致初始化失败。- 建议关键步骤后加入适当Delay如2ms或查询忙标志位。为什么这项“老技术”还值得学也许你会问现在都2025年了谁还用手敲LCD1602驱动但正是这种“原始”的外设教会我们最本质的东西内存映射思想DD RAM vs CG RAM 的分离设计是现代显存架构的缩影位操作实践每一位代表一个像素强化了对二进制的理解硬件时序掌控E脉冲、RS选择、建立保持时间……这些都是嵌入式开发的基本功资源优化思维在仅有几百字节RAM的系统中如何高效利用每一个bit。掌握LCD1602的自定义字符不只是为了做一个温度图标。它是通往更复杂GUI系统的第一级台阶。当你以后面对TFT屏幕TouchGFX框架时你会发现很多概念一脉相承显存管理、字体渲染、图层合成……而这一切都可以从这8个字节开始。如果你也在做某个小项目正愁怎么优雅地提示“运行中”状态不妨试试用自定义字符画个小齿轮或者心跳动画。你会发现哪怕是最简单的硬件也能讲出动人的交互故事。你在项目中用过哪些有趣的自定义字符欢迎在评论区晒出你的“像素艺术”作品