74HC164怎样实现32位流水灯。用串行口方式 0 输出,用级联的 4 个 74HC164 扩展出 4 个 8 位并行输出口,

74HC164怎样实现32位流水灯。用串行口方式 0 输出,用级联的 4 个 74HC164 扩展出 4 个 8 位并行输出口,,第1张

用串行口方式 0 输出,用级联的4个74HC164 扩展出 4 个 8 位并行输出口,接32个LED流水灯。串口的方式0时,级联的芯片过多时,在串口输入数据的时候,每个164的输出端的状态在快速变化,所以,效果并不是很理想,特别是仿真时,流水灯的效果不是很流畅。改换成74HC595就可以,因为,在输入数据时,输出端的锁存器可以并闭,等数据全部输入结束后再同时锁存数据,就可以避免了输出端的快速变化的缺陷了。如下是仿真图,要是在实物开发板上测试会好些,可以避免仿真的缺陷。

/***32灯流水——火柴天堂作品-20130520***/

/***52单片机,12MHz晶振,P0-P3

接32颗LED,低电平驱动***/

#include"REG52.h"//包含52头文件

#define

TRUE

1//定义布尔量'1':真

#define

FALSE

0//定义布尔量'0':假

#define

uchar

unsigned

char//定义

无符号字符型数据

简称

#define

uint

unsigned

int//定义

无符号整型数据

简称

#define

th0

0xb1

#define

tl0

0xe0//20ms

at

12MHz

Fosc

in

Model

1

#define

LED_Port1

P0

#define

LED_Port2

P1

#define

LED_Port3

P2

#define

LED_Port4

P3

#define

LED_AllOff

LED_Port1=LED_Port2=LED_Port3=LED_Port4=0xff

#define

LED_AllOn

LED_Port1=LED_Port2=LED_Port3=LED_Port4=0

#define

LED_Status

43//1步全亮+32步单亮+10步闪烁

#define

LED_Marquee

32

bit

T20msFlag=0

void

Timer0()

interrupt

1

{

TL0=tl0

TH0=th0

T20msFlag=TRUE

}

void

TimerInit()

{

TMOD=0x01

TH0=th0

TL0=tl0

TR0=1

ET0=1

EA=1

}

void

LED_Out()

{

static

uchar

led_status=0

if(T20msFlag)

{

T20msFlag=FALSE

led_status=++led_status%LED_Status

}

if(led_status

&&

led_status<=LED_Marquee)

{

LED_AllOn

switch((led_status-1)>>3)

{

case

0:LED_Port1=1<<((led_status-1)%8)break

case

1:LED_Port2=1<<((led_status-1)%8)break

case

2:LED_Port3=1<<((led_status-1)%8)break

case

3:LED_Port4=1<<((led_status-1)%8)break

default:led_status=0break

}

}

else

{

if(!led_status

&&

led_status%2)

LED_AllOn

else

LED_AllOff

}

}

void

main()

{

TimerInit()

while(1)

{

LED_Out()

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7755277.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-09
下一篇2023-04-09

发表评论

登录后才能评论

评论列表(0条)

    保存