十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

液晶屏选型与驱动实战:从段码屏到TFT,避开常见坑

液晶屏选型与驱动实战:从段码屏到TFT,避开常见坑 上周帮一个做温控器的朋友排查问题屏幕上明明有数据更新显示却一直卡在开机画面。查了半天才发现不是代码问题而是他在选型阶段把该用段码屏的项目做成了TFT项目整个供电、功耗、UI逻辑全被带偏。这种事我这些年见过太多次了屏选错比驱动写错更难救因为硬件已经焊上去了。驰宇微的液晶屏在国产屏里算是性价比很能打的一类段码LCD、12864图形点阵、TFT彩屏都有覆盖而且支持开模定制。但它和所有屏厂一样选型、驱动、定制三条线各自都有不少坑。这篇文章我把实际项目里摸出来的经验整理一遍从“怎么选品类”讲到“怎么驱动HT1621B段码屏”再讲到DM12864M J-1这种12864模块的串行6线接法最后聊TFT彩屏和定制开模流程。适合刚入行的单片机工程师也适合被屏厂技术支持搞到头大的老手。1. 驰宇微液晶屏选型第一课先搞清楚你要显示什么再谈品牌和型号很多工程师选屏第一反应是打开购物网站搜“液晶屏”看哪个尺寸便宜买哪个。这是最贵的选型方式。液晶屏不是随便一个长方块就能用段码屏、12864、TFT三种东西虽然都叫“液晶屏”但它们解决的问题完全不同。1.1 段码屏、12864和TFT的分界线不是价格而是“画面内容”我的判断方法很简单先回答一个问题——屏幕上要显示的是“固定的内容”还是“任意的内容”。如果显示内容在设计阶段就已经能穷举比如温度计的“25.6℃”、电表的“12345 kWh”、遥控器上的电量图标和信号图标那就该用段码屏。段码屏的每个笔段都是提前做死在玻璃上的点亮哪个段就显示哪个内容优点是成本低、功耗极低、阳光下可视性好缺点是内容完全固定改一个数字位置就得重新开模。如果显示内容是“汉字、英文、数字混合甚至偶尔要画个简易波形图”那就该用12864这类图形点阵屏。128×64的分辨率能显示4行中文带字库的ST7920方案在开发效率上优势很大。如果显示内容包含彩色图片、复杂动画、多级菜单交互比如洗衣机的大彩屏、智能面板的人机界面那就只能是TFT。TFT是一个个彩色的像素点想把界面做成什么样都行代价是功耗高、成本高、驱动复杂度也高。屏类型典型显示内容典型驱动方式开发难度单片成本区间功耗段码LCD数字、固定图标、字母HT1621B、HT1622、PCF8566低但要建段码映射几块到十几块极低12864图形点阵中文、波形、简单图形ST7920、KS0108、ST7565中字库屏更简单十几到几十块低TFT彩屏彩色UI、图片、动画ST7735、ST7789、ILI9341高初始化序列复杂十几到上百块高1.2 驰宇微比较常见的三类标准模块驰宇微的产品线里我实际接触过、也推荐过的标准模块大致分成三类。第一类是字符和段码类。1602字符屏是工控老常客段码屏则大多是按客户需求定制的但也有标准尺寸库存。这类东西引脚少、代码简单适合做状态显示。第二类是12864图形点阵屏。比如标题里提到的DM12864M J-1就是典型的ST7920带中文字库模块支持并行和串行模式。这类屏在国产设备里出现频率极高血压计、血糖仪、充电桩、工控面板到处都有。第三类是TFT彩屏。驰宇微常见的尺寸从0.96寸到3.5寸都有驱动IC覆盖ST7735S、ST7789、ILI9341、ILI9488。这类屏适合做用户界面但初始化过程和前面两类完全不同。需要特别注意同一型号的屏幕在不同批次里接口定义和驱动IC都有可能变更。采购前一定让供应商给最新的数据手册拿到货后先用原厂demo代码验证一遍不要直接拿网上两三年前的代码硬套。1.3 选型前必须拿到的5个参数不管跟哪个屏厂打交道选型表里必须有这5个参数工作电压、驱动IC型号、接口形式、工作温度范围、偏光模式。缺一个都可能出问题。工作电压决定电源方案3.3V系统千万不要随便买一个5V逻辑的模块电平转换会多出一堆事。驱动IC型号决定代码兼容性比如同样是1.8寸TFTST7735和ST7735S初始化序列有差异代码不能直接搬。接口形式决定引脚布线SPI省引脚8080并口速度快但占IO。工作温度范围决定了能不能用在户外或低温设备上普通屏0℃到50℃宽温屏能做到-20℃甚至-30℃。偏光模式影响显示效果正显屏白底黑字适合浅色外壳负显屏黑底白字看着高级但视角相对窄。2. HT1621B驱动段码液晶寄存器、显存映射和显示故障的完整链路段码屏的驱动芯片里HT1621B是国产设备上用得最多的型号之一。驰宇微的段码定制屏也经常推荐搭配这颗芯片因为它一颗就能驱动128个点而且支持按键扫描非常适合做小家电和手持仪表。2.1 为什么段码屏普遍配HT1621BHT1621B本质是一个LCD驱动器通过MCU的几根GPIO用串行方式控制。它内部有32×4的RAM映射也就是最多128个可控制点。对段码屏来说一个数字一般占7段一个小数点占1段一颗HT1621B差不多能驱动十几个数字加几个图标。这颗芯片受欢迎的原因有三个一是工作电压范围宽2.4V到5.2V都能跑3V纽扣电池和5V单片机都能带二是功耗低进入休眠模式后电流能压到微安级三是它把LCD偏压生成电路做在了内部外部只需要很少的电阻电容可以把PCB做得很小。实际用的时候你会发现HT1621B还能扫描按键。它内部有按键扫描逻辑可以省掉一颗专门的按键扫描芯片对小家电来说很划算。2.2 硬件连接与对比度调节最常用的连接方式是4线CS、WR、DATA再加上电源和地。RD引脚在纯写操作里可以不用。下面是一个典型连接关系。HT1621B引脚功能接法建议VDD芯片电源接3.3V或5VVSS地GNDVLCDLCD偏压通过电阻/电容网络配置影响对比度CS片选GPIO低有效WR写时钟GPIO上升沿锁存数据DATA串行数据GPIORD读时钟不用时悬空或接上拉对比度是段码屏最容易踩的坑。VLCD引脚外接的阻容网络决定了液晶的驱动电压驱动电压偏低显示会非常淡偏高屏幕会出现“鬼影”或者全段微亮。调试时建议先用一个50kΩ电位器临时调找到最佳阻值后再换成固定电阻。这个方法在驰宇微段码屏上也适用。2.3 初始化命令和写显存代码框架HT1621B的串行协议分命令和数据两种格式。命令模式以标志位101开头数据模式以标志位110开头后面跟着具体内容。先用一段示意代码说清楚写命令和写数据的基本函数。void HT1621_WriteBits(uint8_t data, uint8_t cnt) { for (uint8_t i 0; i cnt; i) { WR_LOW(); if (data (0x80 i)) DATA_HIGH(); else DATA_LOW(); WR_HIGH(); } } void HT1621_WriteCmd(uint8_t cmd) { CS_LOW(); HT1621_WriteBits(0x05, 3); // 命令模式标志 101 HT1621_WriteBits(cmd, 8); // 8位命令 CS_HIGH(); } void HT1621_WriteData(uint8_t addr, uint8_t dat) { CS_LOW(); HT1621_WriteBits(0x06, 3); // 数据模式标志 110 HT1621_WriteBits(addr, 6); // 6位RAM地址 HT1621_WriteBits(dat, 8); // 8位数据 CS_HIGH(); }初始化一般按这个顺序走先让芯片使能、打开系统振荡器然后配置偏压和占空比最后打开显示。具体命令字需要严格按照驰宇微或HT1621B数据手册里的命令表来不同封装的寄存器配置字可能略有差异网上代码只能做参考不能直接照抄。段码屏显示的核心是往显存里写位数据。HT1621B内部RAM的每一位对应屏上的一个笔段写1就显示写0就消失。所谓“点亮数字”就是把某个数字各个段的位数据组合后写到对应RAM地址里。2.4 段码映射表是定制屏的“灵魂”定制段码屏时厂家会提供一份段码映射图标明每个COM和SEG交叉点对应玻璃上的哪个笔段。这份映射表是整个项目里最重要的技术文档丢了它后面代码根本没法写。比如一个7段数字“8”由A到G共7个段组成每个段对应一个(COM, SEG)坐标。写显示代码时你得把数字0到9的段码列成一个表然后逐位填进HT1621B的RAM。这个阶段最容易犯的错误是映射表看反导致数字看起来像镜像。我的习惯是先把所有段循环点亮一遍全部点一圈之后再对照映射表确认而不是直接写显示逻辑。跟驰宇微这类屏厂沟通时直接开口要“Segment Map Excel表”一般都会给。如果只给PDF图纸建议自己按现有扫描顺序整理成表格否则后续写固件会很痛苦。2.5 段码屏“白屏/乱码/缺画”排查清单段码屏出问题八成不是屏坏了而是驱动配置不对。我把排查经验整理成一份清单按这个顺序查基本能定位现象可能原因处理方式完全无显示VDD没供上、CS极性不对、初始化命令没发成功示波器抓CS/WR波形检查初始化是否执行显示非常淡VLCD偏压太低、电源电压不足调大偏压测模块VDD是否在允许范围显示“鬼影”VLCD偏压过高、VDD纹波大降低偏压在VDD附近加104电容数字乱跳、缺画COM/SEG映射错误、数据位序不对对照Segment Map逐段点亮检查屏幕闪烁RAM刷新太慢、电源带载能力弱提高写显存频率换低内阻电源注意段码屏本身没有“刷新”问题但HT1621B的RAM值如果被主控周期性覆盖且两次写入间隔过长就会出现肉眼可见的闪烁。所以写入显存的函数路径不要加无谓延时。3. DM12864M J-1的串行模式6线接线与ST7920时序避坑12864这种屏很多人的第一反应是“用并口接线”。确实传统并口接线多程序写起来也直观但特别占单片机引脚。DM12864M J-1这类模块支持串行模式标题里说的“串行模式6线”就是省引脚的关键方案。3.1 “6线”到底指哪6根线DM12864M J-1模块的控制器一般是ST7920满血并口模式要用到DB0到DB7八个数据脚加上RS、R/W、E、PSB、RST十几个IO全被占了。串行模式可以大幅缩减引脚但这里有个容易混乱的地方不同商家说的“6线”定义不完全一样。我接触过的最常见的6线串行方案信号线是这6根PSB、CS、SCLK、SID、RST、A0其中电源和背光另算。具体到DM12864M J-1这类ST7920模块串行模式下的核心信号其实只需要PSB、CS、SCLK、SID四根但RST复位脚和A0脚也被引出来控制时就成了“6线”。引脚功能6线串行接法VSS地GNDVDD电源3.3V或5VVLCD对比度电位器分压PSB并/串选择接GND强制串行模式CS片选GPIO注意ST7920片选为高有效SCLK串行时钟GPIOSID串行数据GPIOA0/RS数据/命令指示按模块说明接GPIO或悬空RST复位GPIO上电后拉高LEDA/LEDK背光接背光电源一个很关键的点ST7920串行模式下数据/命令的区分是由控制字节里的RS位决定的A0/RS物理引脚在串行时序里并不参与数据解析。所以不少模块的串行接线图里把A0标为可选的但为了兼容不同批次模块稳妥做法是给它一个GPIO保持低电平或者按原厂demo初始化。3.2 串行时序忽略同步位的代码一定白屏ST7920串行通信的第一步每次传输前要先发送5个连续的1作为同步位然后紧跟RW位、RS位和一个0组成第一个控制字节。控制字节0xF8表示后面的数据是命令0xFA表示后面的数据是显示数据。另一个容易翻车的地方是ST7920串行模式下数据要按4位一组发送。也就是说一个8位的数据字节要先发高4位、再发低4位每次4位仍然用8位格式发送。很多人直接把8位数据一次发出去结果白屏加乱码。下面这段代码框架是ST7920串行写入的标准做法。void LCD_WriteByte(uint8_t dat) { for (uint8_t i 0; i 8; i) { SCLK_LOW(); if (dat 0x80) SID_HIGH(); else SID_LOW(); dat 1; SCLK_HIGH(); } } void LCD_WriteCmd(uint8_t cmd) { CS_HIGH(); LCD_WriteByte(0xF8); // 11111 RW0 RS0 0 LCD_WriteByte(cmd 0xF0); // 高4位 LCD_WriteByte((cmd 0x0F) 4); // 低4位 CS_LOW(); } void LCD_WriteData(uint8_t dat) { CS_HIGH(); LCD_WriteByte(0xFA); // 11111 RW0 RS1 0 LCD_WriteByte(dat 0xF0); // 高4位 LCD_WriteByte((dat 0x0F) 4); // 低4位 CS_LOW(); }如果显示数据是一串连续字节CS可以保持在有效电平SCLK和SID继续发送不需要每发一个字节都去翻转CS。但要注意CS在整个传输序列中必须保持高电平不能在写数据过程中拉低否则模块会解析成一次新传输。3.3 初始化顺序和图形/中文模式切换ST7920初始化比TFT简单但顺序错了一样白屏。基本流程是上电延时、复位、发基础指令集命令、开启显示、清屏、设置光标模式。示例代码如下。void LCD_Init(void) { delay(100); RST_LOW(); delay(20); RST_HIGH(); delay(50); LCD_WriteCmd(0x30); // 基本指令集 delay(10); LCD_WriteCmd(0x30); delay(10); LCD_WriteCmd(0x0C); // 显示开光标关 delay(10); LCD_WriteCmd(0x01); // 清屏 delay(20); LCD_WriteCmd(0x06); // 光标右移 }0x30在ST7920里是“基本指令集”的功能设定命令。虽然在串行模式下不会真的切换8位/4位硬件总线但这个命令字仍然要发给控制器。要显示中文基本指令集的0x30就够了如果要画点、画波形、显示图片就得先发0x34切到扩展指令集再开图形显示。显示屏上要同时出现中文字符和图形时画完图形要切回基本指令集否则中文显示会异常。很多项目的“汉字下半部分花屏”都是这个原因。3.4 PSB、A0、RST三个引脚的真实作用我花了不少时间才彻底搞明白这三个引脚在串行模式下的意义分开说。PSB是并/串模式选择串行模式必须接GND。有些模块内部有上拉电阻默认是并行模式你只要忘了处理PSB模块就永远进不了串行模式屏幕怎么初始化都没反应。A0/RS在ST7920串行协议里不是必须的因为控制字节的RS位已经区分了命令和数据。但在6线方案里很多人依然会接A0一部分模块的驱动IC或电平转换电路需要A0配合另一部分模块纯粹是引脚定义沿用并行命名。所以我建议还是接一个GPIO初始化时保持一致避免模块批次更换后出问题。RST是复位脚上电后应该有一个低脉冲再回到高电平。这个脚千万别悬空悬空状态下模块可能在上电瞬间处于不可控的内部复位状态偶尔能亮、偶尔白屏。在量产板上RST最好由单片机GPIO控制而不是简单用RC上电复位。很多12864白屏问题查到最后不是时序代码错而是CS极性理解错了。ST7920的CS是高电平有效普通SPI习惯是低有效这个反差是最常见的“坑中坑”。4. TFT彩屏不是“上了SPI就万事大吉”尺寸、驱动IC与初始化时序TFT彩屏是三类屏里看起来最高级的也是新手最容易“想当然”的。很多人觉得SPI接口连几根线就能点亮实际操作才发现无数个细节等着你。4.1 常见TFT尺寸与驱动IC选型表驰宇微的TFT屏常见尺寸和驱动IC对应关系大致如下但这个表只能做参考每一批货都要跟厂商确认驱动IC。尺寸典型分辨率常见驱动IC常用接口适合场景0.96寸160×80ST7735SSPI小型穿戴、状态显示1.44寸128×160ST7735SSPI手表、小面板1.8寸128×160ST7735/ST7735SSPI入门学习、简单UI2.0寸240×320ST7789SPI小家电彩屏2.4寸240×320ILI9341SPI/MCU交互面板2.8寸240×320ILI9341SPI/MCU人机界面3.5寸480×320ILI9488/ST7796MCU/RGB复杂UI同尺寸TFT的驱动IC不一定相同。比如2.4寸屏可能是ILI9341也可能是ST7789初始化寄存器序列差异很大。买屏时不要只写“2.4寸TFT”要让供应商把驱动IC型号标在规格书里。4.2 SPI接口没那么万能SPI接口最大优点是引脚少一般只需要SCLK、MOSI、CS、DC、RST五根信号线加背光控制也就六七个IO。但SPI的瓶颈是刷新速度。以240×320分辨率、RGB565格式算全屏一帧的数据量是240×320×2等于153600字节在20MHz SPI时钟下光推数据就要六十多毫秒再加上命令开销和初始化返回时间实际全屏刷新接近100毫秒。这种速度做静态界面、翻页切换完全够用但想做流畅的滑动列表、动画过渡就会露馅。如果产品界面比较重建议选8080并口或者RGB接口的TFT代价是引脚占用大幅增加。选型的时候一定要先评估UI复杂度再定接口方案。4.3 上电、复位、初始化三条铁律TFT屏点亮的核心是初始化序列。每个驱动IC都有自己的一套寄存器配置包括睡眠退出、像素格式、显示方向、电压设置、伽马校正等。驰宇微的屏一般会提供原厂demo代码直接对接最快。我建议把初始化过程分成三步先上电复位再发初始化序列最后开显示。示例框架如下。void LCD_Reset(void) { RESET_LOW(); delay(50); RESET_HIGH(); delay(100); } void LCD_Init(void) { LCD_Reset(); LCD_WriteCmd(0x11); // 退出睡眠模式 delay(120); LCD_WriteCmd(0x36); // MADCTL 显示方向 LCD_WriteData(0x00); LCD_WriteCmd(0x3A); // 像素格式 LCD_WriteData(0x05); // RGB565 16位 // 中间还要按驱动IC手册补全寄存器序列 LCD_WriteCmd(0x29); // 开启显示 }第一条铁律上电后先让逻辑电源稳定再给背光。背光LED的瞬态电流很大如果逻辑没起来就先亮背光容易出现电压跌落导致MCU复位。第二条铁律复位低电平脉宽要足够长至少10毫秒很多屏在脉宽过短时只亮背光不显示。第三条铁律初始化序列不能“精简”看到网上有人说只发几个关键寄存器就能点亮那是运气好量产必须把原厂完整序列搬下来。4.4 颜色异常和花屏的调试经验TFT最常见的两个现象是颜色不对和局部花屏。颜色不对比如红色显示成蓝色先检查像素格式是不是RGB565再看MADCTL寄存器里的BGR位。部分驱动IC默认是BGR顺序需要把MADCTL的BGR位置1屏幕才会显示正常颜色。这个问题的排查只需要发一条命令很多人却怀疑屏坏了。局部花屏比如上半屏正常、下半屏乱码大多是因为写入坐标窗口超过了屏实际分辨率或者写入的数据量超过了当前窗口宽度。调试时可以把坐标窗口设成全屏再写入排除窗口限制。还有一个容易被忽略的问题背光PWM频率太低会产生可见闪烁。PWM频率低于200Hz时尤其明显。把背光PWM频率提高到1kHz以上就好很多如果对亮度稳定性要求高直接用恒流背光驱动。5. 驰宇微液晶屏定制开模从需求表到量产我的实战流程与价格逻辑标准品满足不了需求时最后一步就是定制。定制屏的水比成品模块深不少很多人第一次接触“开模费”“MOQ”“段码映射”这些词会一头雾水。5.1 标准品解决不了再考虑定制我见过太多人一上来就要求定制屏最后发现标准品完全能满足需求。判断要不要定制就看三条第一屏幕要显示的图案是不是固定的形状且标准品中没有第二对颜色、偏光、视角、排线方式有没有特殊要求第三项目量有没有大到能摊薄开模成本。举个例子一款户外检测仪需要显示固定图标加数字普通段码屏库存型号没有这个图标组合这时候定制段码屏就是正解成本摊到单颗后可能比买标准品还便宜。反之如果只是换个屏幕尺寸先翻一遍驰宇微的标准品库存也许就有现成方案。5.2 定制流程七步走定制屏不是扔一张图过去就能开模正规流程是这样的需求沟通明确显示内容样式、工作电压、视角方向、工作温度、连接方式、背光颜色、外形尺寸。原厂评估屏厂根据需求出Layout图、COM/SEG分配图和初步规格书。确认规格书所有参数签字确认这一步改得越少越好。开模打样ITO玻璃光刻、偏光片贴合、背光组装做出第一版样品。样品测试上电点亮逐段验证显示内容。修改反馈多数项目会有一两轮小修改比如某个图标位置偏了。小批量试产和量产生产工艺稳定后放量。时间上段码屏玻璃开模一般35到45天背光和模组组装再加5到10天整体打样周期大概一个半月。如果你在赶产品节点建议提前两个月启动定制屏项目。任何把定制屏交期压缩到两周内的计划都是给自己埋雷。5.3 开模费与MOQ的“隐性成本”开模费是定制屏的第一道门槛。段码屏开模费根据玻璃尺寸、段数和工艺复杂度通常在几千到一两万之间。TFT屏的“定制”一般不重新做玻璃而是定制盖板、触摸屏、FPC排线费用结构不一样但同样有工程费。第二个门槛是MOQ也就是最小起订量。段码屏定制MOQ一般500到1000片这个数字对很多小团队来说并不小。更关键的是定制屏是“面粉做了就不能还原成小麦”一旦开模后续只能在原厂持续订货中途转其他家基本等于重新开发。备损率这件事一定要在执行层面算进去。定制屏量产中出现个别显示瑕疵是正常现象建议下单时预留3%到5%的备损量否则售后换机时你会发现手里一片替换屏都没有重新下单的交期又是好几周。5.4 样品验收和量产稳定性样品到手后不要只看“能亮”就放行。我每次验收定制段码屏会做这几件事第一逐段点亮测试。用测试固件把每一个COM/SEG组合都点亮对照Segment Map逐项确认任何一个段的位置偏差都要在打样阶段解决。第二多角度观察显示效果。从正前方、侧面、上下方向看有没有深浅不均、半亮不亮的段。第三测静态功耗。段码屏的优势就是低功耗背光关闭时整机电流应该在规格书范围内如果偏高说明偏压配置有问题。第四有条件的话做高低温存储测试。偏光片在高温高湿下容易出现气泡这种问题出厂时发现不了流入市场就是批量客诉。量产阶段一定要保留首件样品和测试报告后面每一批到货都抽测对比。屏厂的工艺会有波动早发现早找厂家处理拖到整机出货后问题会被放大很多倍。我在实际项目里用过不少驰宇微的屏也翻过车印象最深的是把ST7920的片选当成低有效来写白屏查了两天最后翻开数据手册才发现问题。从那以后我养成了一个习惯每次拿到新模块先看原厂demo代码里的引脚定义再读数据手册里的时序图最后才动焊接和写代码。选屏这件事本质是用最少的成本和功耗满足显示需求先把需求列表写清楚再对照屏幕类型和供应商逐个排除基本不会出大错。定制屏不用怕但一定要给足交期和验证时间赶出来的项目屏往往是第一个掉链子的。
返回列表