#include <reg51.h>
#include <intrins.h>
#define DataPort P1
unsigned char code table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
sbit SMG1=P3^4;//第一個數碼管的位選
sbit SMG2=P3^5;//第2個數碼管的位選
sbit SMG3=P3^6;//第3個數碼管的位選
sbit SMG4=P3^7;//第4個數碼管的位選
void delayms(unsigned int t) //t ms
{
unsigned int num,count;
for(num=t;num>0;num--)
for(count=200;count>0;count--)
{
_nop_();
}
}
//display(1234);
void display(unsigned int num)
{
DataPort=table[num/1000];
SMG1=1; //第一個亮
delayms(5);
SMG1=0;
DataPort=table[num%1000/100];
SMG2=1; //第二個亮
delayms(5);
SMG2=0;
DataPort=table[num%100/10];
SMG3=1; //第3個亮
delayms(5);
SMG3=0;
DataPort=table[num%10];
SMG4=1; //第4個亮
delayms(5);
SMG4=0;
}
void timer0_init()
{
EA=1;//打開總中斷
ET0=1;//打開定時器0的中斷
TMOD|=0x01;//設置成工作方式1 16位定時器
TH0=(65535-10000)/256; //設置初值
TL0=(65535-10000)%256;
TR0=1;//打開定時器
}
unsigned char count;
void main()
{
SMG1=SMG2=SMG3=SMG4=0;//數碼管的
timer0_init();
while (1)
{
display(count);
}
}
//中斷服務函數
void timer0_int() interrupt 1
{
static unsigned char num;
TH0=(65535-10000)/256; //設置初值
TL0=(65535-10000)%256;
num++;
if (num==100)
{
num=0;
count++;
if(count==60)
{
count=0;
}
}
}