引子
HPDL-1414是一种支持部分ASCII(大写字母、数字、一部分特殊符号,具体来说是0x20~0x5F的字符)的四位数码管显示模块。HPDL-1414相较于普通数码管来说体积极小,作为显示模块颇有复古韵味。单个HPDL-1414的四个字符很难满足我们对显示字符的需求,并且HPDL-1414使用并行协议,会占用大量的端口,因此设计了仅需三根数据线就可驱动20字符的显示模块,并且兼容SPI协议。
模块使用
模块所需供电端口3个:+3.3V(为逻辑模块供电)、+5V(为HPDL供电)、GND,数据线逻辑电平为+3.3V,若使用+5V逻辑电平则+3.3V接入+5V。
数据端口3个:SCK、MOSI、CS,SCK为时钟信号,在上升沿读取MOSI上的信号,MOSI先发高位,CS为使能信号,CS上升沿刷新数据,此协议兼容SPI(单边沿、8位,低极性、MSB先发、无CRC、仅TX),最大时钟频率为60MHz(理论)、50MHz(实测)。
模块驱动已在GitHub开源,并且提供了一个样例工程:
模块制作
硬件部分在立创开源:HPDL1414x5显示模块(20字符、兼容SPI),PCB宽90mm,高20.1mm与HPDL-1414高度相同。
排母建议选择矮的圆排母,普通排母插的不是很稳。
通信协议
单次通信需要发送两个字节作为一个数据包,第一个字节为地址、第二个字节为ASCII,最右侧字符的地址为0x00(0),最左侧为0x13(19),ASCII的范围为0x20~0x5F。在每次实际刷新字符后,需要再发送一个地址为0xFC,ASCII为此次发送值的数据包以保证下次能正常刷新。
例如刷新0x10地址的字符为『1』(ASCII:0x31),首先正常发送数据包:
随后还需要发送一个地址为0xFC,ASCII为0x31的数据包。
实现原理
HPDL-1414
HPDL-1414共12个引脚,包含7个数据引脚(D0~D6),两个地址引脚(A0~A1),写控制(~WR)和两个电源引脚(VDD、GND),其种VDD为5V,逻辑电平兼容TTL(高电平2.0V)。注意1引脚为D5,12引脚为D6,6引脚VDD的对面是7引脚GND(引脚顺序按逆时针旋转)。
通信也很简单,保证写控制低电平时D0~D6、A0~A1有效即可。
串转并
HPDL-1414光是数据引脚都有7个,如果要直接驱动5个HPDL-1414就需要7+2+5=14个引脚,显然这太多了。为了减少数据引脚,我们容易想到使用串转并芯片,例如74HC595(8位串行输入、并行输出的缓存器),为了减少地址线,我们可以使用译码器,例如74HC138(38译码器)。
74HC595
74HC595主要由一个移位寄存器(将串行数据转换为并行数据)、锁存器(用于控制实际输出的数据)、三态控制构成。
DS(14引脚)为输入引脚,Q0–Q7(15引脚,1-7引脚)为并行输出引脚,~MR(10引脚)为复位引脚,Q7’(9引脚)为串行数据输出,通常用于与其他74HC595级联,SH_CP(11引脚)为数据输入时钟,上升沿时读取数据并移位,ST_CP(12引脚)为锁存时钟,上升沿时锁存移位寄存器中的数据,也就是说只有在ST_CP上升沿才会实际将移位寄存器中的数据输出,~OE为输出使能,高电平时输出为高阻态。
74HC138
74HC138是一个简单的译码器,将地址A0-A2(1-3引脚)译码到输出~Y0-~Y6(9-15引脚),~E1、~E2、E3均为使能,只有使能均有效时才正常译码,否则输出均为高电平。
原理图
因此,我们可以使用两片74HC595级联,分别储存地址信息和ASCII数据,地址的低位直接接入HPDL-1414的A0-A1,高位由74HC138译码后控制各个HPDL-1414的~WR:
更多可以参考开源的硬件工程HPDL1414x5显示模块(20字符、兼容SPI)。
其他问题
为什么还要发送一次地址为0xFC的数据
由于38译码器存在延时,因此虽然数据已经刷新,但是地址还没有更新,会导致其他位置字符也被刷新的问题。
可以继续拓展更多HPDL-1414吗
可以,若保持当前芯片数量不变,最多可以拓展到7个(因为还需要流出一个空地址),也可以通过级联38译码器增加地址范围来支持更多HPDL-1414。