74HC573驱动8位数码管连接图及程序代码分享

74hc573包含八路3态输出的非反转透明锁存器,是一种高性能硅栅cmos器件。当使能为低时,输出将锁存在已建立的数据电平上。这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。特别适用于缓冲寄存器,i/o 通道,双向总线驱动器和工作寄存器。
74hc573内部结构原理图
74hc573的八个锁存器都是透明的d型锁存器,当使能(g)为高时,q输出将随数据(d)输入而变。当使能为低时,输出将锁存在已建立的数据电平上。输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。特别适用于缓冲寄存器,i/o通道,双向总线驱动器和工作寄存器。那74hc573是怎么驱动8位数码管的呢?下面给大家详细介绍。
74hc573驱动8位共阴数码管连接图
74hc573驱动8位共阳数码管连接图
74hc573驱动8位数码管程序分享 基于51单片机74hc573驱动8位数码管的部分程序代码如下:
/************************************************\
* 8位共阳数码管显示函数(使用74hc573锁存器) *
* 力求程序高效,简洁 *
\************************************************/
/************************************************\
* 分多个函数的原因: *
* 显示要求不同,函数的执行效率不同 *
* 为了实现程序的高效性,显示要求不同调用不同的函数*
\************************************************/
#include
#define display_io p2
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit duan=p3^0; //定义段
sbit wei=p3^1; //定义位
unsigned char code w[]={ //共阴
//0-f无小数点
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
//0-f带小数点
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,
0xb9,0xde,0xf9,0xf1,
//小数点 负号
0x80, 0x40};
/************************************************\
* 显示任意内容 *
* n[0-7]数组的值表示数码管位置从左至右的内容 *
\************************************************/
void display_any(uchar n[8])
{
uchar i,delay=0;
for(i=0;i《8;i++)
{
//清除段锁存器内容
display_io=0xff;
duan=1;
duan=0;
//位值送入位锁存器
display_io=0x01《
wei=1;
wei=0;
//段值送入段锁存器
display_io=0xff-n[i];
duan=1;
duan=0;
//延时0-255(越长越亮,但太长会闪)
delay=100;
while(delay--);
}
//清除段锁存器内容 不让第一个数最亮
display_io=0xff;
duan=1;
duan=0;
}
/************************************************\
* 10进制无符号整数显示 *
* 传入n为0到9999 9999 *
* 传入浮点型小数点后忽略,范围不正确显示不正确 *
* 右对齐,左边无多余0 *
\************************************************/
void display_ulong(ulong n)
{
uchar i=8,delay=0;
do
{
//清除段锁存器内容
display_io=0xff;
duan=1;
duan=0;
//位值送入位锁存器
display_io=0x01《《(--i);
wei=1;
wei=0;
//段值送入段锁存器
display_io=0xff-w[n%10];
duan=1;
duan=0;
n/=10;
//延时0-255(越长越亮,但太长会闪)
delay=100;
while(delay--);
}while(n》0);
//清除段锁存器内容 不让第一个数最亮
display_io=0xff;
duan=1;
duan=0;
}
/************************************************\
* 10进制有符号整数显示 *
* 传入n为-999 9999到9999 9999 *
* 传入浮点型小数点后忽略,范围不正确显示不正确 *
* 右对齐,左边无多余0 *
\************************************************/
void display_long(long n)
{
uchar i=8,delay=0;
bit flag=0;
if(n《0)
{
flag=1;
n=-n;
}
do
{
//清除段锁存器内容
display_io=0xff;
duan=1;
duan=0;
//位值送入位锁存器
display_io=0x01《《(--i);
wei=1;
wei=0;
//段值送入段锁存器
display_io=0xff-w[(n==100000000?33:n%10)];
duan=1;
duan=0;
n/=10;
if(n==10000000)
n=-1;
if(n==0&&flag==1)
n=100000000;
//延时0-255(越长越亮,但太长会闪)
delay=100;
while(delay--);
}while(n》0);
//清除段锁存器内容 不让第一个数最亮
display_io=0xff;
duan=1;
duan=0;
}
/************************************************\
* 10进制无符号实型显示 *
* 传入n为0到9999 9800 *
* 传入范围不正确显示不正确 *
* 右对齐,左边无多余0,右边小数点后无多余0 *
\************************************************/
void display_udouble(double n)
{
uchar i=8,delay=0,point_position=0;
ulong n_long=n; //将n赋值给整形变量
while(n_long!=n) //此循环的功能:使n变为8位整数,并记下小数点位置
{
n*=10;
n_long=n;
point_position++;//每乘一次,小数点左移一位
}
do
{
//清除段锁存器内容
display_io=0xff;
duan=1;
duan=0;
//位值送入位锁存器
display_io=0x01《《(--i);
wei=1;
wei=0;
//段值送入段锁存器
display_io=0xff-w[n_long%10+((7-i)==point_position?16:0)];
duan=1;
duan=0;
n_long/=10;
//延时0-255(越长越亮,但太长会闪)
delay=100;
while(delay--);
}while(n_long》0);
//清除段锁存器内容 不让第一个数最亮
display_io=0xff;
duan=1;
duan=0;
}
/************************************************\
* 10进制有符号实型显示 *
* 传入n为-999 999到9999 9800 *
* 传入范围不正确显示不正确 *
* 右对齐,左边无多余0,右边小数点后无多余0 *
\************************************************/
void display_double(double n)
{
uchar i=8,delay=0,point_position=0;
bit flag=0;
long n_long=n; //将n赋值给整形变量
while(n_long!=n) //此循环的功能:使n变为8位整数,并记下小数点位置
{
n*=10;
n_long=n;
point_position++;//每乘一次,小数点左移一位
}
if(n_long《0)
{
flag=1;
n_long=-n_long;
}
do
{
//清除段锁存器内容
display_io=0xff;
duan=1;
duan=0;
//位值送入位锁存器
display_io=0x01《《(--i);
wei=1;
wei=0;
//段值送入段锁存器
display_io=0xff-w[(n_long==100000000?33:(n_long%10+((7-i)==point_position?16:0)))];
duan=1;
duan=0;
n_long/=10;
if(n_long==10000000)
n_long=-1;
if(n_long==0&&flag==1)
n_long=100000000;
//延时0-255(越长越亮,但太长会闪)
delay=100;
while(delay--);
}while(n_long》0);
//清除段锁存器内容 不让第一个数最亮
display_io=0xff;
duan=1;
duan=0;
}
/************************************************\
* 2-16任意进制无符号不去零整数显示 *
* 传入n为0到x,x=((进制)^8)-1 *
* 传入范围不正确显示不正确 *
* 不自动去0 *
\************************************************/
void display_number(ulong n,uchar jin_zhi)
{
uchar i,delay=0;
for(i=0;i《8;i++)
{
//清除段锁存器内容
display_io=0xff;
duan=1;
duan=0;
//位值送入位锁存器
display_io=0x01《《(7-i);
wei=1;
wei=0;
//段值送入段锁存器
display_io=0xff-w[n%jin_zhi];
duan=1;
duan=0;
n/=jin_zhi;
//延时0-255(越长越亮,但太长会闪)
delay=100;
while(delay--);
}
//清除段锁存器内容 不让第一个数最亮
display_io=0xff;
duan=1;
duan=0;
}
/************************\
* 8位数码管测试程序 *
\************************/
void main(void)
{
uint i,t=200;
char n[8]={1,2,4,8,16,32,64,128};
while(1)
{
i=t;
while(i--)
{
display_any(n);
}
i=t;
while(i--)
{
display_ulong(123);
}
i=t;
while(i--)
{
display_long(-123);
}
i=t;
while(i--)
{
display_udouble(123.45);
}
i=t;
while(i--)
{
display_double(-123.45);
}
i=t;
while(i--)
{
display_number(0x123abc,16);
}
}
}

team上线“远程同乐”功能 支持非对称VR内容
马斯克透露Model 3项目遭遇产能瓶颈
嵌入式系统如何实现功能安全和信息安全
无人机快递从哪里入手
医疗应用压力传感器
74HC573驱动8位数码管连接图及程序代码分享
人工智能将从这5大方面改变企业IT
此次新冠疫情中,物联网技术带来了什么解决方案
白光LED模组驱动电路设计方案
Q1季度微软总销售收入350.2亿美元,净利润增长22%
半导体产业既乐观又担忧的7个理由
银发经济风头正兴,老年家电市场是家电行业的新蓝海
AI Eye预警眼的作用
GTT以23亿美元的价格收购欧洲光纤网络运营商Interoute
小米法务又要忙了
紫光展锐通过TMMi 5级认证
ARM“拉拢”联想戴尔:英特尔阵营现裂痕
闲谈Linux操作系统中的显示管理器及如何更换
汽车产业军备竞赛下半程 丰田已做好准备
几个移动电源设计方案