单片机学习小组
直播中

石正厚

7年用户 1136经验值
私信 关注

如何利用74LS373锁存器对数码管进行控制呢

如何利用74LS373锁存器对LED进行控制呢?

如何利用74LS373锁存器对数码管进行控制呢?

回帖(1)

张飞雄

2022-1-18 13:47:12
  利用单片机 AT89C51 的 I/O 口,对 LED 和数码管分别进行控制。以实现 LED灯做流水运动,数码管显示所亮 LED 的位置。
使用74LS373可以节省I/O口

74LS373简介:
  74LS373是三态输出的八D锁存器,共有54S373和74LS373两种线路。373 的输出端 Q0~Q7 可直接与总线相连。当锁存允许端LE为高电平时,Q 随数据D而变,当LE为低电平时,D 被锁存在已建立的数据电平。

电路原理图:


代码如下:


#include"reg51.h"
#define LED P1
#define SM P0
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;


***it P25=P2^5;
***it P26=P2^6;
***it P27=P2^7;
u8 i,coun=0;
void InitTimer0(void);
//共阴极数码管数字显示表
unsigned char tab[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
// 对应显示           1    2    3    4    5    6    7    8  
//数码管选择
unsigned char XZ[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(u16 i)
{
        while(i--);       
}


void main()
{
        InitTimer0();
        LED=0xfe;
        //delay(50000); //延时
        P25=1;
        P26=1; //数码管读取工作
        P27=0; //数码管选择关闭
        while(1)
        {       
                for(i=0;i<8;i++)
                {
                        P1=~(0x01<                         delay(50000); //延时  50000 450ms
                }       
        }
}
void InitTimer0(void)
{
    TMOD = 0x01; //T0计时器,方式一
    TH0 = 0x50;//定时45ms
    TL0 = 0x38;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}


void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x50;//定时45ms
    TL0 = 0x38;
                P26=1;
                P27=0;
                SM=tab; //数码管读取赋值
                P26=0;  //数码管读取锁存
                SM=0xff; //消影
                P27=1; //数码管选择工作
                SM = XZ; //选择数码管
                P27=0; //数码管选择停止
                SM=tab;
}
效果截图:

举报

更多回帖

发帖
×
20
完善资料,
赚取积分