#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,num,numdu,numwe;
sbit diola=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={ //建立2-9字形码表
0x6f ,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,
};
uchar code tablewe[]={ //建立8个数码管位选通码表
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,};
void delay(uint z);
void main( )
{
num=0;
aa=0;
TMOD=0x01; //T0工作在方式1, 0000 0001
TH0=(65536-50000)/256; //50ms定时初值
TL0=(65536-50000)%256;
EA=1; // CPU开中断
ET0=1; // 允许T0中断
TR0=1; // 启动T0
diola=1;
temp=0xfe; // 最初LED灯亮数据 1111 1110
P1=temp; //
diola=0;
dula=1; // 数码管段选通
P0=table[0]; // 显示0
dula=0; // 数码管段锁存
wela=1; // 数码管位选通
P0=0xc0; // 8个数码管亮
wela=0; // 数码管位锁存
while(1) // LED灯作流水灯
{
delay(1000); //延时1s
diola=1;
temp=_crol_(temp,1);//循环左移1位
P1=temp; //输出,作流水灯
diola=0;
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0() interrupt 1 //定时器T0中断程序
{
TH0=(65535-50000)/256; //再次为定时器T0赋初值50ms
TL0=(65535-50000)%256;
aa++;
if(aa==20) //判定1s定时时间到否? 20*50ms=1s
{
aa=0; // 1s定时时间到,将aa清零
numdu++; //
if(numdu==9) //判定第8位数码管是否显示数字8
numdu=1; // 是,将numdu=1,表示下次数码管显示时,显示的数字是1
dula=1; //段选通
P0=table[numdu]; //送字形码
dula=0; //段锁存
wela=1; //位选通
P0=tablewe[numwe]; //选通要显示数字的那个数码管
wela=0; //位锁存
numwe++; //
if(numwe==8) //判定8位数码管是否显示完
numwe=0; //显示完,将numwe=0,再重新从第一个数码管显示
}
}
太难!