利用单片机 AT89C51 的 I/O 口,对 LED 和数码管分别进行控制。以实现 LED灯做流水运动,数码管显示所亮 LED 的位置。
使用74LS373可以节省I/O口
74LS373简介: 74LS373是三态输出的八D锁存器,共有54S373和74LS373两种线路。373 的输出端 Q0~Q7 可直接与总线相连。当锁存允许端LE为高电平时,Q 随数据D而变,当LE为低电平时,D 被锁存在已建立的数据电平。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200505125127521.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTQ4ODY0Mw==,size_16,color_FFFFFF,t_70)
电路原理图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200505125221122.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTQ4ODY0Mw==,size_16,color_FFFFFF,t_70)
代码如下:
#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 |