前阵子帮朋友改造一台用了多年的工业仪表,原有的黑白 LCD 屏已经发暗看不清,原型号又早停产。思来想去换上了驰宇微 160128 液晶模块,160×128 点阵的分辨率足够复刻原机的整页界面,宽温特性也比 TFT 方案稳得多。整块屏从接线、驱动到现场调试大概花了一周,过程中踩了几个不是屏本身、但比屏本身更能耽误事的坑。这篇就把整个开发过程拆开讲:硬件怎么接、初始化代码怎么写、显存怎么组织,以及工业现场常见的故障排查思路。如果你是第一次用 160128,建议从第 2 节开始看;手头已经在调屏的,直接看第 5 节和第 6 节,应该能帮你少走几趟现场。
1. 为什么工业设备还在用 160128 这类点阵屏
1.1 在 TFT、串口屏和 OLED 之间绕了一圈
先说选型。很多人第一反应是:都什么年代了,还用单色点阵液晶?直接上 TFT 串口屏不是更省事吗?我一开始也是这么想的,后来在项目里对比了一圈,发现实际情况没那么简单。
TFT 串口屏开发确实方便,但成本和体积摆在那里,几十块钱的物料成本在工业产品里可能不明显,一旦产品要跑量,整机成本差异立刻放大。TFT 在强光下的表现也是硬伤,高亮背光在室外阳光直射下反而看不清,为了压过环境光,背光亮度只能往高了调,功耗跟着上去。高温场景下 TFT 液晶的老化速度也比 STN 屏快,机箱内部六十到七十度连续开机,彩色屏出现偏色、亮度衰减的案例不少见。
OLED 在阳光下同样不占优势,而且静态画面用久了会担心烧屏,工业界面偏偏又大多是静态信息,这点很不友好。12864 点阵屏倒是经典,但它每屏只能显示 16 列乘 8 行的 8×8 字符,稍微复杂一点的菜单页面就要翻好几页。160128 在中间找到了一个平衡点:单屏能显示 20 列乘 16 行 ASCII 字符,还能画曲线、画表格,界面复用价值高,逻辑部分功耗又低。
| 方案 | 分辨率 | 单屏信息量 | 强光与高温表现 | 功耗 | 适合场景 |
|---|---|---|---|---|---|
| 12864 | 128×64 | 8×8 字模下 16 列 8 行 | 不错,经典 | 低 | 简单提示类界面 |
| 160128 | 160×128 | 20 列 16 行,可绘图 | 宽温版较稳,太阳下可读 | 背光约 60-120mA | 工业仪表、医疗设备、HMI |
| TFT 串口屏 | 320×240 起步 | 信息量大 | 强光需高亮背光,高温衰减偏快 | 较高 | 图形密集、用户体验要求高 |
1.2 拿到屏先确认三件事:控制器、玻璃类型、视角方向
这个建议听起来基础,但我见过太多人拿到模块直接上网找“160128 驱动代码”,结果怎么调都是花屏。因为 160128 只是一个显示规格,不同厂家、不同批次用的控制器可能不一样,初始化命令完全不同。常见的控制器有 S1D15705 以及兼容型号,也有模块用 ST7529、T6963C 这一类的,接口时序和指令集都有差异。
拿到屏以后,第一件事是看模块背面丝印,找控制器型号,或者直接向厂家要规格书和初始化例程。驰宇微的模块一般会明确标出控制器型号,资料也比较齐全,这一步不算难。确认不了控制器型号就盲目写驱动,等于蒙着眼睛调屏,后面大概率会浪费一天时间在奇怪的显示错位上。
玻璃类型同样影响视觉验证。常见的 160128 屏有黄绿底黑字、蓝底白字和 FSTN 黑白显示几种。黄绿屏的对比度在室内看得舒服,但视角有方向性,安装位置偏低就要选 12 点钟视角的型号,否则从操作员站位看过去,画面发灰发淡。这个参数在选型时就要定死,PCB 结构和安装角度都定了之后想换视角方向,往往得重新开模具。
还有一个经常被忽略的是工作温度范围。标准型模块和宽温型模块的成本差不了太多,但实际环境温度直接决定了液晶是否会“冻住”或“发黑”。户外设备建议直接问厂家要 -20℃ 到 +70℃ 的宽温版本,并确认控制器内部有没有温度补偿机制。价格贵不了多少,省下的却是冬天现场售后的人工成本。
2. 硬件接线:引脚定义、电源偏压和时序
2.1 引脚速查与 STM32 接线实例
160128 模块的引脚排列不同厂家会有差异,但绝大多数走的是通用 8080 并行接口,引脚类型基本一致:DB0-DB7、CS、RS(A0)、RD、WR、RESET、VSS、VDD、V0(偏压)、LEDA、LEDK。有几个模块还会把背光负极和逻辑地分开,方便做背光开关控制。
| 引脚符号 | 方向 | 作用 |
|---|---|---|
| DB0-DB7 | 输入 | 并行数据总线 |
| CS | 输入 | 片选,低电平有效 |
| RS/A0 | 输入 | 命令(0)/数据(1)选择 |
| RD | 输入 | 读选通,低电平有效 |
| WR | 输入 | 写选通,低电平有效 |
| RESET | 输入 | 复位,低电平有效 |
| VDD/VSS | 电源 | 逻辑电源 |
| V0 | 模拟 | LCD 偏压调节 |
| LEDA/LEDK | 电源 | 背光正极/负极 |
以 STM32F103 为例,我做了一个便于移植的 GPIO 接线:
| 模块引脚 | MCU 引脚 |
|---|---|
| DB0-DB7 | PA0-PA7 |
| RS(A0) | PB0 |
| WR | PB1 |
| RD | PB2 |
| CS | PB3 |
| RESET | PB4 |
| 背光控制 | PB5 经三极管/MOS 管控制 |
数据线要连续占据同一个端口的低 8 位,这样写数据时直接操作 ODR 寄存器,一次赋值,效率高。如果数据线分散在不同端口,说明文档时够用,但实际刷新一帧画面要操作多次寄存器,CPU 占用差别很大。
接线时还有一个容易出问题的地方:3.3V 逻辑的模块最好不要直接接 5V 单片机的数据线。有些模块标注的是宽电压,5V 电平可以直接兼容;但很多 COG 封装的模块逻辑电压只有 3.3V,数据线上灌 5V 电平,短时间看不出问题,长时间运行会加速控制器损坏。稳妥的做法是加电平转换,或者把 MCU 的 IO 配置为开漏模式并外接上拉到 3.3V。
2.2 偏压 Vop 和背光电源的计算
V0 是很多人第一次接线时会忽略的引脚。V0 决定了液晶的对比度,电压不合适,可能出现“全黑屏”或者“全灰屏”,看起来像没驱动,实际上是偏压不对。带内部升压电路的控制器一般通过命令设置 Vop,外部 V0 引脚只需要接一个上拉电阻或者直接悬空;没有内部升压的模块,则需要在 V0 和 VSS 之间接一个 10K 电位器,通过分压调整对比度。
背光则要单独算。白色 LED 背光的典型正向压降在 3.0V 到 3.2V 之间,单颗灯珠电流约 20mA,一整块 160128 屏通常有 4 到 6 颗灯珠并联,总电流 80 到 120mA。如果直接用 5V 电源串联限流电阻,限流电阻上的压降是 1.8V 到 2V,在 100mA 电流下功耗有 0.2W,电阻温度会明显升高。公式很简单:
R = (VCC - VF) / IF
假设 VCC=5V,VF=3.2V,IF=0.1A,算出来就是 18 欧姆。但这个电阻只解决了“有电”,解决不了电压波动引起的背光亮度变化,而且电阻发热会传导到液晶边缘。工业项目里我建议干脆用一颗 100mA 左右的恒流驱动芯片,或者用三极管搭一个简易恒流源,成本几毛钱,亮度稳定,寿命也更好。
背光电源必须和逻辑电源分开走线。很多“屏幕显示正常但时不时闪一下”的毛病,就是背光 PWM 调光的电流尖峰串到了逻辑电源上。
2.3 写时序为什么要自己控制
160128 这类模块的接口速度并不快,写周期典型值在百纳秒到微秒级别。TFT 常用的 FSMC 高速总线直接怼上去,不一定能稳定工作,因为 FSMC 的时序参数是按外部存储器的典型值设计的,对这类老式液晶控制器来说通常太快。我的建议是:先用 GPIO 模拟时序点屏,等画面正常以后再考虑要不要切到 FSMC。
GPIO 模拟写操作的逻辑顺序很简单:
- 片选 CS 拉低。
- 根据是命令还是数据,设置 RS 电平。
- 把数据写到数据总线上。
- WR 拉低,保持至少几百纳秒。
- WR 拉高,写入完成。
- 片选拉高。
读操作会多一步 RD,而且读数据时数据线要切换成输入方向。很多实际项目只用写不用读,因为控制器内部显示 RAM 可以被主机缓存一份副本,没必要频繁回读。
3. 驱动代码:从一根线点亮到像素坐标系统
3.1 底层读写函数
先把底层写函数固定下来。下面的代码基于 STM32 标准外设库风格,换到 HAL 只需把位操作替换成 HAL_GPIO_WritePin。
#define DATA_PORT GPIOA #define LCD_RS_PORT GPIOB #define LCD_RS_PIN GPIO_PIN_0 #define LCD_WR_PORT GPIOB #define LCD_WR_PIN GPIO_PIN_1 #define LCD_RD_PORT GPIOB #define LCD_RD_PIN GPIO_PIN_2 #define LCD_CS_PORT GPIOB #define LCD_CS_PIN GPIO_PIN_3 #define LCD_RST_PORT GPIOB #define LCD_RST_PIN GPIO_PIN_4 static void lcd_pin_set(GPIO_TypeDef *port, uint16_t pin, uint8_t level) { if (level) port->BSRR = pin; else port->BRR = pin; } static void lcd_data_out(uint8_t dat) { DATA_PORT->ODR = (DATA_PORT->ODR & 0xFF00) | dat; } static void lcd_write(uint8_t rs, uint8_t dat) { lcd_pin_set(LCD_CS_PORT, LCD_CS_PIN, 0); lcd_pin_set(LCD_RS_PORT, LCD_RS_PIN, rs); lcd_pin_set(LCD_RD_PORT, LCD_RD_PIN, 1); lcd_data_out(dat); lcd_pin_set(LCD_WR_PORT, LCD_WR_PIN, 0); delay_us(1); lcd_pin_set(LCD_WR_PORT, LCD_WR_PIN, 1); lcd_pin_set(LCD_CS_PORT, LCD_CS_PIN, 1); } static void lcd_cmd(uint8_t cmd) { lcd_write(0, cmd); } static void lcd_data(uint8_t dat) { lcd_write(1, dat); }这里 delay 用 1 微秒只是一个保守值。如果你查到手头模块手册里写时间指标比这个小,可以酌情缩短,但这类屏对写入速度并不敏感,保持稍慢一点反而更稳。
3.2 初始化序列里的每个命令都在干嘛
初始化是每个项目重复折腾最多的地方。以小尺寸 160128 模块常用的 S1D15705 系列控制器为例,常见的初始化流程如下。注意,不同批次模块的实际命令可能略有差别,务必以模块附带的数据手册为准。
void lcd_init(void) { // 硬件复位:拉低至少 10us lcd_pin_set(LCD_RST_PORT, LCD_RST_PIN, 0); delay_us(10); lcd_pin_set(LCD_RST_PORT, LCD_RST_PIN, 1); delay_us(20); lcd_cmd(0xE2); // 系统复位命令 delay_us(5); lcd_cmd(0x2F); // 打开内部升压/电源电路 lcd_cmd(0x40); // 显示起始行设为第 0 行 lcd_cmd(0xA0); // 列输出方向:正常扫描 lcd_cmd(0xC8); // 行输出方向:反向扫描 lcd_cmd(0x25); // 选择内部 Vop 调节电阻 lcd_cmd(0x81); // Vop 设置命令入口 lcd_cmd(0x35); // Vop 具体值,需要按实际面板微调 lcd_cmd(0xA5); // 进入全屏显示模式,用于验证 delay_ms(30); lcd_cmd(0xA4); // 退出全屏显示模式 lcd_cmd(0xAF); // 开启显示 }初始化做完以后,屏幕如果显示整屏黑块,说明 Vop 值太低,没有足够的偏压让液晶翻转;如果整屏白亮,通常是 Vop 太高或者扫描方向设置反了。遇到图像上下颠倒,就交换 0xA0/0xA1;左右颠倒就交换 0xC0/0xC8。这组命令没有绝对正确的值,只有和你面板匹配的值。
调试初始化时有个省时间的办法:把 0xA5 全屏测试命令放在开显示之前,如果全屏点亮正常,说明控制器和电源部分都没问题,问题大概率出在后续的扫描方向和 Vop 设定上。
3.3 显存缓冲:160×128 在代码里怎么组织
160128 点阵屏的一页通常按“8 行一页”来组织,128 行就是 16 页,每一页有 160 列。对 S1D15705 这类的控制器来说,显存地址可以理解为“页地址 + 列地址”:页地址从 0 到 15,列地址从 0 到 159,每写一个字节数据,控制器内部列地址会自动加一,写到 159 后再加一才会跳页。
代码层面最稳妥的做法,是在单片机内部维护一份 160×16 字节的显示缓冲区。每个字节代表一列中垂直排列的 8 个像素。像素坐标 (x, y) 到缓冲区的换算关系是:
#define LCD_COLS 160 #define LCD_PAGES 16 static uint8_t lcd_disp_buf[LCD_COLS * LCD_PAGES]; static void lcd_buf_set_pixel(uint8_t x, uint8_t y, uint8_t on) { uint8_t page = y >> 3; uint8_t bit = y & 7; uint8_t mask = 0x80 >> bit; // 高位对应上面一行 uint16_t index = page * LCD_COLS + x; if (on) lcd_disp_buf[index] |= mask; else lcd_disp_buf[index] &= ~mask; }这里把字节的高位对应屏幕上面的行,低位对应下面的行,是一种常见约定。如果你的模块扫描方向相反,把 mask 改成0x01 << bit就能纠正。
写完缓冲区之后,要把变化区域刷到屏幕上。控制器写命令通常是设置起始位置,然后连续写数据。
static void lcd_set_pos(uint8_t x, uint8_t page) { lcd_cmd(0x00 | (x & 0x0F)); // 列地址低 4 位 lcd_cmd(0x10 | ((x >> 4) & 0x0F)); // 列地址高 4 位 lcd_cmd(0xB0 | (page & 0x0F)); // 页地址 } void lcd_flush_area(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1) { uint8_t p0 = y0 >> 3; uint8_t p1 = y1 >> 3; for (uint8_t page = p0; page <= p1; page++) { lcd_set_pos(x0, page); for (uint8_t x = x0; x <= x1; x++) { lcd_data(lcd_disp_buf[page * LCD_COLS + x]); } } }这套缓冲加局部刷新的架构,是后面所有绘图、字符、界面代码的基础。先把它跑通,后面的显示功能都只是往缓冲区里画点。
4. 显示内容开发:字库、曲线刷新与多页菜单
4.1 ASCII 字模和汉字字模的处理
在缓冲区架构下,字符的本质就是“按规则把一批像素点亮”。ASCII 8×16 字体,每个字符 16 个字节,常规点阵字库文件里一般按“逐行从左到右”的顺序存:前 8 个字节对应上半部分的 8 行,后 8 个字节对应下半部分。需要把它们转换为缓冲区里的垂直像素到位。
void lcd_show_char8x16(uint8_t x, uint8_t y, uint8_t ch, uint8_t bg_clear) { const uint8_t *font = font8x16 + (ch - 0x20) * 16; for (uint8_t i = 0; i < 16; i++) { uint8_t line = font[i]; for (uint8_t b = 0; b < 8; b++) { uint8_t mask = 0x80 >> b; if (line & mask) { lcd_buf_set_pixel(x + b, y + i, 1); } else if (bg_clear) { lcd_buf_set_pixel(x + b, y + i, 0); } } } lcd_flush_area(x, y, x + 7, y + 15); }这个函数嵌套了两层循环,效率不算高,但在 STM32F103 这种主频 72MHz 的 MCU 上,显示几个字符完全没压力。如果界面要频繁刷新大量文本,可以用查表法把常用的 0 到 9、负号、小数点这些字符单独做成常量数组,减少乘法寻址的消耗。
汉字 16×16 字模的处理方式类似,只是每个字 32 字节,常见取模工具默认输出“逐列式”或“逐行式”两种格式。用 PCtoLCD2002 一类的软件取模时,建议选择“逐列式、阴码、顺向”,这样能直接和上方lcd_buf_set_pixel的像素方向对上。如果取出来的字上下颠倒,把取模软件里的“逆向”选项改一下就行。
4.2 带缓冲的局部刷新算法
很多第一次接触点阵屏的人会写出这样的主循环:每 100ms 调用一次全屏刷新,把 160×16 个字节全部重新写一遍。这在代码上最简单,但在工业现场会有两个问题。第一,全屏刷新期间如果 CPU 还要处理采样和控制任务,很容易产生抖动;第二,刷屏时画面闪烁感明显,尤其是动态数值跳动的时候。
局部刷新的思路是:只更新变化了的矩形区域。比如一个温度数值只占了屏幕右上角 40×16 像素的范围,改名时只需要 flush 这一小块区域。上面的lcd_flush_area已经实现了区域限制,实际调用时就是多传几个边界参数。
void lcd_show_temperature(float temp) { char str[8]; snprintf(str, sizeof(str), "%6.1f", temp); // 假设温度显示区域左上角在 (100, 16) lcd_clear_area(100, 16, 139, 31); // 先清背景 lcd_show_string8x16(100, 16, str, 0); }这样就避免了整屏刷新,看起来界面也清爽。需要注意的是,如果控制器写命令不支持“循环连续写一页后自动回卷”,区域刷新跨越多个页时,每一页都要重新设置列起始地址。
4.3 工业界面常用的小技巧
实际界面开发中有几个很实用的小技巧,属于那种“代码不难但没做过就想不到”的。
第一,曲线动态滚动。记录最近 100 个采样值,每次新数据进来,把整条曲线左移一个像素,再画最后一个点。这个过程在缓冲区里就是一次内存拷贝,再 flush 曲线区域,比全部重绘快得多。
第二,准备两套界面模板。正常运行页面显示实时数值和曲线,故障页面显示状态码。两套模板复用同一套绘图函数,只是绘制逻辑不同。这样页面切换时不需要重新编译整幅画面,不容易出现显示残留。
第三,多用反色强调关键信息。把缓冲区里某个区域的所有字节全部异或 0xFF,再刷新区域,就能做出高亮反色效果。这个操作很快,在菜单选中项和报警提示上非常好用。
第四,注意控制写屏频率。显示动态数据时,一般 200ms 刷新一次就足够,人眼感觉不到卡顿,CPU 也有余量。千万不要在定时中断服务函数里直接刷屏,复杂操作会拉长中断响应时间。
5. 现场最容易踩的五个坑
5.1 电源纹波引起的显示斜纹
第一个坑是显示画面出现稳定的斜纹,或者水平方向有一道道浅色条纹,数值刷新时条纹还会跟着缓慢滚动。很多人第一反应是屏坏了,换一块屏还是同样问题,最后才发现是电源纹波。这类模块的逻辑电源对纹波比较敏感,电源上叠加的噪声会导致控制器内部数据读写出错。
我用示波器测过,故障现场的 VDD 纹波超过 100mV,源头是设备里一个功率不大的开关电源。解决办法是在模块电源输入端加一个由磁珠和 100uF 电容组成的 LC 滤波,背光电源单独走一路。如果用的是 DC-DC 转换器,还建议把开关频率调到模块工作不会误触发的范围外。
5.2 宽温环境下的对比度漂移
第二个坑发生在冬天。设备在室外冻了一夜,早上开机,屏幕对比度变得很淡,过十几分钟温度上来才慢慢恢复。这是因为液晶材料的阈值电压随温度变化,温度越低,需要的驱动电压越高。控制器内部如果带温度补偿,默认值和你的面板匹配不一定好;不带温度补偿的模块,就要在软件里做补偿。
我的做法是在 EEPROM 里存一组温度补偿系数,程序读取板载温度传感器的值,按线性插值调整 Vop 寄存器。最基本的形式是:
static uint8_t lcd_temp_adjust(int8_t temp) { // 不同面板特性不同,以下数值为参考,必须实际标定 if (temp < -10) return 0x3A; if (temp < 10) return 0x36; if (temp < 40) return 0x32; return 0x2E; }标定时把设备放进高低温箱,从 -20℃ 到 +70℃ 每 10 度记一组最佳 Vop 值,再拟合成表。这个工作一次做完,后面所有同类设备都能复用。
5.3 复位与上电时序造成的花屏
第三个坑和设备上电时序有关。模块正常工作时没问题,但 MCU 复位或附近接触器吸合瞬间,屏幕偶尔会变成随机花屏,要断电重上电才能恢复。这个现象多半是复位脚被干扰拉低,或者 VDD 还没稳定时控制器就收到了执行命令。
解决分两步。硬件上,RESET 引脚加一个 10KΩ 上拉到 VDD,并联 1uF 电容到地,做一个简单的复位延时电路;没用的 RD 引脚不要悬空,直接上拉到 VDD。软件上,初始化时把系统复位命令放在靠前位置,并且在上电延时 50ms 后再进入初始化,避免 VDD 爬坡期间执行写操作。
5.4 排线和连接器在振动环境下的接触问题
第四个坑在振动场合尤其明显。屏幕用一段时间后出现局部行不显示,或者用手指按一下屏幕某个角,显示就恢复正常,过一会儿又不正常。这通常不是控制器坏了,而是排线连接器接触不良。工业设备如果长期运行在振动环境,排线座加卡扣是最好的选择,而且排线要固定住,不能悬空晃。
维修时也要注意,焊接模块引脚时烙铁温度尽量不要超过 320℃,单个引脚焊接时间控制在 3 秒以内,避免焊盘铜箔和玻璃基板连接处过热导致内部引线断裂。很多人修完排线没多久又坏,就是焊接温度没控制住,伤了内部连接。
5.5 背光功耗和低压差稳压器的发热
第五个坑是背光功耗。前面说过,白色 LED 背光总电流在 80 到 120mA。如果控制板用的是 LDO 线性稳压,输入 24V 经过 LDO 降到 3.3V,光是背光这一路就可能产生两瓦多的热,这在小机箱里是很严重的发热源。即使输入只有 5V,LDO 的耗散也不容小觑。
工业项目里最好把背光电源单独用一颗 DC-DC,或者直接采用开关型 LED 驱动。如果必须用 LDO,也要选输入输出电压差小的型号,并且让背光电流不要长期工作在最大额定值。
6. 量产前验收与多供应商替换注意点
6.1 一份能直接用的出厂检验清单
很多项目开发调通了就直接量产,结果第一批板子上线就被现场温度打回来,细究原因就是没做严格的环境验证。下面这份清单是从几个项目里总结出来的,可以直接拿去做投产前测试。
| 测试项目 | 方法 | 通过标准 |
|---|---|---|
| 低温启动 | -20℃ 放置 2 小时,通电 1 分钟观察 | 无花屏、无永久性暗线 |
| 高温老化 | 70℃ 连续运行 72 小时 | 无偏色、无区域性斑块 |
| 温度冲击 | -20℃ 到 +70℃ 循环 25 次 | 无玻璃裂纹、无水汽渗入 |
| 振动试验 | 10-500Hz 扫频 1 小时 | 排线无松动,显示无闪烁 |
| 静电放电 | 接触放电 4kV,空气放电 8kV | 画面无永久性异常 |
| 电源纹波 | 示波器测量 VDD/Vop 引脚 | 纹波低于 100mV |
| 视角确认 | 整机装配后在操作员站位观察 | 显示清晰,无灰底反白 |
这些测试不是说都要在产线逐台做,而是到货抽检和首件确认时至少要做一遍。尤其温度冲击和振动这两项,最容易暴露排线和连接器的潜在问题。
6.2 同型号不同批次屏的兼容性问题
最后说一个在原厂备料时容易掉坑的事。160128 这类老规格产品,不同批次换用不同控制器并不罕见。生产计划里如果要对标另一家供应商,或者采购时发现驰宇微这批货的控制器型号和上一批不同,一定要在程序里做适配。
我的做法是在驱动层定义一组初始化配置结构体,把列扫描方向、行扫描方向、Vop 初值、命令入口这些参数全部做成可配置项。硬件版本检测靠 PCB 上的拨码电阻或控制器型号读取来实现,程序启动时先读配置,再执行对应初始化。这样换屏不需要改代码,只需要更新配置文件。
同型号不同批次之间,哪怕控制器相同,Vop 的最佳值也会有微小差异。量产时可以在产线校准环节把一块标准屏的显示亮度作为基准,用式样调节 Vop 值后写入 EEPROM,保证同一批产品画面观感一致。这个流程听起来多了一道工序,但能省掉后续大量售后抱怨。
从我这几个月的使用来看,160128 已经不年轻,但把它当一块正常外设而不是黑盒,把接口时序、显示缓冲、电源噪声这些问题捋清楚,它反而比很多新器件更能扛住现场环境。上面这些坑也都是现场调试调出来的,不是看书看出来的。如果你的项目也在用类似的点阵屏,照着这篇的思路检查一遍,应该能省下不少现场跑路的时间。