在本篇文章中,将探讨如何使用x86汇编语言来实现一个七段显示器的驱动程序。这个项目包括了SN74LS57N解码器/驱动器、74HC238解复用器/驱动器和6个七段显示器。将展示如何使用单个解码器/驱动器在6个七段显示器之间进行多路复用。
材料清单:
多路复用是一种通信技术,允许多个信号或数据流共享一个物理传输介质。在多路复用中,高级通信信道的容量被划分为几个低级逻辑信道,每个信道用于传输一个消息信号或数据流。多路复用的逆过程称为多路解复用,它可以在接收端提取原始信道。执行多路复用的设备称为多路复用器(MUX),执行逆过程的设备称为多路解复用器(DEMUX)。反向多路复用(IMUX)与多路复用的目标相反,即将一个数据流分割成几个流,通过多个通信信道同时传输,然后在另一端重新创建原始数据流。有四种类型的多路复用:空分多路复用(SDM)、频分多路复用(FDM)、时分多路复用(TDM)和码分多路复用(CDM)。
时分多路复用(TDM)是一种数字(或偶尔模拟)多路复用技术,它允许两个或多个比特流或信号作为子信道在一个通信信道中似乎同时传输,但实际上是在物理上轮流使用信道。
简而言之,时分多路复用就是共享资源,每个部分在相等的时间内使用。如果每组的持续时间是1秒而不是1/1000秒(1 kHz),系统将显示如图3所示。
人脑无法检测到这种快速切换操作。这种方法有几个优点。最重要的优点是只使用单个源。在这个项目中,将SN74LS47N解码器在并行连接的6个七段显示器之间共享。
七段显示器是一种二进制到十进制的转换器。有两种类型的显示器:共阳极和共阴极。
共阳极和共阴极七段显示器的主要区别在于它们的连接方式。以下是七段显示器的真值表:
SN74LS47N解码器/驱动器用于阳极显示器。它有4位BCD输入和7个显示输出。SN74LS47是由NAND门、输入缓冲器和七个AND-OR-INVERT门组成的低功耗肖特基BCD到7段解码器/驱动器。它们提供主动低、高吸收电流输出,可直接驱动指示器。七个NAND门和一个驱动器成对连接,使BCD数据及其补码可供七个解码AND-OR-INVERT门使用。剩下的NAND门和三个输入缓冲器提供灯测试、消隐输入/波纹消隐输出和波纹消隐输入。电路接受4位二进制编码的十进制(BCD),并根据辅助输入的状态,将这些数据解码以驱动7段显示器指示器。输出配置的SN74LS47旨在承受7段指示器所需的相对高电压。这些输出可以承受15V的最大反向电流250mA。可以直接从SN74LS47高性能输出晶体管驱动高达24mA电流的指示器段。BCD输入计数超过九的显示模式是用于验证输入条件的唯一符号。
74HC/HCT238是高速Si-gate CMOS设备,与低功耗肖特基TTL(LSTTL)引脚兼容。它们符合JEDEC标准号7A。74HC/HCT238解码器接受三个二进制加权地址输入(A0、A1、A2),并在启用时提供8个互斥的主动高输出(Y0到Y7)。“238”具有三个使能输入:两个主动低(E1和E2)和一个主动高(E3)。除非E1和E2为低,E3为高,否则每个输出都将为低。这种多重使能功能允许轻松地将“238”并行扩展到1-of-32(5线到32线)解码器,只需四个“238”IC和一个反相器。通过使用其中一个主动低使能输入作为数据输入,其余使能输入作为脉冲,可以将“238”用作八输出解复用器。未使用的使能输入必须永久连接到适当的主动高或低状态。“238”与“138”相同,但具有非反相输出。
平行端口是个人计算机接口,通常一次传输一个字节的数据。平行端口符合电气和电子工程师协会(IEEE)的IEEE Std 1284-1994:个人计算机双向平行外围设备接口的标准信号方法的规范。基本上,IEEE-1284收集并协调已经在使用中的平行传输标准。它描述了一个异步、完全互锁、双向通信系统,用于外围设备(通常是打印机)和主机(通常是PC)之间。
项目设计的基本部分是电路设计。决定只使用LPT端口的8个数据寄存器。
所有七个段显示器都并行连接。首先,从并行端口的前4位(引脚2到5)保留给SN74LS47N数据输入。这意味着这里确定显示的数字。接下来,从并行端口的下3位(引脚6到8)保留给74HC238切换输入。最后一位(引脚9)用于系统的Vcc输入。
以下是一个示例代码块,它发送(128d)10000000b逻辑高和低电压分别到d7、d6、d5、d4、d3、d2、d1、d0引脚,并在大约1秒的时间内循环显示数字,800MHz处理器在Windows XP操作系统上具有高优先级。在不同的系统上,确切的时间无法计算。刷新率和流速在不同的机器上永远无法稳定。现代实时操作系统与许多威胁共享资源。如果在这个项目中使用了pick控制器,那么可以精确计算。
mov cx,0ffffh
loop1:
mov dx,03bch
MOV al,10000000b
out dx,al
dec cx
jnz loop1
以下代码块循环显示数字0到9。
MOV bl,127d
mov cx,10d
loop1 count last digit 0 to 9
next:
push cx
INC bl
mov cx,5d
loop2 scan 5 times
duration:
push cx
mov cx,0500h
loop3 duration of digit
loop1:
mov dx,03bch
MOV al,bl
out dx,al
dec cx
jnz loop1
mov cx,0500h
loop2:
mov dx,03bch
MOV al,144d
out dx,al
dec cx
jnz loop2
mov cx,0500h
loop3:
mov dx,03bch
MOV al,160d
out dx,al
dec cx
jnz loop3
mov cx,0500h
loop4:
mov dx,03bch
MOV al,176d
out dx,al
dec cx
jnz loop4
mov cx,0500h
loop5:
mov dx,03bch
MOV al,192d
out dx,al
dec cx
jnz loop5
mov cx,0500h
loop6:
mov dx,03bch
MOV al,208d
out dx,al
dec cx
jnz loop6
pop cx
loop2
loop duration
pop cx
loop3
loop next