我有一个 HD44780 LCD 屏幕,我一直在使用 Arduino 开发包提供的 LiquidCrystal 库。但是,它并不可靠。我注意到它存在一些问题,它不是中断驱动,而是只要开发人员认为芯片应该执行操作就休眠。
从规格表来看,BUSY 标志将在执行时设置,这意味着它可以被中断驱动。
有谁知道一个真正做到这一点的库,它是否需要连接所有 8 位,或者我可以将它保持在 4 个引脚上吗?
我认为您不需要为此中断。查看Arduino 发行版中的LiquidCrystal.cpp,您只需更改LiquidCrystal::write4bits
、LiquidCrystal::write8bits
和LiquidCrystal::pulseEnable
代码。前两种方法应该在写入数据之前从监控忙线(BD7)开始,最后一种方法将被修改以去除 100us 暂停。
我认为默认代码中没有这样做的原因是这些 LCD 的许多用户只是将 R/W 接地,因此显示器始终处于写入模式,因此无法读取 BUSY 信号。但是,通过将 _rw_pin 设置为 -1 将其传递到库中,因此脉冲和写入代码可以有条件地使用 r/w 引脚作为检测忙的一种方式,以优化速度。
可以在三个引脚上使用 8 位;你只需要一个移位寄存器。我使用的是 mouser.com 的 HEF4094BP(运费将比实际芯片贵)
移位寄存器的接线图和代码修改在这里: http ://www.arduino.cc/playground/Code/LCD3wires
前段时间我修改了 LiquidCrystal 库以支持忙标志。请注意,真正的中断驱动操作是不可能的 - 对于每次读取,您需要切换E
nable 线两次。因此,您将需要轮询繁忙标志。
然后我做了一些基准测试,发现轮询繁忙标志比等待大多数命令要慢。(“clear”和“home”命令除外)。原因是,在读取模式和写入模式之间切换需要额外的步骤,例如 8 次额外调用digitaWrite
和 8 次额外调用pinMode
. 即使使用 16MHz Arduinos,这也比等待 100µs 慢。
之后,我编写了一个库,可以直接以批量模式操作引脚寄存器——所有 8 个引脚都具有一个寄存器访问权限。在那之后,我在球场上通过投票获得一些好处。