#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z)
uchar temp,aa,numdu,numwe,bai,shi,ge
uint shu
void init()
sbit dula=P2^6
sbit wela=P2^7
uchar code table[]={
0x3f , 0x06 , 0x5b , 0x4f ,
0x66 , 0x6d , 0x7d ,
0x07, 0x7f , 0x6f ,
0x77, 0x7c , 0x39 ,0x5e ,0x79 ,
0x71 ,0x00
}
void display(uchar bai,uchar shi,uchar ge)
void main()
{
shu=219
init()
while(1)
{
display(bai,shi,ge)
}
}
void delay(uint z)
{
uint x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
void display(uchar bai,uchar shi,uchar ge)
{
wela=1
P0=0xfe
wela=0
dula=1
P0=table[bai]
dula=0
delay(1)
wela=1
P0=0xfd
wela=0
dula=1
P0=table[shi]
dula=0
delay(1)
wela=1
P0=0xfb
wela=0
dula=1
P0=table[ge]
dula=0
delay(1)
}
void init()
{
TMOD=0x01
TH0=(65536-50000)/256
TL0=(65536-50000)%256
EA=1
ET0=1
TR0=1
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256
TL0=(65536-50000)%256
aa++
if(aa==2)
{
aa=0
shu--
if(shu==10)
{
TR0=0
ET0=0
}
bai=shu/100
shi=shu%100/10
ge=shu%10
}
}
印象中 单片机的四个p口中,只有p0口的驱动能力最差,所以要想输出在点的电流得接上拉电 阻。p0.0当然可以输出高电平,只是它的输出电流有限,电流太小不足以点亮二极管。 你可以在程序里让p0.0输出个高电平(p0.0空接),然后用电压表测一下它的电压就知道了。
p0.0-p0.7都不能够点亮二极管。 p1-p3应该是可以的。
你看看74h573的资料吧。其实我以前用的是三极管,相信这个74h573应该也是同样的道理,只是将电流放大的东西而已。电流放大多少与三极管的参数和输入电流大小有关。不同三极管的电流放大倍数不一样。
为什么名字叫 RLED,难道是red led? 可又标了个'471' 。我也不太明白,不过这个电阻没啥决定性的作用,去掉应该也是可以的。你可以把它短路掉试试。
图画的不对,既然用了锁存器,就要节约IO端口,两个锁存器的输入应该共用一个端口P0或P2假设为P0
每个锁存器有1个锁存信号L,需占用两条IO线,假设分别接 P1.6和P1.7
由于是动态扫描显示,所以显示函数调用时要放在WHILE或FOR循环中反复运行,才能看见结果
程序如下:
#include<reg52.h>
sbit dula=P1^6//段锁存信号
sbit wela=P1^7//位锁存信号
#define uchar unsigned char
void delay(i)
{
for(j=ij>0j--)
for(k=125k>0k--)
}
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}
void display(uchar qian_c,uchar bai_c,uchar shi_c,uchar ge_c)//4位显示程序
{
P0=table[qian_c] //显示千位
dula=1
dula=0
P0=0xfe
wela=1
wela=0
delay(2)
P0=table[bai_c] //显示百位
dula=1
dula=0
P0=0xfd
wela=1
wela=0
delay(2)
P0=table[shi_c] //显示十位
dula=1
dula=0
P0=0xfb
wela=1
wela=0
delay(2)
P0=table[ge_c] //显示个位
dula=1
dula=0
P0=0xf7
wela=1
wela=0
delay(2)
P0=xff //显示完毕后关闭所有位显示,也可不要,但退出显示程序时会留尾巴,即最后一个数码管还在显示
wela=1
wela=0
}
void main( )
{
.....//其它代码
while(1)
{
display(b1,b2,b3,b4)//调用显示函数
.....//其它代码,不能占用CPU太多时间,否则显示闪烁
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)