四位BCD数码管扫描输出问题 有一个小项目想利用一块信号为BCD码的LED屏显示温度,但是该LED屏的输入只有一路8421输入口,另加四路锁存信号来更新每个数字的显示,于是做了一个动态扫描显示0-9999的数字递增来做试验,但是数字全是乱跳的,请各位师傅指导下思路。
注:接通=1,断开=0 如4位数码管显示1234: 第一位显示1:8421口放置0001,第一位位选置1,然后第一位位选置0 第二位显示2:8421口放置0010,第二位位选置1,然后第二位位选置0 第三位显示3:8421口放置0011,第三位位选置1,然后第三位位选置0 第四位显示4:8421口放置0100,第四位位选置1,然后第四位位选置0 另可接dp,在任意位显示小数点
--------1、使用符号,也使程序变得可读。 2、数据和显示功能分开。第一步能显示静态数据。数据变化可以由PC机在线写入。 3、你注意过时序的匹配?也就是晶体管输出的延时问题?
-------时序没有注意 本想比如输出1000 然后逐个扫描过去更新,但是得0-0-0-1这样同步给数据才可以 所以各位十百千位用的同一个触发
--------数据变化只有一位的话倒是没有问题。。。
-------静态不是让你只显示1位数,而是让你显示如“1234”固定的数在上面,然后使用PC在线修改这个显示值。
所以,动态扫描是一定的。
---------先更新数据。并等待输出稳定了,再一位一位地去片选。在高频率的扫描下,晶体管的上升下降时间变得明显。图中你可以看得见片选信号是下降了一段时间后才选下一个的。我估计你没有做这项等待工作。
-----------你可以下载这个程序试试: ORGANIZATION_BLOCK 主程序:OB1
TITLE=程序注释
BEGIN
Network 1 // 网络标题
// 主程序
LD SM0.0
CALL SBR1, VB0, 16#08 // 输出第1位
CALL SBR1, VB1, 16#04 // 输出第2位
CALL SBR1, VB2, 16#02 // 输出第3位
CALL SBR1, VB3, 16#1 // 输出第4位 END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK 延时ms:SBR0
TITLE=延时,>1ms
BEGIN
Network 1 // 网络标题
// 读32位定时器值
LD SM0.0
BITIM AC0
Network 2
// 循环标记
LBL 1
Network 3
// 比当前时刻
LD SM0.0
CITIM AC0, AC1
Network 4
// 是否已过了1ms以上的时间
LDD< AC1, 2
JMP 1
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK 位输出:SBR1
TITLE=点亮一位LED
VAR_INPUT
BCD:BYTE; // 待显示数,低4位有效
DIG:BYTE; // 选通位,低4位有效
END_VAR
BEGIN
Network 1 // 网络标题
// 1、输出一位。正逻辑,高电平点亮LED。
LD SM0.0
LPS
A L0.3 // BCD8421之8
=I Q1.4 // 立即输出,关键!
LRD
A L0.2 // BCD8421之4
=I Q1.5
LRD
A L0.1 // BCD8421之2
=I Q1.6
LPP
A L0.0 // BCD8421之1
=I Q1.7
Network 2
// 2、若是上升沿锁存,这个延时必须的。否则可省。不清楚就留着。
LD SM0.0
CALL SBR0 Network 3
// 3、输出锁存脉冲
LD SM0.0
LPS
A L1.3
=I Q1.0 // 立即输出,关键!
LRD
A L1.2
=I Q1.1
LRD
A L1.1
=I Q1.2
LPP
A L1.0
=I Q1.3 Network 4
// 4、若是下降沿锁存,这个延时必须的。否则可省。不清楚就留着。
LD SM0.0
CALL SBR0 Network 5
// 5、复位锁在脉冲
LDN SM0.0
=I Q1.0 // 立即输出,关键!
=I Q1.1
=I Q1.2
=I Q1.3 END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=中断程序注释
BEGIN
Network 1
END_INTERRUPT_BLOCK
-------好的 我试一试
|