level 13
#include<AT89X51.H>
//带led循环闪烁的秒表
//接线方式: P2.0-P2.3对应 38译码器 012N P3对应4位数码管
unsigned char code shumaguan[10]=
{ //定义表格一定要使用code,这样会做到程序存储区中
0x3F, //"0"的字形表,0B00111111
0x06, //"1"的字形表,0B00000110
0x5B, //"2"的字形表,0B01011011
0x4F, //"3"的字形表,0B01001111
0x66, //"4"的字形表,0B01100110
0x6D, //"5"的字形表,0B01101101
0x7D, //"6"的字形表,0B01111101
0x07, //"7"的字形表,0B00000111
0x7F, //"8"的字形表,0B01111111
0x6F, //"9"的字形表,0B01101111
};
unsigned char code LED[8]=
{
0x01,
0x02,
0x04,
0x08,
0x10,
0x20,
0x40,
0x80,
};
unsigned char code wei[4]=
{ //定义表格一定要使用code,这样会做到程序存储区中
0X08, //个
0x09, //十
0x0A, //百
0x0B, //千
};
int time=0; //要显示的时间 如果设置为double形式的 将无法用%运算
int zhongduantime=0;
int itime=0;
unsigned char p0ledlib[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
int p0led=0;
int ct1=0;
void wait(double a)
{
int i;
for(i=0;i<a;i++);
}
void zhongduantest(void) interrupt 1
{
TL0=0xFF; //设置定时器0初值低8位
TH0=0x4B; //设置定时器0初值高8位
if(++itime>39)
{
itime=0;
time++;
}
}
void p0ledlight(void) interrupt 3
{
if(ct1>1000) //决定显示间隔
{
P0=p0ledlib[p0led];
p0led++;
wait(10);
ct1=0;
if(p0led>8)p0led=1;
}
else
ct1++;
}
void main(void)
{
int i=0;
P0=0x00;
//***定时器Timer0初始化***
//将TMOD的低4位定时器0控制部分清零
TMOD=0x21; //设置定时器0为方式1
TL0=0xFF; //设置定时器0初值低8位
TL1=0xFF;
TH0=0x4B; //设置定时器0初值高8位
TH1=0x00;
TR0=1; //启动定时器0
TR1=1;
ET0=1; //Timer0中断禁止
ET1=1;
EA=1; //全局中断开关;
//**********************
while(1)
{
wait(10);
P2=0x00;
wait(1);
P1=wei[0];
wait(5);
P2=shumaguan[time%10/1]; //个位显示
wait(10);
P2=0x00;
wait(1);
P1=wei[1];
wait(5);
P2=shumaguan[time%100/10]; //十位显示
wait(10);
P2=0x00;
wait(1);
P1=wei[2];
wait(5);
P2=shumaguan[time%1000/100]; //百位显示
wait(10);
P2=0x00;
wait(1);
P1=wei[3];
wait(5);
P2=shumaguan[time%10000/1000];//千位显示
}
}
2017年02月16日 18点02分
8