多路复用LCD与Zilog的Z8 Encore微控制器的编程

使用 8 位 mcu、小型 bom 和本文提供的可下载代码来驱动多路复用 4 段 lcd 是一件简单的事情。
无需微控制器上的专用 lcd 驱动器即可直接驱动 lcd,并且需要很少的额外资源。lcd 有两种类型——静态和多路复用。本文讨论了多路复用 lcd 与 zilog 的 z8 encore!® 微控制器的编程。
z8 安可!闪存微控制器概述
zilog 的 z8 安可!产品基于 ez8™ cpu,并将闪存引入 zilog 广泛的 8 位微控制器系列。闪存在线编程能力允许更快的开发时间和现场程序更改。ez8 内核的高性能、基于寄存器到寄存器的架构保持与 zilog 流行的 z8 mcu 的向后兼容性。
z8 安可!mcu 将 20 mhz 内核与闪存、线性寄存器 sram 和大量片上外设组合在一起。这些外围设备造就了 z8 encore!mcu 适用于各种应用,包括电机控制、安全系统、家用电器、个人电子设备和传感器。
驱动液晶显示器
静态 lcd 具有用于 lcd 的每个段的单独引脚和一个公共背板引脚。照亮分段的要求是使分段偏向背板。另一个要求是 lcd 不能让直流电 (dc) 出现在段上。
为了防止段上出现直流,背板用低频方波驱动,段相对于背板进行切换。
多路 lcd 具有多个背板,并且多个段之间共享一个段引脚。为了照亮特定的段,段引脚与背板相反驱动,未使用的背板保持空闲状态。背板再次使用低频方波驱动,以防止分段上的直流偏置。
挑战
由于段的多路复用排列,对多路复用 lcd 进行编程可能是一项艰巨的任务。多路复用 led 通常为每个 led 数字配备一个单独的背板。然而,多路复用 lcd 将其背板布置在数字的顶部、中间和底部。这种安排会使解码过程变得非常复杂,但重要的是,即使具有专用 lcd 驱动器的微控制器仍然需要一个困难的解码过程(见图 1)。
图 1:分段排列。
下一个工程任务与照亮一段所需的电压有关。多路复用段的 on 驱动电平降低了,因为该段大部分时间都处于空闲状态,并且只有 25% 的时间被断言。实际上,这句话意味着在较低的工作电压下,一个段可能不会发光。
更复杂的情况是,当共享段引脚由当前活动的背板断言时,段可以在其关闭状态下感知电压电位。随着更多的背板被添加到显示器,这些对比问题可能会变得更糟,因为每增加一个背板,可用的导通电压就会降低,而剩余的关断电压会增加。
图 2 显示了每个背板的对比度如何降低,因为 on 段和 off 段之间的差异较小。在图 2 中,带有一个背板的静态显示器在开启电压时接收其可用 vcc 的 100%,在关闭电压时接收 0%。在三平面示例中,v cc的一半可用于 on 电压,off 段接收 v cc的四分之一。lcd 因制造商而异,但典型阈值电压为 2.3 v rms。
图 2:驱动电平。
由于只有一半的 v cc可用于导通电压,因此很容易看出 3.3 v 微控制器如何无法直接驱动多路复用 lcd。本文的目的是展示您可以在 3 v z8 encore 上驱动多路复用 lcd!单片机。
硬件架构
要使用 3 v mcu 驱动多路复用 lcd,必须提高驱动电平。为了减少门数和复杂性,只对背板进行了提升。段驱动电压摆动高于和低于 vcc 的二分之一;因此,增强的背板信号必须使用 z8 encore 以相同的方式执行!mcu 的端口引脚作为两个电荷泵,参考电压为 v cc的二分之一。ic1,4050缓冲器用于提供电平转换功能。
每个背板被驱动为高电平,并在其他平面被驱动时处于空闲状态。该过程被反转以去除任何直流分量,如图 3 所示。
图 3:背板波形。
通过在有源背板的相反方向上驱动段引脚来打开段,通过在有源背板的方向上驱动引脚来关闭段。在背板的空闲状态期间,任何段上的电压都低于阈值电压。结果,这些段保持不亮。
软件实施
由于 z8 encore 的额外速度和内存!家庭,假设开发发生在 c 编程语言中。如果软件被编写为易于移植,则用 c 编写的应用程序可以轻松移植到不同的环境。
考虑到这一点,宏用于特定于 i/o 的操作,以便在将代码移植到另一个设备时,大部分软件将保持不变。
以下代码段维护电荷泵。
/*电荷泵定义
电荷泵提升段驱动电压并在每个定时器中断时提供服务。正泵被拉低以充电并浮动到输入状态。充电时负泵悬空。电容以 1/2 vcc 为参考,电容器上的电荷似乎是 vcc +/- 参考。该宏还初始化端口的端口模式,因此它总是被刷新。
*/
#define chargepumpspdaddr=pxhd;
pdctl|= b3|b4; pdod&=~b3;
pdod|=b4;pdaddr=pxoc;
pdctl&=~(b3|b4); pdaddr=pxddr;
pdctl&=~(b3|b4)
#define floatpumpspdaddr=pxddr; pdctl|=b4|b3
以下宏管理背板驱动器。这些宏很复杂,因为每个背板只需要一个引脚,但每个背板需要两个引脚状态。
/*背板驱动器需要三种状态:on、off 和 idle。通过将 bp1 与 bp2、bp2 与 bp3 以及 bp3 与 bp1 混合,可以在每个平面上获得所有三种状态,而无需额外的引脚。
planex123
_______________
bp11101
bp20110
bp31011
`bp10010
`bp21001
`bp30100
*/
#define setupbackplanepdaddr=pxoc;
pdctl&=~(b0|b5|b6);
pdaddr=pxddr;pdctl&=~(b0|b5|b6)
#define bp1pdod&=~b6; pdod|=b0|b5
#define bp2pdod&=~b5; pdod|=b0|b6
#define bp3pdod&=~b0; pdod|=b6|b5
#define notbp1pdod&=~(b0|b5); pdod|=b6
#define notbp2pdod&=~(b0|b6); pdod|=b5
#define notbp3pdod&=~(b5|b6); pdod|=b0
最后,用于驱动段的宏。
/*下一个宏获取存储在显示缓冲区中的各个段并将它们放在端口上。它可以在没有宏的情况下完成,但这使它更通用。将有六个平面和两个缓冲区,因为有超过 8 个段*/
#define displaysegmentspaod&=~0xf8;
paod|=(缓冲区[平面]&0x00f8); pcod=0;
pcod|=((缓冲区[平面]&0x7f00)》》8)
如前所述,多路 lcd 中涉及的困难编程是一种相当不寻常的多路复用方案。前面的宏只是将先前解码的段从缓冲区放到端口上。由于解码过程如此复杂,它不在中断服务程序 (isr) 中执行。isr 必须尽可能短;isr 中所需的只是设置背板和驱动段。缓冲区是一个整数数组,其中包含我们显示中使用的 12 个段。该数组中的一维是平面。此维度中有六个平面,每个背板状态一个:a、b、c、a‘、b’ 和 c‘。解码过程完成后,缓冲区必须加载跨越六个平面的 12 段数据。
解码的第一步是定义字符的显示方式。此定义适用于所有七段显示器。因此,可以重用以下代码段。
#define dig_0seg_a | 段_b | 段_c | 段_d | 赛段 | seg_f
#define dig_1seg_b | seg_c
#define dig_2seg_a | 段_b | 段_g | 赛段 | seg_d
#define dig_3seg_a | 段_b | 段_g | 段_c | seg_d
#define dig_4seg_f | 段_g | 段_b | seg_c
#define dig_5seg_a | 段_f | 段_g | 段_c | seg_d
#define dig_6seg_a | 段_f | 段_g | 段_c | 段_d | seg_e
#define dig_7seg_a | dig_1
#define dig_8seg_g | dig_0
#define dig_9seg_a | 段_f | 段_g | 段_b | seg_c
#define dig_aseg_a | 段_b | 段_c | 段_g | 赛段 | seg_f
#define dig_bseg_f | 赛段 | 段_g | 段_d | seg_c
#define dig_cseg_a | 段_f | 赛段 | seg_d
#define dig_dseg_b | 段_c | 段_d | 赛段 | 说_g
#define dig_eseg_a | 段_f | 赛段 | 段_d | seg_g
#define dig_fseg_a | 段_f | 赛段 | seg_g
#define dig_gseg_a | 段_f | 段_g | 段_b | 段_c | seg_d
#define dig_hseg_g | 段_c | 赛段 | seg_f
#define dig_idig_1
#define dig_jdig_1 | seg_d
#define dig_lseg_d | 赛段 | seg_f
#define dig_nseg_c | 赛段 | seg_g
#define dig_odig_0
#define dig_pseg_g | 段_a | 段_b | 赛段 | seg_f
#define dig_rseg_g | 赛段 | seg_f
#define dig_sseg_g | 段_a | 段_c | 段_d | seg_f
#define dig_tseg_g | 赛段 | 段_f | seg_d
#define dig_useg_b | 段_c | 段_d | 赛段 | seg_f
这些段分散在三个独立的背板上,并且必须以三个比特的三个数据包的形式排列在一个字节中。最后一位未使用。这种排列反映了显示数字的物理布局(见表 1) 
表 1:段分配。
#define seg_a1
#define seg_g2
#define seg_d4
#define seg_b8
#define seg_c16
#define seg_dp32
#define seg_f64
#define seg_e128
我们的目标是将分段数据放入三个整数中——每个显示背板一个。软件必须将代表七段字符的单个字节分成三个平面的三个段。表 2 指示整数数组如何存储各个段位。
由于 lcd 的每个数字都需要三个段,因此寻址正确的段引脚需要将每个数字的数据移位三位。最后,必须寻址微控制器的正确物理引脚。以下代码段中的分配可以根据电路板布局和其他资源进行更改。
#define seg_1agd8//paod|=b3
#define seg_1bcdp16//paod|=b4
#define seg_1fe32//paod|=b5
#define seg_2agd64//paod|=b6
#define seg_2bcdp128//paod|=b7
#define seg_2fe256// pcod |=b0
#define seg_3agd512//pcod|=b1
#define seg_3b​​cdp1024//pcod|=b2
#define seg_3fe2048//pcod|=b3
#define seg_4agd4096//pcod|=b4
#define seg_4bcdp8192//pcod|=b5
#定义 seg_4fe16384//pcod|=b6
以下代码段确定哪些段为特定字符打开。
for (digit=0, shift=9; digit《4; digit++,shift-=3)
{
段[0]|=(0x07 &
chartbl[que[digit]])《
段[1]|=((0x38 & chartbl[que[dig
它]])》》3)《
段[2]|=((0x1c0 & chartbl[que[di
混帐]])》》6)《
}
存储正确的段以打开需要测试每个单独的位。优点是代码变得非常可移植,如下所示:
对于(平面=0;平面《3;平面++)
{
如果(段[平面]&b0)
缓冲区[平面]|=seg_1agd;
如果(段[平面]&b1)
缓冲区[平面]|=seg_1bcdp;
如果(段[平面]&b2)
缓冲区[平面]|=seg_1fe;
如果(段[平面]&b3)
缓冲区[平面]|=seg_2agd;
等等
}
/*我们在这里有一个赋值,而不是在上面的语句中设置单个变量,因为在收集段时会发生计时器 irq,这将导致显示闪烁。最后三个缓冲区只是前三个缓冲区的补充。*/
缓冲区[0]=临时缓冲区[0];
缓冲区[1]=临时缓冲区[1];
缓冲区[2]=临时缓冲区[2];
缓冲区[3]=~缓冲区[0];
缓冲区[4]=~缓冲区[1];
缓冲区[5]=~缓冲区[2];
总结
直接驱动 lcd 所需的实际代码并不是很复杂。在这个 c 示例中,解码各个分段平面所需的时间仅为 141 µs。优点是无需额外的 lcd 驱动器或使用带有专用驱动器的微控制器即可直接驱动超大显示器。唯一的缺点是电荷泵和背板驱动需要额外的引脚,但在大多数情况下,额外的引脚比专用驱动器便宜。
图 4 显示了使用 z8 encore 的 lcd 驱动器的示意图!单片机。
图 4:使用 z8 encore 的 lcd 驱动器示意图!单片机。

对于3C锂电池的性能测试可选用大电流弹片微针模组
全网最通俗易懂SPWM入门教程
EsDA MPC-ZC1 应用——串口服务器(一)
万用表的使用方法步骤 万用表的hFE功能怎么用
AI芯片首战瞄准安防行业 新品接踵面世
多路复用LCD与Zilog的Z8 Encore微控制器的编程
亚光电子拟成立合资公司 主要面向在微波射频芯片领域
区块链了不起的地方在哪里
变频电源有什么用?有几部分组成?
工业机器人行业发展到底该何去何从
大普微宣布量产搭载Marvell Bravera™ SC5主控企业级PCIe 5.0 SSD
分线报警主机室内探测器应用
电子消毒柜臭氧发生器电子电路图
RFID技术的发展可以为企业带来什么
NDON图像传感器插座怎么样
几款不错的场效应管功放电路图
工业互联网平台整合数据与应用,5G智慧钢铁十大应用场景
温度信号隔离放大器/热电阻信号隔离变送器
手机射频前端技术发展与主要手机射频芯片厂家解析
爱立信将基于云原生方案部署其云原生双模5G核心网解决方案