|
因?yàn)槟闶褂胐elay處理兩個(gè)程序,就會(huì)產(chǎn)生互相干擾。你把數(shù)碼管動(dòng)態(tài)顯示放在中斷里,中斷時(shí)間改為1ms就不會(huì)互相干擾了。
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; /*七段共陰管顯示定義*/
uchar seconde=0; /*定義并初始化變量*/
uchar minite=0;
uchar hour=0;
uint mstcnt=0;
/*函數(shù)聲明*/
void delay(uchar k ); //延時(shí)子程序
void time_pro( ); //時(shí)間處理子程序
void display( ); //顯示子程序
void keyscan( ); //鍵盤掃描子程序
void led_display( ); // led閃爍程序
/*****************************/
/*led燈閃爍程序*/
/****************************/
void led_display(void)
{
delay(50); //led燈閃爍三次后熄滅
P2=0x07; //賦初始值
delay(50);
P2=0x00;
delay(50);
P2=0x07;
delay(50);
P2=0x00;
delay(50);
P2=0x07;
delay(50);
P2=0x00;
}
/*****************************/
/*延時(shí)子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}
/**************************/
/*時(shí)間處理子程序*/
/**************************/
void time_pro( void)
{
if(seconde==60) //秒鐘設(shè)為60進(jìn)制
{
seconde=0;
minite++;
if(minite==60) //分鐘設(shè)為60進(jìn)制
{
minite=0;
hour++;
if(hour==24) //時(shí)鐘設(shè)為24進(jìn)制
{
hour=0;
}
}
}
}
/*****************************/
/* 顯示子程序*/
/*****************************/
void display()
{
static uchar i=0;
P0=0x00; //消隱
switch(i)
{
case 0: P1=0xfe;
P0=dispcode[hour/10];//顯示小時(shí)的十位
i++;
break;
case 1: P1=0xfd;
P0=(dispcode[(hour%10)])|0X80;//顯示小時(shí)的個(gè)位
i++;
break;
case 2: P1=0xfb;
P0=dispcode[minite/10];//顯示分的十位
i++;
break;
case 3: P1=0xf7;
P0=(dispcode[minite%10])|0X80;//顯示分的個(gè)位
i++;
break;
case 4: P1=0xef;
P0=dispcode[seconde/10];//顯示秒的十位
i++;
break;
case 5: P1=0xdf;
P0=dispcode[seconde%10];//顯示秒的個(gè)位
i=0;
break;
}
}
/**************************/
/*主函數(shù)*/
/**************************/
void main(void)
{
P1=0xff; //初始化p1口,全設(shè)為1
TMOD=0x01; //time0為定時(shí)器,方式1
TH0=0xfc; //預(yù)置計(jì)數(shù)初值1ms
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
while (1)
{
led_display( ); //led燈閃爍
time_pro( ); //時(shí)間處理
// display( ); //顯示時(shí)間
}
}
void timer0(void) interrupt 1 using 0 //定時(shí)器0方式1,50ms中斷一次
{
TH0=0xfc; //重置計(jì)數(shù)初值1ms
TL0=0x18;
mstcnt++;
if(mstcnt>=1000)
{
seconde++;
mstcnt=0;
}
display( ); //顯示時(shí)間
}
無標(biāo)題.jpg (152.85 KB, 下載次數(shù): 37)
下載附件
2018-6-10 06:43 上傳
|
|