
用串行口方式 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()
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)