使用 C 语言位运算和宏,编写一个可自由配置的 HV5812 + IV-18 荧光管驱动

有段时间觉得辉光管挺有意思,刚好也看到有类似尺寸的 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-iv18-driver-2

HV5812 及 IV-18 引脚

IV-18 荧光管是共阴极,总共有 17 个引脚需要驱动,分别是 G11-G91 的字符选择引脚,和 A-H 的字符段码选择,包括小数点。

hv5812-iv18-driver-3

HV5812 拥有 20 个高压驱动引脚可以使用,因为 IV-18 只需要使用 17 个引脚,这里还空闲了 3 个引脚。

hv5812-iv18-driver-4

HV5812 数据位序

根据 HV5812 的数据手册,它的移位寄存器是从低位到高位的,先送到的会到高位,这样在编写驱动时,就可以所有引脚状态使用一个 uint32_t 来表示,并通过位运算来将指定引脚的位置为 1 或 0。

hv5812-iv18-driver-5

在将数据传送给 HV5812 时,就可以从第 20 位判断 1 或 0,并且循环 20 次的方式来将 20 个引脚状态传送给 HV5812。

以下代码出于 lurt/iv18-vfd 项目,0x80000 就是对应了第 20 位数据状态,在每次处理完 1 bit 后,将数据向左位移 1 位,循环 20 次就是完整的 HV5812 锁存器数据,并且是高位对应了 HV5812 的高位引脚。

hv5812-iv18-driver-6

位运算 + 宏生成字符数据

在原作者项目的代码中,数字以及位置的数据代码是预先定义好的,这就导致了,如果引脚使用跟原项目不一样,显示的字符就会和预期的不一样,或者是位置和预期的不一样。

前面已经提到过,HV5812 驱动引脚和位置和 uint32_t 中各 bit 的状态是可以一致的,那就是说,我们完全可以将对应到 G11-G91 以及 A-H 这些引脚对应到 HV5812 中引脚位置,使用宏定义好,再通过位运算,在输出时将对应位进行置 1 或置 0。

定义 IV-18 与 HV5812 引脚对应关系

这里引脚定义后面的数字是从 1 开始的,对应到 HV5812 的 HVOUT1~HVOUT20。

hv5812-iv18-driver-7

生成需要将 IV-18 指定引脚置 1 的宏

hv5812-iv18-driver-8

这里通过宏进行拼接,就可以通过 POS(1) 或者 SEG(D) 这样的宏,来获取将 G11 或 D 段对应位置设置为 1 的数据了。

生成字符数据

有了上面这些宏,生成字符数据就简单了,直接根据段码显示规则,使用 SEG 宏将对应段置 1 的数据全部进行位或操作就行了。

hv5812-iv18-driver-9

这样在后续改了引脚时,完全不用修改字符对应数据的代码,因为它会从前面的引脚宏定义中自动生成出来。

生成字符和位置数据表

为了后续在显示数字时显示方便,可以将数字和对应位置的数据生成索引表,并写一个 GET_DATA 宏,来快速生成在指定位置显示指定字符的数据,例如可以使用 GET_DATA(1, 8) 就可以生成在第 1 位显示数字 8 的驱动数据。

hv5812-iv18-driver-10

注意这里 POS_TABLE 是反着定义的,因为在 IV-18 中,第 9 位才是最高位。

完成驱动

至此,已经完成了使用位运算和宏来生成 HV5812 驱动 IV-18 所需要数据,并且在引脚定义有变动时,完全不需要修改后面显示的代码,只需要修改引脚定义,就可以自动完成相关数据的更新。

总结

IV-18 的驱动比想象中简单,就是将对应段码的引脚输出高电平就可以了,可能因为 IV-18 的电流变化不太剧烈,XL6007 的电路没咋讲究也能凑合用。

为了能后续显示字母啥的,花了点时间把 HV5812 + IV-18 的驱动变成配置化还是值得的,虽然只有 7 段码,也能凑合着显示常用字母。

再次感谢 lurt/iv18-vfd 的开源项目,包括 PCB 和驱动代码。

参考资料

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>