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

实时应用开发

5人已加入

描述

  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);

  }

  }

 

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分