|
二手市场入手了几片超大单色液晶屏(GEM-TECH GTG-3201283),分辨率 320x128,在众多 12864 中算是鹤立鸡群。
然而价格低的离谱:每片 ¥19.99 包邮,要示例代码的话额外加钱。
一看这主控都有型号,自己测测也就点亮了,于是果断放弃要代码,准备自己搞。
然而大意了,这片液晶根本不是开往幼儿园的车,跳车都来不及。
为了点亮它我几乎复习了整个液晶的驱动原理,特写下来与大家分享。
【显示原理】
关于显示为啥要用点阵,大概就是用数字方块来模拟现实世界的一种方式吧,参考 minecraft。
首先考虑发光管 LED 点阵,就是满大街光污染的走字广告牌,显示电路大致如下图 (a) 所示:
行线(Commons) 与 列线(Segments) 同时使能时(=ON),对应交叉点的 LED 正向通电点亮。
然而这种方式对液晶 LCD 点阵无效,参考上图 (b). 液晶的每个像素相当于一个小电容,充电就“变黑”,放电就“透明”。
对于未使能的行线,即 Commons=OFF 状态,电容可能被反向充电,导致 LCD 像素意外“变黑”,显示出错。
为此需要用更复杂的波形驱动 LCD 点阵,如下图 (b) 所示。行线、列线上被加载了不同振幅、不同相位的交流信号,
只在行列均使能(=ON)的交叉点上,电容可以获得最高 Vpp 的交流信号,像素正确“变黑”。
其他像素虽有交流信号,但 Vpp 未达到“变黑”阈值,也就保持透明状态。
该阈值若匹配不当,就是点阵液晶常见的“暗淡”、“鬼影”现象。
【串行传输】
基于上述分析,工程上有常见的芯片组合实现相应驱动,如下图所示。
LED 点阵常用 HC595-HC164 组合,HC595 级联后加载列线(Segments),HC164 级联后加载行线(Commons);
LCD 点阵的芯片比较花,我这次入手的就是 NT7086 驱动,四片级联驱动列(320px),再两片级联驱动行(128px)。
从原理上来看,此次入手的液晶屏驱动时序应该与 LED 点阵相仿,需要单片机正确输出移位+锁存信号。
【为何没用u8g2】
说到玩屏,估计不少朋友都接触过 Arduino 以及 u8glib/u8g2 图形库,简单粗暴有疗效。
我起初也是这么想的,结果等理清了液晶电路,彻底傻眼:
传统的牛屎 12864 或者 FPC-COG 液晶如右侧所示,在 NT7086 或同类基础上多了一片 MPU,实现物理显存、总线适配。
这也是单片机访问完 12864 以后,可以去做其他工作的原因,例如 delay 完全卡死也不影响显示。
而这次的 320x240 液晶,完全拿掉了这片 MPU(左图),导致单片机得模拟这片 MPU 工作,得有显存,得有扫描时序...
更糟糕的是,液晶的 Commons 线有 128 根,扫描时序为 1/128 duty. 但凡驱动单片机停一下,液晶就变成一条亮线...
而 u8glib/u8g2 的 HAL 层,都是默认了有 MPU 的液晶模块;像这片需要手动扫描的,资源完全不够用(需要模拟MPU)。
不过这都不是问题,点亮屏幕才是关键。
【点屏】
分析到这里,基本确认了驱动方向:模拟 MPU 扫描,然后在适当的位置模拟个显存。
液晶的排线为 12PIN-FPC1.0MM,为此特地购入抽屉座、排线以及杜邦线板,连接也要优雅:
由于 NT7086 本质上是移位寄存器,因而应该有静态特性,先写个手动扫描固件压压惊:
通电测试下效果,加载列驱动时液晶没反应,再搞上行驱动,液晶顺利点亮一条亮线。
确认驱动逻辑没毛病后,写一个简单的周期图像:
至此只是显示了些马赛克,还没真正达到刷屏状态,目标刷一张 320x128 的位图。
需要一张二值图,GIMP 先搞起来,充斥着修图取模的艰辛:
最后取模完成,刷进去没白瞎研究这么久:
大合照,没有额外的负压生成器,于是得两套独立电源:
最后附上主固件,含NT7086 手册:
以上,点亮了一片低配的单色液晶,顺手科普下液晶驱动原理。
最后祝大家点屏愉快!
从晶体管讲起,科普下 NT7086 系列 LCD 液晶屏代码该怎么写
https://www.mydigit.cn/thread-403154-1-1.html
补充内容 (2023-7-26 17:32):
Arduino 直连版本的 PCB 已搞好,详见 92 楼 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|