/************************************************
跳线设置:双排针除PSEN外全部插上
显示效果: 在开发板的四位八段共阴数码管上显示0-7
相关知识点:1.数码管的驱动显示方式
2.利用2个74HC573芯片将P0口分时复用输出
注意:在做本实验之前先要弄懂74hc573的原理
************************************************/
#include"AT89x52.h"
#include"intrins.h"
#include"51hei.h"
#define uint unsigned int
#define uchar unsigned char
sbit DUAN=P2^6; //74HC573的LE端 U1 LED数码管的段选端
sbit WEI=P2^7; //74HC573的LE端 U2 LED数码管的位选端
uchar Temp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴显示字库
void delay(uint z) //1ms延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
main()
{
uchar i,y;
uchar temp=0xfe; //化为2进制为11111110,供动态扫描移位用
guandz(); //关掉8*8点阵的显示
WEI=0;
DUAN=0;
while(1)
{
for(i=0;i<8;i++)
{
//----动态扫描分3个步骤,以后板子上用动态显示的地方都可以套用此程序-----------------
//-----步骤一:送位码---------------------------------------------------
P0=temp; //位选送p0,其实在任一个时刻八个数码管中只有一个是亮的,因为temp始终只有一个位为0.
//但是我们看到的是连续的,我们的眼睛欺骗了自己,原因是由于交替的速度非常快,视觉暂留
WEI=1; //让第2个74hc573处于直通状态,这样就把P0口上的位码到数码管了.
WEI=0; //锁存,保持第2个74hc573输出的位码不变,即不受P0输入的影响.
//-----步骤二:送段码-------------------------------------------------
P0=Temp[ i]; //段码送入P0口
DUAN=1; //让第一个74hc573处于直通状态,这时刚送P0口的段码将被送到数码管上了,因为之前输入了位码,所以现在某一个数码管将会被点亮
DUAN=0; //锁存,让段码维持在第一个74hc573的输出上不变,不受P0输入的影响.
delay(1); //把数码管点亮1毫秒, 如果改为delay(60); 你将看到动态扫描的慢镜头,让你彻底的理解动态扫描
temp=_crol_(temp,1); //移位,让下一个数码管亮
//-----步骤三:消隐---------------------------------------------------
P0=0x00; //00送p0口
DUAN=1; //把p0口上的00H送到负责段选的74hc573上,其实就是灭掉所有数码管的显示
DUAN=0; //锁存,维持第一个74hc573的输出不变
delay(2); //熄灭的时间长短,可调整亮度
}
}
}
|