文章目录
有段时间觉得辉光管挺有意思,刚好也看到有类似尺寸的 LCD 小屏幕,就用 LCD 显示图片做了个 LCD 模拟辉光管时钟(见《AI 干了一半活,做个 LCD 模拟辉光管时钟》)。
不过这效果总是差点意思,后面看到有人分享的荧光管时钟,效果也还可以,但是价格相比辉光管要便宜不少,辉光管一个 60 元左右,荧光管 IV-18 8 位数字的就 90 的样子,就决定也来搞一个做个正经的荧光管时钟。
在立创开源平台找了一些开源项目进行参考,简单搞了个 IV-18 驱动板,基于 XL6007 DC-DC 升压 + HV5812 高压 LED 驱动芯片。在嘉立创打了样焊接测试也一次成功了。
HV5812 驱动拿了立创开源平台 lurt/iv18-vfd
的代码,用 ESP32-S3 也是可以直接驱动起来,能正常显示数字,不过在显示有些字符的时候会有一些异常,应该是跟我为了布线改动了 IV-18 和 HV5812 连接有关系。
HV5812 驱动板 PCB
为了保持面积紧凑,以及为了后续连接不同的 MCU 控制,把 XL6007 和 HV5812 集成到了一块 PCB 上,并且通过 2.54mm 排针将 HV5812 通信引脚暴露给 MCU 来连接使用。
HV5812 及 IV-18 引脚
IV-18 荧光管是共阴极,总共有 17 个引脚需要驱动,分别是 G11-G91 的字符选择引脚,和 A-H 的字符段码选择,包括小数点。
HV5812 拥有 20 个高压驱动引脚可以使用,因为 IV-18 只需要使用 17 个引脚,这里还空闲了 3 个引脚。
HV5812 数据位序
根据 HV5812 的数据手册,它的移位寄存器是从低位到高位的,先送到的会到高位,这样在编写驱动时,就可以所有引脚状态使用一个 uint32_t
来表示,并通过位运算来将指定引脚的位置为 1 或 0。
在将数据传送给 HV5812 时,就可以从第 20 位判断 1 或 0,并且循环 20 次的方式来将 20 个引脚状态传送给 HV5812。
以下代码出于 lurt/iv18-vfd
项目,0x80000
就是对应了第 20 位数据状态,在每次处理完 1 bit 后,将数据向左位移 1 位,循环 20 次就是完整的 HV5812 锁存器数据,并且是高位对应了 HV5812 的高位引脚。
位运算 + 宏生成字符数据
在原作者项目的代码中,数字以及位置的数据代码是预先定义好的,这就导致了,如果引脚使用跟原项目不一样,显示的字符就会和预期的不一样,或者是位置和预期的不一样。
前面已经提到过,HV5812 驱动引脚和位置和 uint32_t
中各 bit 的状态是可以一致的,那就是说,我们完全可以将对应到 G11-G91 以及 A-H 这些引脚对应到 HV5812 中引脚位置,使用宏定义好,再通过位运算,在输出时将对应位进行置 1 或置 0。
定义 IV-18 与 HV5812 引脚对应关系
这里引脚定义后面的数字是从 1 开始的,对应到 HV5812 的 HVOUT1~HVOUT20。
生成需要将 IV-18 指定引脚置 1 的宏
这里通过宏进行拼接,就可以通过 POS(1)
或者 SEG(D)
这样的宏,来获取将 G11 或 D 段对应位置设置为 1 的数据了。
生成字符数据
有了上面这些宏,生成字符数据就简单了,直接根据段码显示规则,使用 SEG
宏将对应段置 1 的数据全部进行位或操作就行了。
这样在后续改了引脚时,完全不用修改字符对应数据的代码,因为它会从前面的引脚宏定义中自动生成出来。
生成字符和位置数据表
为了后续在显示数字时显示方便,可以将数字和对应位置的数据生成索引表,并写一个 GET_DATA
宏,来快速生成在指定位置显示指定字符的数据,例如可以使用 GET_DATA(1, 8)
就可以生成在第 1 位显示数字 8 的驱动数据。
注意这里 POS_TABLE
是反着定义的,因为在 IV-18 中,第 9 位才是最高位。
完成驱动
至此,已经完成了使用位运算和宏来生成 HV5812 驱动 IV-18 所需要数据,并且在引脚定义有变动时,完全不需要修改后面显示的代码,只需要修改引脚定义,就可以自动完成相关数据的更新。
总结
IV-18 的驱动比想象中简单,就是将对应段码的引脚输出高电平就可以了,可能因为 IV-18 的电流变化不太剧烈,XL6007 的电路没咋讲究也能凑合用。
为了能后续显示字母啥的,花了点时间把 HV5812 + IV-18 的驱动变成配置化还是值得的,虽然只有 7 段码,也能凑合着显示常用字母。
再次感谢 lurt/iv18-vfd
的开源项目,包括 PCB 和驱动代码。
0 条评论。