简介:这份规格书面向工业控制、仪器仪表、智能家居及便携式电子设备的硬件工程师与嵌入式开发者,提供信利TRULY液晶屏TSE1G0193的完整技术资料,帮助读者快速完成选型评估、接口设计与系统集成。资源包共1个文件,为PDF格式规格书,整体约1.21MB,内容涵盖主要特征描述、外形尺寸、极限参数、模块电气特性、背光电气特性、光电参数、接口定义、参考应用电路、可靠性测试条件、检查标准、使用注意事项及包装规格等章节,并附有版本修改记录与工厂联系信息。该屏为128×64点阵FSTN正显半透液晶模块,驱动IC为UC1601sGAA-N0-2,支持系统并口,输入电压3.3V,模块外围尺寸78.00×50.80×2.78mm,可视区域72.00×40.80mm,采用ROHS环保材料并通过ISO9001与ISO14001认证。目前已有164人学习下载,适合需要核对引脚定义、电气参数与可靠性指标的中高级开发者参考。
1. 信利TRULY液晶屏128x64 TSE1G0193规格书:一块单色点阵屏的选型与落地
如果你正在做一个低功耗的嵌入式设备,需要一块能显示中文、图标、波形,又不想上彩屏拉高成本和功耗的显示屏,那信利TRULY液晶屏128x64 TSE1G0193规格书大概率会出现在你的搜索记录里。这块屏是128×64点阵的单色LCD,属于经典的STN/FSTN段码式点阵模组,常见于工控面板、电力仪表、医疗设备、手持终端这类场景。它的核心价值在于:分辨率够用、接口简单、驱动成熟、供货稳定,而且规格书里把时序、供电、温度范围、背光参数都写得比较清楚,照着做基本不会翻车。但规格书是给硬件工程师看的,很多做固件的人拿到PDF会有点懵——引脚定义、时序图、指令表怎么对应到实际驱动代码?这篇文章就按“先看懂规格书、再跑通驱动、最后避坑”的顺序,把这块屏从选型到点亮的路径拆开讲。
2. 读懂TSE1G0193规格书:从引脚定义到驱动芯片选型
2.1 规格书里真正要盯住的四类参数
拿到一份128x64单色点阵屏的规格书,很多人第一反应是翻到“Absolute Maximum Ratings”看电压,然后就直接跳去画原理图了。但真正决定你能不能一次点亮的,是下面这四类参数,我一般会按这个顺序过一遍。
第一类是逻辑供电与LCD驱动电压。TSE1G0193这类模组通常逻辑VDD是3.3V或5V,但LCD面板本身需要偏压,常见做法是内部升压或者外部提供VOP。规格书里会写VOP的典型值和可调范围,这个值直接决定对比度。如果你用可调电阻分压,记得留一个可调范围,因为不同批次的屏最佳对比度会有差异,这是玄学,但也是血泪经验。
第二类是接口时序。12864点阵屏常见接口有并口6800/8080、串口SPI、I2C。TSE1G0193规格书里会明确写支持哪种,以及CS、RS、RW、E、RST这些控制线的有效电平和建立/保持时间。很多人驱动不亮,不是代码写错,而是时序里某个tAS或者tDS没满足,尤其是并口模式下E脉冲宽度不够。
第三类是驱动芯片型号。规格书里一般会写“Driver IC: ST7567”或者“Controller: ST7920”之类。这个信息比屏本身还重要,因为你的驱动代码本质上是写给驱动芯片的。ST7567和ST7920的指令集完全不同,一个偏向SPI/并口通用,一个自带中文字库。选型时如果规格书写的是ST7920,那你可以直接用它的字库显示中文,省一片Flash;如果是ST7567,那就得自己建字库或者用取模软件。
第四类是工作温度和存储温度。工业级一般是-20到70度,宽温能到-30到80。如果你做户外设备,低温下液晶响应会变慢,对比度下降,这不是代码能解决的,只能选宽温型号或者加加热膜。
下面这张表是我整理TSE1G0193规格书时常用的参数核对清单,你可以直接拿去对照自己手里的PDF。
| 参数类别 | 典型项 | 需要确认的点 |
|---|---|---|
| 供电 | VDD / VOP | 逻辑电压是否与MCU一致,VOP是否可调 |
| 接口 | 并口/SPI/I2C | 控制线数量、时序参数、电平极性 |
| 驱动IC | ST7567 / ST7920 / 其他 | 指令集、是否自带字库、显存映射方式 |
| 温度 | 工作/存储 | 是否满足现场环境,低温对比度补偿 |
| 背光 | LED阵列/侧光 | 正向电流、限流电阻、PWM调光频率 |
| 机械 | 外形/视窗/引脚间距 | 与结构件、FPC/排针是否匹配 |
2.2 驱动芯片选型:ST7567和ST7920的差别到底在哪
TSE1G0193规格书里如果写的是ST7567,那这是一颗纯点阵驱动,显存是132×65的,实际用128×64。它的指令集包括显示开关、起始行设置、页地址、列地址、对比度电子音量调节等。你写驱动就是往显存里填字节,每个字节对应一列8个像素。这种方案灵活,但中文显示要自己取模。
如果规格书写的是ST7920,那这颗芯片自带8192个中文字库和128个ASCII字符,支持并口和SPI。它的显存分文本区和图形区,文本区直接写GB2312编码就能显示汉字。很多工控屏喜欢用ST7920,因为固件省事。但ST7920的SPI时序比较特殊,它要求每次传输先发同步字节,再发数据,而且读写指令有固定格式,第一次调容易在这里卡住。
我一般会这样选:如果产品需要频繁显示中文菜单、报警信息,优先选ST7920方案,省Flash省开发时间;如果只是显示波形、图标、少量数字,ST7567更便宜也更好买。TSE1G0193具体是哪个版本,以你手里的规格书为准,但驱动思路是通用的。
2.3 从规格书时序图到最小系统接线
规格书里的时序图不是给你看着玩的,它决定了你GPIO怎么配、延时怎么加。以并口8080模式为例,一次写操作的基本流程是:CS拉低,RS置为命令或数据,RW置为写,然后把数据放到D0-D7,拉低WR,保持至少tWP时间,再拉高WR。读操作类似,但RW要置为读,并且在RD上升沿后读取数据。
最小系统接线其实不复杂,但有几个地方容易接错。RST复位脚一定要接,而且上电后要给一个至少10ms的低电平复位,否则驱动芯片可能处于未知状态。背光限流电阻要算对,规格书里会给背光LED的正向电压和电流,比如VF=3.0V,IF=20mA,你用5V供电,电阻就是(5-3)/0.02=100欧。但如果你用PWM调光,频率建议在1kHz以上,低于200Hz人眼会感觉到闪烁。
下面这段是STM32平台上用SPI驱动ST7567的初始化代码片段,你可以根据自己MCU的HAL库改。
// ST7567 SPI初始化示例,基于STM32 HAL库 // 注意:SPI模式建议CPOL=1, CPHA=1,具体以规格书时序为准 void lcd_init(void) { lcd_reset(); // 硬件复位,RST拉低10ms再拉高 HAL_Delay(50); lcd_write_cmd(0xE2); // 软件复位 lcd_write_cmd(0xA2); // 偏压设置,1/9 bias lcd_write_cmd(0xA0); // 段方向:正常 lcd_write_cmd(0xC8); // 行方向:反向,具体看屏的安装方向 lcd_write_cmd(0x2F); // 内部升压开,稳压开,跟随开 lcd_write_cmd(0x26); // 电阻分压比,对比度粗调 lcd_write_cmd(0x81); // 电子音量模式 lcd_write_cmd(0x20); // 对比度细调值,0x00-0x3F lcd_write_cmd(0xAF); // 显示开 }这段代码里,0xE2是软件复位,0xA2设置偏压比,0xC8是行扫描方向,0x2F是打开内部升压和稳压,0x81后面跟的0x20是对比度值。对比度这个值你可以在0x00到0x3F之间调,一般取中间偏上。如果显示太淡,先调这个,不要急着改硬件。
3. 用STM32跑通12864点阵屏:显存映射与中文字库
3.1 显存映射方式:页地址和列地址怎么算
128×64的点阵,驱动芯片内部显存通常是按页组织的。以ST7567为例,它把64行分成8页,每页8行,每页有132列,实际用128列。你要点亮坐标(x, y)的像素,先算页号:page = y / 8,再算列号:col = x,然后在该页的该列字节里,把第(y % 8)位置1。
这个映射关系决定了你写显存的方式。如果你要显示一个16×16的汉字,它跨2页、16列。你需要把字模数据按页拆分,分别写到对应的页和列地址。很多取模软件可以设置“纵向取模,字节倒序”或者“横向取模”,你要和驱动芯片的显存组织方式对齐,否则显示出来是乱码或者镜像。
我一般会在代码里维护一个显存缓冲区,大小是128×8字节,所有绘图操作先改缓冲区,再统一刷到屏上。这样刷新率高,也不会因为频繁写SPI导致闪烁。
// 显存缓冲区,128列 x 8页 uint8_t lcd_buffer[8][128]; // 设置像素点 void lcd_set_pixel(uint8_t x, uint8_t y, uint8_t color) { if (x >= 128 || y >= 64) return; uint8_t page = y / 8; uint8_t bit = y % 8; if (color) { lcd_buffer[page][x] |= (1 << bit); } else { lcd_buffer[page][x] &= ~(1 << bit); } } // 将缓冲区刷新到屏幕 void lcd_refresh(void) { for (uint8_t page = 0; page < 8; page++) { lcd_write_cmd(0xB0 + page); // 设置页地址 lcd_write_cmd(0x10); // 列地址高4位 lcd_write_cmd(0x00); // 列地址低4位 for (uint8_t col = 0; col < 128; col++) { lcd_write_data(lcd_buffer[page][col]); } } }这段代码里,0xB0+page是设置页地址,0x10和0x00是设置列地址的高4位和低4位。注意列地址是从0x10开始的,因为ST7567的列地址范围是0x10到0x8F,对应128列。如果你写0x00,可能会偏移。
3.2 中文字库方案:取模、存储和显示
如果你的驱动芯片是ST7567,没有自带字库,那中文显示就得自己解决。常见做法有三种:第一种是用PC端取模软件生成字模数组,直接编译进代码;第二种是把字模存在外部Flash里,按需读取;第三种是用GB2312字库芯片,比如常见的SPI字库芯片。
对于128×64的屏,显示16×16的汉字,一屏最多显示4行×8列=32个汉字。如果你只需要显示固定的一些菜单项,直接取模最省事。取模软件设置:阴码、逐列式、顺向、C51格式。生成的数组每个汉字32字节。
// 16x16汉字“中”的字模,逐列式取模 const uint8_t hanzi_zhong[] = { 0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10, 0x20,0x10,0x20,0x10,0x3F,0xF0,0x20,0x10, 0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0, 0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00 }; // 在指定位置显示一个16x16汉字 void lcd_draw_hanzi(uint8_t x, uint8_t y, const uint8_t *hz) { for (uint8_t col = 0; col < 16; col++) { // 上半部分,第0页 lcd_buffer[y/8][x+col] = hz[col*2]; // 下半部分,第1页 lcd_buffer[y/8+1][x+col] = hz[col*2+1]; } }这里要注意,字模数组的排列方式必须和你的显存映射一致。上面这个例子是逐列式,每个汉字32字节,前16字节是上半部分,后16字节是下半部分。如果你的取模软件设置不同,显示出来就是乱的。我一般会先用一个“中”字测试,确认方向、镜像、字节顺序都对了,再批量取模。
3.3 对比度调节与温度补偿
对比度是单色屏最容易翻车的地方。同一块屏,夏天和冬天的最佳对比度值可能差10个数值。TSE1G0193规格书里一般会给出VOP的温度系数,或者建议你在不同温度下调整电子音量值。
我一般会在固件里留一个对比度变量,默认值取规格书推荐值的中间,然后根据温度传感器读数做线性补偿。比如-20度时对比度值加8,25度时用默认值,70度时减5。这个补偿曲线不是线性的,但线性近似已经够用。
// 根据温度调整对比度,temp为摄氏度 void lcd_set_contrast_by_temp(int8_t temp) { uint8_t contrast = 0x20; // 默认值 if (temp < -10) { contrast = 0x2A; } else if (temp < 10) { contrast = 0x25; } else if (temp < 40) { contrast = 0x20; } else { contrast = 0x1A; } lcd_write_cmd(0x81); lcd_write_cmd(contrast); }这段代码只是示例,实际值你要根据自己屏的批次和现场环境微调。如果发现低温下显示拖影,那可能是液晶响应时间变长,不是对比度问题,只能选宽温屏。
4. 并口与SPI模式切换:时序参数和常见配置错误
4.1 并口8080模式:控制线时序和GPIO配置
并口模式的速度比SPI快,适合需要频繁刷新波形的场景。TSE1G0193规格书里会给出并口的时序参数,比如tAS(地址建立时间)、tDS(数据建立时间)、tWP(写脉冲宽度)、tWH(写高电平时间)。这些值通常是几十纳秒级别,对于STM32跑72MHz来说,直接GPIO翻转就能满足,但如果你用库函数逐条写,可能会超时。
我一般会这样配:CS、RS、RW、WR、RD用普通推挽输出,数据线D0-D7用推挽输出。写操作时,先把RS和RW设好,再把数据放到数据口,然后拉低WR,延时几个NOP,再拉高WR。读操作时,数据口要切换为输入模式,读完之后再切回输出。
// 并口8080写命令 void lcd_write_cmd_parallel(uint8_t cmd) { LCD_RS_LOW(); // 命令模式 LCD_RW_LOW(); // 写模式 LCD_DATA_OUT(cmd); LCD_WR_LOW(); delay_ns(50); // 满足tWP LCD_WR_HIGH(); delay_ns(20); } // 并口8080写数据 void lcd_write_data_parallel(uint8_t data) { LCD_RS_HIGH(); // 数据模式 LCD_RW_LOW(); LCD_DATA_OUT(data); LCD_WR_LOW(); delay_ns(50); LCD_WR_HIGH(); delay_ns(20); }这里的delay_ns需要根据你的MCU主频来写,一般用__NOP()循环。如果你发现写进去的数据不对,先用逻辑分析仪抓一下WR和数据的时序,看建立时间够不够。
4.2 SPI模式:CPOL/CPHA和速率选择
SPI模式接线少,但速率和时序模式要配对。ST7567的SPI通常支持模式0(CPOL=0, CPHA=0)或模式3(CPOL=1, CPHA=1),具体看规格书。我遇到过有人用模式0怎么都不亮,换成模式3就正常了,这不是玄学,是芯片在SCLK上升沿还是下降沿采样的问题。
SPI速率建议先降到1MHz以下调通,再逐步提高。128×64全屏刷新是1024字节,1MHz下大约8ms,对于大多数应用够用了。如果你要跑动画,可以提到8MHz甚至更高,但要注意PCB走线质量,线长了容易出错。
// SPI写一个字节,模式3 void lcd_spi_write_byte(uint8_t byte) { for (uint8_t i = 0; i < 8; i++) { LCD_SCLK_LOW(); if (byte & 0x80) { LCD_MOSI_HIGH(); } else { LCD_MOSI_LOW(); } byte <<= 1; LCD_SCLK_HIGH(); // 上升沿采样 } }这段是软件模拟SPI,如果你用硬件SPI,直接配好CPOL和CPHA就行。注意ST7567的A0引脚相当于RS,用来区分命令和数据,这个脚在SPI模式下也要接。
4.3 复位电路和上电时序
复位没做好,后面全白搭。TSE1G0193规格书里会写RST低电平的最短时间,一般是10ms以上。我一般会在上电后先给RST一个低电平,延时20ms,再拉高,然后再延时50ms等内部稳压稳定,再发初始化指令。
如果你用MCU的GPIO控制RST,注意上电瞬间GPIO可能是高阻态,最好加一个下拉电阻,保证RST在MCU初始化之前是低电平。否则屏可能在上电时进入未知状态,后面怎么初始化都不对。
5. 避坑与排查:12864点阵屏调试中的五个血泪教训
5.1 现象:全屏点亮但显示内容全是乱码
原因:显存映射方向搞反了。ST7567的段方向和行方向可以通过0xA0/0xA1和0xC0/0xC8切换。如果你取模时是正常方向,但屏装反了,或者初始化时方向设反了,显示就是镜像或者乱码。
解决:先显示一个全屏的棋盘格图案,确认行列方向。如果棋盘格是斜的,说明页和列的对应关系错了。调整0xA0/0xA1和0xC0/0xC8,直到方向正确。
5.2 现象:对比度调了没反应,或者只有全黑全白
原因:VOP电压不对。有些模组需要外部提供VOP,如果你没接,或者接的电压不对,对比度调节范围会非常窄。另外,0x81后面的对比度值如果超出范围,也可能没反应。
解决:先用万用表量VOP引脚电压,对照规格书。如果是内部升压,确认0x2F指令已经发过。对比度值从0x00到0x3F逐步试,每次改完等100ms再看。
5.3 现象:SPI通信时好时坏,偶尔花屏
原因:SPI速率太高或者CS信号处理不当。有些驱动芯片要求每个字节传输前CS拉低,传输后拉高,如果你一直把CS拉低,干扰会导致数据错位。
解决:降低SPI速率到1MHz测试。如果正常,再逐步提高。CS建议每个字节操作都拉低再拉高,虽然慢一点,但稳定。
5.4 现象:低温下显示拖影,响应慢
原因:液晶材料在低温下粘度增加,响应时间变长。这不是驱动问题,是物理特性。
解决:如果产品必须在低温下用,选宽温型号,或者加加热膜。软件上可以适当提高对比度,但效果有限。
5.5 现象:背光亮度不均,有暗区
原因:背光LED的限流电阻不一致,或者侧光导光板没装好。如果是并联LED,每个LED的正向电压有差异,导致亮度不均。
解决:改用恒流驱动,或者每个LED单独限流。如果是导光板问题,检查背光和屏的贴合是否紧密。
6. 进阶技巧:用局部刷新和双缓冲提升12864屏的刷新体验
当你把屏点亮之后,下一步就是让它跑得流畅。128×64的屏虽然小,但如果你每次改一个数字都全屏刷新,SPI模式下也要8ms,并口模式下虽然快,但频繁写也会占用CPU。我一般会用局部刷新加双缓冲的思路。
局部刷新的核心是:只刷新发生变化的那几页或者那几个字节。比如你显示一个时钟,秒数变化只影响最后两位数字,那就只刷新那16列。实现方式是在显存缓冲区里记录脏区域,刷新时只遍历脏区域。
双缓冲则是维护两个缓冲区,一个前台显示,一个后台绘制。绘制完成后交换指针,再统一刷新。这样不会出现绘制到一半屏幕撕裂的情况。
// 脏区域标记,按页记录哪些列需要刷新 uint8_t dirty_page[8]; uint8_t dirty_start[8], dirty_end[8]; // 标记脏区域 void lcd_mark_dirty(uint8_t x, uint8_t y, uint8_t w, uint8_t h) { uint8_t page_start = y / 8; uint8_t page_end = (y + h - 1) / 8; for (uint8_t p = page_start; p <= page_end; p++) { if (dirty_page[p] == 0) { dirty_start[p] = x; dirty_end[p] = x + w - 1; } else { if (x < dirty_start[p]) dirty_start[p] = x; if (x + w - 1 > dirty_end[p]) dirty_end[p] = x + w - 1; } dirty_page[p] = 1; } } // 局部刷新 void lcd_refresh_dirty(void) { for (uint8_t page = 0; page < 8; page++) { if (!dirty_page[page]) continue; lcd_write_cmd(0xB0 + page); lcd_write_cmd(0x10 + (dirty_start[page] >> 4)); lcd_write_cmd(0x00 + (dirty_start[page] & 0x0F)); for (uint8_t col = dirty_start[page]; col <= dirty_end[page]; col++) { lcd_write_data(lcd_buffer[page][col]); } dirty_page[page] = 0; } }这段代码里,dirty_page记录哪些页有变化,dirty_start和dirty_end记录变化的列范围。刷新时只写这些范围,能省不少时间。对于时钟、计数器这类应用,局部刷新能把刷新时间从8ms降到1ms以内。
还有一个技巧是使用硬件SPI的DMA。STM32的SPI支持DMA传输,你可以把显存缓冲区的数据直接通过DMA送到SPI,CPU只需要在传输完成后处理下一帧。这样即使全屏刷新,CPU占用也很低。
最后说一个我自己的习惯:每次调试新屏,先写一个测试函数,依次显示全亮、全灭、棋盘格、横线、竖线、边框,确认每一个像素都能独立控制。这个测试函数花不了多少时间,但能帮你排除90%的硬件和初始化问题。希望帮到你。
本文还有配套的精品资源,点击获取