HT1621 LCD 驱动芯片完整驱动例程(合泰 HT66F0185 平台)—— 附国产替代方案(零基础学习版)

📅 2026/8/25 22:51:59
HT1621 LCD 驱动芯片完整驱动例程(合泰 HT66F0185 平台)—— 附国产替代方案(零基础学习版)
一、前言在嵌入式产品开发中段码 LCD 显示屏因其低功耗、高对比度、成本低廉等优势被广泛应用于家电控制面板、仪器仪表、汽车电子、消费电子等领域。而驱动这类段码 LCD 屏最常用的芯片之一就是HT1621—— 一款由合泰HOLTEK推出的 128 点32 SEG × 4 COM内存映射多功能 LCD 驱动芯片。本文将基于合泰 HT66F0185 单片机平台从零开始讲解 HT1621 的通信协议、硬件连接并提供一套经过实际项目验证的完整驱动代码包括初始化、写命令、写显示数据、读数据等全部功能。文末还将给出国产替代方案帮助开发者在供应链波动时快速切换。本文为原创技术分享转载请注明出处。技术交流可联系远乐曾工Holtek_HT二、HT1621 芯片概述2.1 基本特性HT1621 是一款多功能 LCD 驱动芯片主要特性如下表格参数规格驱动能力32 SEG × 4 COM 128 点工作电压2.4V ~ 5.25V偏置方式1/2 或 1/3 bias2/3/4 COM 可选内置振荡内部 RC 振荡器256kHz也支持外部晶振 / 时钟通信接口串行接口CS、WR、DATA、RD 四线显示内存32×4 bit RAM内存映射直接对应显示点附加功能蜂鸣器输出、WDT 看门狗、定时器2.2 引脚说明SSOP-24 封装VDD / VSS电源正 / 地VLCDLCD 偏压电源端可接电容到 VSSOSC振荡器引脚内部 RC 模式下接电容或悬空CS片选信号低电平有效WR写时钟上升沿写入数据DATA串行数据输入 / 输出RD读时钟上升沿读取数据COM0~COM3LCD 公共端输出SEG0~SEG31LCD 段端输出三、通信协议详解HT1621 采用串行通信通过 CS、WR、DATA、RD 四根线与 MCU 交互。所有操作都以CS 拉低开始CS 拉高结束。3.1 三种操作模式HT1621 定义了三种操作模式通过3 位命令前缀区分表格操作命令前缀3bit说明写命令1000x80 取高 3 位后跟 8 位命令码 1 位无关位写数据1010xA0 取高 3 位后跟 6 位地址 4 位数据可连续写读数据1100xC0 取高 3 位后跟 6 位地址 读取 4 位数据3.2 命令格式写命令帧 1003bit命令码8bitX1bit 填充共 12bit。常用命令码#define SYSEN 0x01 // 开启系统振荡器 #define SYSDIS 0x00 // 关闭系统振荡器 #define LCDON 0x03 // 开启LCD偏压发生器 #define LCDOFF 0x02 // 关闭LCD偏压发生器 #define BIAS 0x29 // 1/3 bias, 4 COM #define RC256 0x18 // 内部RC振荡器 #define XTAL32K 0x14 // 外部32.768kHz晶振 #define BZ_ON 0x09 // 蜂鸣器开 #define BZ_OFF 0x08 // 蜂鸣器关3.3 写数据格式写数据帧 1013bit地址6bit数据4bit共 13bit。地址范围0x00 ~ 0x1F对应 32 个 SEG每个地址的 4bit 数据对应 4 个 COMbit0→COM0bit1→COM1bit2→COM2bit3→COM3支持连续写写完 4bit 数据后地址自动递增可继续写下一个地址的数据无需重新发命令前缀3.4 读数据格式读数据帧 1103bit地址6bit读取4bit数据。读操作时需将 DATA 引脚切换为输入模式。四、硬件连接以 HT66F0185 单片机为例GPIO 连接如下表格HT66F0185 引脚HT1621 引脚方向说明PA4CS输出片选低有效PB1WR输出写时钟PB0DATA输入 / 输出双向数据线PB2RD输出读时钟LCD 屏的 COM 端接 HT1621 的 COM0~COM3SEG 端接 SEG0~SEG31。VLCD 引脚建议接一个 1μF 电容到 VSS用于稳定偏压。五、完整驱动代码5.1 头文件与宏定义#include HT66F0185.h #include DEF.h #include HT66F0185_Config.h #define uchar unsigned char // HT1621 引脚定义 #define cs _pa4 // 片选 #define wr _pb1 // 写时钟 #define dat _pb0 // 数据 #define rd _pb2 // 读时钟 // HT1621 命令码 #define BIAS 0x29 // 1/3 bias, 4 com #define SYSEN 0x01 // 开启系统振荡器 #define LCDON 0x03 // 开启LCD偏压发生器 #define LCDOFF 0x02 // 关闭LCD偏压发生器 #define RC256 0x18 // 内部RC振荡 #define XTAL32K 0x14 // 外部32K晶振 #define BZ_ON 0x09 // 蜂鸣器开 #define BZ_OFF 0x08 // 蜂鸣器关 #define BZ_4K 0x40 // 蜂鸣器4kHz #define BZ_2K 0x60 // 蜂鸣器2kHz #define IRQ_ON 0x88 // 中断开 #define IRQ_OFF 0x80 // 中断关 #define TIME_ON 0x06 // 定时器开 #define TIME_OFF 0x04 // 定时器关 #define CLRTIME 0x0C // 清定时器 #define CLRWDT 0x0E // 清看门狗5.2 延时函数// 短延时用于调整时序 void dada(unsigned char count) { volatile unsigned char g; for(g 0; g count; g) asm(nop); } // 10ms级延时根据主频调整参数 void delay10ms(unsigned char count) { volatile unsigned char i, j; for(i 0; i count; i) for(j 0; j 200; j) { asm(nop); _clrwdt(); } }5.3 底层位发送函数// 从高位开始发送 cnt 位数据 void sendbit_high(uchar data, uchar cnt) { uchar i; for(i 0; i cnt; i) { if((data 0x80) 0) dat 0; else dat 1; wr 0; _nop(); dada(3); // 保证tCLK低电平宽度 wr 1; data 1; dada(1); } } // 从低位开始发送 cnt 位数据用于发送4bit显示数据 void sendbit_low(uchar data, uchar cnt) { uchar i; for(i 0; i cnt; i) { if((data 0x01) 0) dat 0; else dat 1; wr 0; _nop(); dada(3); wr 1; data 1; dada(1); } }5.4 写命令函数// 向HT1621发送命令 void sendcmd(uchar command) { cs 1; wr 0; dat 0; cs 0; // 片选拉低开始通信 sendbit_high(0x80, 3); // 命令前缀 100 sendbit_high(command, 8); // 8位命令码 sendbit_high(0x00, 1); // 1位填充 cs 1; // 片选拉高结束通信 }5.5 写显示数据函数// 向指定地址写入4bit显示数据 // addr: 0~31对应SEG0~SEG31 // data: bit0~bit3 对应 COM0~COM3 void write_1621(uchar addr, uchar data) { cs 1; wr 0; dat 0; cs 0; // 片选拉低 sendbit_high(0xA0, 3); // 写数据前缀 101 sendbit_high(addr 2, 6); // 6位地址左移2位后取高6位 sendbit_low(data, 4); // 4位数据从低位先发 cs 1; // 片选拉高 }5.6 读显示数据函数uchar r_data; // 全局变量存放读取的数据 // 从低位开始读取 cnt 位数据 void red_bit_low(uchar cnt) { uchar i, j; _pbc0 1; // PB0切换为输入 _pbpu0 1; // 使能上拉 r_data 0; j 0x01; for(i 0; i cnt; i) { rd 0; _nop(); dada(10); // 等待数据稳定 rd 1; // RD上升沿数据输出 if(dat 1) r_data r_data | j; j j 1; dada(10); } _pbc0 0; // PB0恢复为输出 _pbpu0 0; } // 从指定地址读取4bit显示数据 void red_1621(uchar addr) { cs 0; sendbit_high(0xC0, 3); // 读数据前缀 110 sendbit_high(addr 2, 6); // 6位地址 red_bit_low(4); // 读取4位数据 cs 1; }5.7 初始化函数// HT1621初始化 void HT1621_Init(void) { // 配置引脚为输出DATA在读时会临时切换 _pac4 0; // PA4 CS 输出 _pbc1 0; // PB1 WR 输出 _pbc0 0; // PB0 DATA 输出 _pbc2 0; // PB2 RD 输出 cs 1; wr 1; dat 0; rd 1; sendcmd(RC256); // 选择内部RC振荡器 sendcmd(BIAS); // 设置1/3 bias, 4 COM sendcmd(SYSEN); // 开启系统振荡器 sendcmd(LCDON); // 开启LCD显示 // 清屏全部写0 unsigned char i; for(i 0; i 32; i) { write_1621(i, 0x00); } }5.8 主函数测试例程void main(void) { unsigned char i; HT66F0185_Initial(); // MCU初始化时钟、看门狗等 HT1621_Init(); // HT1621初始化 while(1) { _clrwdt(); // 全灭 for(i 0; i 32; i) write_1621(i, 0x00); delay10ms(200); delay10ms(200); delay10ms(200); delay10ms(200); // 全亮 for(i 0; i 32; i) write_1621(i, 0x0F); delay10ms(200); delay10ms(200); delay10ms(200); delay10ms(200); } }六、关键函数解析6.1 为什么写数据用sendbit_low而命令用sendbit_highHT1621 的协议规定命令前缀和地址从高位MSB开始发送显示数据4bit从低位LSB开始发送显示数据的 bit0 对应 COM0bit1 对应 COM1以此类推。从低位先发正好符合data 0x01逐位右移的发送顺序。6.2 地址为什么要左移 2 位sendbit_high(addr 2, 6);sendbit_high函数是从data 0x80最高位开始取位发送的。发送 6 位时取的是data的 bit7~bit2。将addr0~31实际只用 5 位但协议是 6 位左移 2 位后addr 的 bit0 就对齐到了 data 的 bit2这样发送 6 位时正好把 addr 的 6 位全部发出去。6.3 初始化顺序为什么不能乱正确的初始化顺序是RC256或 XTAL32K—— 先选时钟源BIAS—— 设置偏压和 COM 数SYSEN—— 开启系统振荡器LCDON—— 开启 LCD 偏压发生器必须先 SYSEN 再 LCDON否则 LCD 偏压电路没有时钟驱动屏幕不会亮。这是新手最容易踩的坑之一。七、常见问题与调试技巧7.1 屏幕不亮排查步骤测电压VDD 是否正常2.4~5.25VVLCD 是否有电压查时序用逻辑分析仪抓 CS、WR、DATA 波形确认命令是否正确发出查初始化顺序是否先 SYSEN 后 LCDON查 BIAS 设置是否与实际 LCD 屏的 COM 数匹配4 COM 用 0x29查对比度VLCD 电容是否焊接可尝试调整 VLCD 电压7.2 显示乱码或段不对确认 COM/SEG 接线LCD 屏的 COM 端是否接对了 COM0~COM3确认数据 bit 对应关系bit0→COM0bit1→COM1不要搞反地址范围addr 只能是 0~31超出会导致异常7.3 读写切换时数据异常读操作前必须将 DATA 引脚设为输入并使能上拉读完后立即恢复为输出。如果忘记恢复后续写操作会失败。代码中red_bit_low函数已正确处理。八、国产替代方案远乐 YL1621在当前供应链环境下国产替代已成为嵌入式开发者的必备技能。远乐科技 YL1621是一款与 HT1621 完全兼容的国产 LCD 驱动芯片具有以下优势8.1 兼容性Pin-to-Pin 兼容封装、引脚定义完全一致无需改 PCB命令集兼容所有命令码、读写时序完全相同软件零修改电气特性兼容工作电压、驱动能力、偏压方式一致8.2 替代优势表格对比项HT1621合泰YL1621远乐产地中国台湾中国大陆供货周期受国际物流影响国内现货交期稳定成本—更具竞争力技术支持英文 datasheet 为主中文技术支持响应快抗静电能力标准优化 ESD 防护8.3 替代方法使用 YL1621 替代 HT1621 非常简单硬件直接更换芯片PCB 无需任何修改软件上述代码完全不需要改动直接编译运行即可初始化命令序列完全相同RC256 → BIAS → SYSEN → LCDON远乐 YL 系列还包括 YL1620、YL1621、YL1625、YL1628、YL1640 等多款 LCD 驱动 / LDO 芯片覆盖不同段数和封装需求可根据项目选型。国产替代选型咨询可联系曾工提供完整的替代方案和技术支持。九、总结本文详细讲解了 HT1621 LCD 驱动芯片的通信协议、硬件连接并提供了一套基于合泰 HT66F0185 单片机的完整驱动代码包括✅ 底层位发送高位 / 低位两种模式✅ 写命令、写数据、读数据✅ 标准初始化序列✅ 全亮 / 全灭测试例程✅ 常见问题排查指南✅ 国产替代方案YL1621这套代码经过实际项目验证可直接移植到其他 MCU 平台只需修改引脚定义和延时函数。在供应链波动的当下掌握 HT1621 的驱动原理并了解国产替代方案对每一位嵌入式工程师都具有实际价值。原创声明本文为原创技术文章代码可自由使用于商业和非商业项目。转载请保留作者信息和出处。技术交流与芯片选型可联系远乐曾工。