利用74LS373对 LED 和数码管分别进行控制,数码管显示所亮 LED 的位置

  利用单片机 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;

sbit P25=P2^5;
sbit P26=P2^6;
sbit 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<<i);//将1右移i位,然后将结果取反赋值到P1
			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[i]; //数码管读取赋值
		P26=0;  //数码管读取锁存
		SM=0xff; //消影
		P27=1; //数码管选择工作
		SM = XZ[i]; //选择数码管
		P27=0; //数码管选择停止
		SM=tab[i];
}

效果截图:

在这里插入图片描述

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值