|
一切的起始,要从某次入二手 19264 讲起,祸根系剁手所致。
应该是某地退役了一大批工业设备,才得以让这种屏比 12864 还便宜:
在这个触摸彩屏盛行的年代,牛屎单色液晶显得很不上档次。
怎么看都是上世纪的显示效果,偏偏简单好用,让这屏承载了太多对于高端设备的回忆。
Arduino 插上彩虹线,凑上对比度电位器,加载并行驱动。点亮没啥难度,甚至比插线过程还简单;
然这堆电线还外挂电位器着实不雅。于是决定折腾一下,让这些精巧的牛屎远离吃灰。
【硬件精简化】
大屏单色液晶采用 20 针并口通信,协议走 8080 或 6800 时序,部分型号支持 PSB 信号切换串行模式。
另需外挂一只电位器 RV 调节对比度,适配供电、温度差异下的最佳显示效果:
这么一套折腾下来,做固定功能的产品还算省事,有定制主板加持;
可到了日常随手连,密密麻麻排线加上外挂电位器,简直没法愉快玩耍。
反观同类并口 1602 字符屏,在 Arduino 生态下就有很好的改装方案:
图中黑色为 PCF8574 转接板,将 I2C 串行信号转到并行 1602,
同时集成灰度电位器、背光控制等一众功能;对外简单串行通信,方便连线,节省端口。
故而考虑在 19264 并行屏上引入类似机制,用于精简模块硬件连线。
虽然部分 19264 可通过 PSB 跳线改为串行模式,但为求通用性,统一当作并口液晶对待。
直接思路是 MPU 端使用三线 SPI 经 HC595 转为并口用于驱动 19264:
单加载数据端 D7:0 效率与直接的串口屏一致,单帧 SPI 就能加载 8bit 数据;
然而考虑到液晶 EN 线需要频繁的锁存脉冲,必须由额外的 SPI 帧来驱动,这会降低通信效率。
为此应适当放开部分 IO,将高频访问的控制线绕过串并扩展,直接交给 MPU 控制:
放开 IO 的设计,本质上又回归了并行通信的思路,因而必须谨慎对待。
手头几款并行液晶主控 KS0108、ST7920 默认采用 6800 总线,
每组指令/数据均为 EN 下降沿锁存,正好适配 HC595 的上升沿更新:
考虑到 LCM19264 的 6800-EN 信号需要频繁控制,不宜串行扩展,
故将 HC595 的 RCK 信号复用作 LCM19264 的 EN 信号,模块更为紧凑:
使用双 HC595 用作串并扩展,除 RCK 信号外共用 SPI 串行总线。
各自 RCK 信号用于区分 SPI 串并目标,实现数据、控制独立操作。
其中数据侧 D7:0 的 RCK_D 直接复用作 LCM19264 的写使能 EN 信号。
这样 RCK_D 上升沿 HC595 更新输出,下降沿液晶写入 D7:0 数据,两级完成无缝匹配。
先搞个万用板试下咸淡,除了外观巨大些,工作没毛病:
试好了赶紧打板,万用板辣么大不优雅:
装上蓝屏,跳线一连,顿时雅兴起:
至此基本确认双 HC595 硬件方案可行,并口屏无损直转四线串口,
板载灰度调节、背光控制,效果直追 1602 那个 I2C 驱动器。
比起直接 PSB 跳线改串行通信,兼容性和模块抽象是此次折腾的重点,
因而有必要深入到软件层面,继续折腾 HAL 封装,精简系统。
【软件抽象化】
玩 Arduino 图形编程怎能少了 U8g2 驱动库,一套代码几乎涵盖了所有单色点阵的场合,从液晶到 LED,简单粗暴疗效好。
本质上 U8g2 是一个多芯片的驱动合集,得益于 C++ 继承与派生特性,驱动库实现了 HAL 抽象封装,最高层 class U8G2 即为用户接口:
如果只是简单复制粘贴 U8g2 代码,就太浪费这个库的高层性能;
把新设计的串并转接板,连同 19264 液晶一同整合进 U8g2,才能玩的尽兴。
同样得益于 C++ 继承与派生,这种整合无需修改库文件,纯靠 “源码插件” 就能实现全部功能。
这样即使库文件定期升级更新,也不会影响到自制驱动效果:
如上图所示,绿色为 “源码插件”:在用户工程中添加全新派生类,编写底层 HC595 访问代码,最终实现与硬件完美匹配。
如下是驱动文件 Latch19264.h/.cpp 的编写预览:
驱动编写过程可以参考 U8g2 库里现成的液晶驱动类,除使用 C++ 语法实现 U8G2 派生类外,
着重移植 Display 和 Transfer 两个接口,前者对应液晶基础操作(含初始化代码),后者对应硬件基本传输(含串并转换)。
硬件驱动文件 Latch19264.h/.cpp 作为插件与用户工程一并编译,如下工程中定义了两套液晶,都是双 HC595 四线串并接口:
然后接上相应数据线,总计 4+4=8 (IO),实现单机双屏 19264 显示:
同为并口屏,顺手画了 12864 的串并转换单元,挂三个上来试试水:
一片只有 2KB 动态内存的 ATMEGA328 单片机,此时驱动了多片 19264、12864 进行独立图形显示,并且支持透明颜色绘图。
这在没有 U8G2 加持的时代,几乎是噩梦级的编程要求。
更进一步,需要综合测试上述【硬件精简】+【软件抽象】共同折腾出的显示单元帧率。
主控选用 Arduino 标准的 ATMEGA328,主频也为标准的 16MHz,以 Arduino 时基 millis( ) 作为计时单元。
实测单次 19264 全屏刷新时间约为 83ms,对应 12fps 帧率;
实测单次 12864 全屏刷新时间约为 70ms,对应 14fps 帧率。
这样的性能对于串行屏已然够用,毕竟重点关注的是简洁性与兼容性。
【结构艺术化】
家里领导是搞艺术的,对电路可谓一窍不通。串并虽然简化了连线,
但这种缺少日常使用场景的玩意,显然会被当成废品对待。
目前最大的问题在于,屏幕加上转接板没法自行站立显示,影响效果。
索性参考下美术生的画板架,屏支架就该这样搞:
屏幕尺寸简单量一量,CAD 左右夹持式支架画起来:
整体设计成前后左右上下倾斜到处可调,画好了凑方块拿去激光切割:
组装效果#1,窄版 12864,下排针插串并转接:
组装效果#2,宽版 19264,侧排针插串并转接:
至此,结构也成功艺术化了,终于可以光明正大摆桌面上被领导骂。
【不吃灰】
折腾这么久,就是防止剁手的液晶在箱子里吃灰。现在整机已然模块化,终于可以放开搭系统了。
先模拟个 MatrixOrbital,配合 AIDA64 玩个桌面副屏:
感谢 U8g2 的 GDI 加持,超大文字甚至不用自己取模,挑个喜欢的字体就有:
换个更随意的玩玩,AMG8833 红外热像仪,用像素抖动实现灰度,进而显示温度场:
当然,喜闻乐见的刷妹纸环节不能少,这次用 Arduino 板载电池带一下:
至此,巨大的 12864、19264 并口屏,终于也像其他 Arduino 模块一样简洁高效;
随手插上核心板,电气系统随思路喷涌而出。
附上上述 Arduino 代码,整理不易,仅在本坛分享:
-----------------------------------------------------------------------------------------------------------------------------
以上,用 Arduino 理念对 19264、12864 这类并口屏进行了全方位精简设计:
硬件上实现了通用四线串行通信,软件上编写了插件式 U8g2 驱动,外形上设计了仿画板支架。
终于折腾成简单易玩的显示单元模块。
最后祝大家 DIY 愉快!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|