|
首先感谢大家的支持!前些天写了一篇点亮 NT7086 液晶的帖子:https://www.mydigit.cn/thread-402876-1-1.html
原帖受限于篇幅,特地没过分展开,避免过早纠结于细致的技术点以至于忘了点屏大业。
应大家的呼声,今展开一段细致科普,从晶体管讲起,一路介绍到该怎么写 NT7086 驱动代码。
本质上是介绍数电中串入并出移位寄存器的驱动,熟悉此部分的朋友可以直接跳过本帖,当然也欢迎讨论。
【晶体管构建逻辑门】
这里仅以 PMOS-FET 晶体管为例构建逻辑门,实际工程中会有更为复杂的晶体管结构,但基本功能不变。
如下图所示,一只开关 SW1 切换 IN 端电压状态(12V/0V),经过 Q1 驱动后,带动灯泡 L1 工作。
当 SW1 拨至 L 端时,Q1 导通,L1 点亮;
当 SW1 拨至 H 端时,Q1 截止,L1 熄灭。
电路实现了开关状态(IN)到灯状态(OUT)的一个映射。把关键电路抠出来,就是传说中的【非门】,符号如下:
若规定电池负极电位(0V)为低电平(L),电池正极电位(12V)为高电平(H),则非门的逻辑描述为:
当 IN=L 时,输出 OUT=H;
当 IN=H 时,输出 OUT=L.
至此,获得了“非门”的构建思路。
再考虑另一个略复杂的电路,如下图,两只开关 SW1,SW2 切换状态,经 Q1,Q2 综合驱动,带动灯泡 L1 工作。
当 SW1,SW2 不全拨至 H 端时,Q1,Q2 不全截止,L1 点亮;
当 SW1,SW2 全都拨至 H 端时,Q1,Q2 全都截止,L1 熄灭。
电路实现了双开关状态(IN1,IN2)到灯状态(OUT)的一个映射。同样抠出关键电路,就是传说中的【与非门】,符号如下:
同样规定高低电平,则与非门的逻辑描述为:
当 IN1,IN2 不全为 H 时,输出 OUT=H;
当 IN1,IN2 全都为 H 时,输出 OUT=L.
至此,获得了“与非门”的构建思路。
实际的逻辑门还有更多种,但构建思路、构建方法大同小异,因而不多作介绍。
【逻辑门构建RS触发器】
在简单逻辑门的基础上稍加组合,就可以构成复杂的数字逻辑电路,不忘点屏初衷。
这里尝试构建 RS 触发器,最简单具有“记忆”功能的数字电路,是静态内存 SRAM 的基本构成。
如图所示,两只与非门反扭在一起,就是最经典的 RS 触发器。~S 和 ~R 为输入端,Q 和 ~Q 为输出端。
依照与非门的逻辑功能,可以推导出 RS 触发器的逻辑功能,如右侧表格所示。
当输入端 ~S,~R 均为 H 时,输出端 Q,~Q 保持前一刻的状态不变;
当输入端为其他状态组合时,输出端可以设定为相应状态(注意一般不使用 H,H 输出态)。
至此,获得了“RS触发器”的构建思路。
【RS触发器改进为D触发器】
然而 RS 触发器并不好用,输入端有一定的冗余,因而尝试升级为 D 触发器。
如图所示,在 RS 的基础上,再加一层“使能层”(U3-U5),就构成了更为复杂的 D 触发器。
同样依照 RS 的逻辑功能,可以推导出 D 触发器的逻辑功能,如右侧表格所示。
当输入端 CK=L 时,输出端 Q,~Q 保持前一刻的状态不变;
当输入端 CK=H 时,输出端 Q=D,输出端 ~Q 为反相的 Q.
拿逻辑门画的 D 触发器太费墨水,索性简化一下符号,获得【常规 D 触发器】:
发明 D 触发器的歪果仁闲的蛋疼,将两个常规 D 触发器串联,又出现了神奇的【边沿型 D 触发器】。
注意在符号上,CK 脚旁边有 > 符号的是“边沿型”,没有的是常规型:
可以证明,边沿型 D 触发器仅在 CK 的上升沿(即从 CK=L 到 CK=H 的瞬间)更新 Q=D,其他情况下 Q,~Q 均保持不变。
一般将边沿型 D 触发器的 CK 称作“时钟端”,D 称作“数据端”。
至此,获得了“边沿型 D 触发器”的构建思路。
【D触发器级联为移位寄存器】
有了边沿型 D 触发器能干什么? 串起来搞事情!点屏!
如下图所示,八只边沿型 D 触发器首尾相接、时钟 CLK 并联,形成了一个特殊的电路。
电路输入有两个脚 DAT,CLK,输出有八个脚 Q0-Q7.
按照边沿型 D 触发器的特性,每次 CLK 上升沿,触发器们同时将 D 的状态更新至 Q.
即当 CLK 出现上升沿时,Q6更新至Q7, Q5更新至Q6, Q4更新至Q5, ... ,Q0更新至Q1, DAT更新至Q0.
Q0-Q7 的状态整体右移了一位,故而得名【移位寄存器】。
实际上走到这一步,我们已经造出了一片 74HC164,8bit串行移位寄存器(DIP14封装):
至此,获得了“移位寄存器/HC164”的构建思路。
【移位寄存器升级锁存】
有了移位寄存器,还有什么可追求的? 显然是优雅,大愚若智的优雅,屏还是要点的。
如下图所示,在移位寄存器 Q0-Q7 的基础上,再装八个边沿型 D 触发器,最终输出 Qa-Qh:
后装的八个触发器不再是串联,而是逐一接在移位寄存器上,实现一个“同步锁存”的功能。
后台 Q0-Q7 移位工作的同时,前台 Qa-Qh 可以锁存住某个状态保持不变,故而得名【带输出锁存的移位寄存器】。
优雅到这一步,就出现了鼎鼎大名的 74HC595,8bit带输出锁存的移位寄存器(DIP16封装):
这片将近 60 岁芯片,至今仍活跃在大街小巷的广告牌上,甚至连脚序都没改过。
至此,获得了“带锁存的移位寄存器/HC595”的构建思路。
画一条分割线,硬件讲到这里,差不多够写代码了。
----------------------------------------------------------
【NT7086串行驱动】
液晶驱动器 NT7086,实则就是类似于 HC595/HC164 的移位寄存器。下图摘抄自 NT7086 手册:
可以看到 NT7086 的核心是一个带锁存的 80bit 移位寄存器。
从构建上来说,需要 80 个边沿型 D 触发器来作移位,然后再 80 个边沿型 D 触发器来作锁存。
对于移位寄存器的软件驱动,一般是按下图时序来进行:
以 8bit 移位寄存器为例,当输入了 8 个 CLK 正脉冲,并同步在 DAT 上输入相应电平(1=H, 0=L),
就可将输出端 Q0-Q7 设定为预想的样子。例如上图中 DAT 输入了 10110010,最终 Q7-Q0 的状态就被设定为 10110010.
硬件上只用了两根线(CLK,DAT),经过移位寄存器就可以控制八个独立的输出(Q0-Q7),这就是移位寄存器的作用。
对于 NT7086,移位寄存器有 80bit 长度,相当于两线输入(CLK,DAT),八十线输出(Q0-Q79)。
在软件上,基本就是写代码使得 CLK,DAT 按照预设的样子输出电平,大体如下:
实际上会用循环、指针等技巧,来避免代码太长,大体长这样:
对于 Arduino 环境,直接用 shiftOut 函数就可以驱动移位寄存器,简单粗暴:
【NT7086点屏】
实际点屏过程中,还需要参考 NT7086 手册上的工作时序,了解与理想 164/595 的差异,以便程序额外照顾:
至此,如果 C 语言功底还行的话,基本就能点亮基于 NT7086 的低配版液晶了,例如刷二进制计数图案:
-----------------------------------------------------------
以上,从晶体管讲起,科普下 NT7086 系列液晶代码该怎么写。
最后祝大家点屏顺利!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|