void main()
{
init(); //調用初始化函數
P0=0xff; P1=0x00; P3=0x00; P2=0x00;
for(c=0;c<10;c++) delay(255);
P1=0xff; P3=0xff; P2=0xff; //測試點陣屏全亮3秒.
P0=0x00; P1=0x00; P3=0x00; P2=0x00;
for(c=0;c<10;c++) delay(255);
P1=0xff; P3=0xff; P2=0xff; //測試點陣屏全滅3秒.
P0=0xff; P1=0x00; P3=0x00; P2=0x00;
for(c=0;c<10;c++) delay(255);
P1=0xff; P3=0xff; P2=0xff; //測試點陣屏全亮3秒.
P0=0x00; P1=0x00; P3=0x00; P2=0x00;
for(c=0;c<10;c++) delay(255);
P1=0xff; P3=0xff; P2=0xff; //測試點陣屏全滅3秒.
c=0;
while(1) //主程序循環(huán)
{
switch(keymode) //鍵盤處理程序
{
case 0x00:
if(KEY==0) { keymode=1; keycount=2;}
break;
case 0x01:
if(keycount==0)
{ if(KEY==0)
{ keymode=2; keydate=1;D7=0;} else {keymode=0; break;}
}
else
{
keycount--;
break;}
case 0x02:
if(KEY==1)
{ keymode=0; D7=1; break;}
else
{keymode=3; keycount=50; break; }
case 0x03:
if(KEY==1)
{ keymode=0; D7=1; break;}
else
if(keycount==0)
{ keymode=4; D6=1; break; }
else
{ keycount--; break;}
case 0x04:
if(KEY==1)
{keymode=0; D7=1; break;}
else
break;
default: break;
}
//以下的鍵值調時間處理
if(D7==1)
{
if(D6==0) {
if(c==1) hour++;
if(hour==24) hour=0;
if(c==2) minute++;
if(minute==60) minute=0;
D7=0; }
else
{c++; if(c>2) c=0; D6=0; D7=0;}
}
disbuf[0]=(second);
disbuf[1]=(second/10);
disbuf[2]=(minute);
disbuf[3]=(minute/10);
disbuf[4]=(hour);
disbuf[5]=(hour/10);
display(); //調用顯示函數
}
}
void init()
{
TMOD=1;TH0=0X3C;TL0=0XB0; //定時器0模式1,50毫秒
ET0=1;TR0=1;EA=1; //開定時器0中斷、啟動定時器0、開總中斷
}
void display( )
{
unsigned char i,j=0; //j為列位置變量
for(i=0;i<5;i++) //時十位
{
if(disbuf[5]==0) P0=0x00; //時十分為0時不顯示
else P0=ASCII86[disbuf[5]];
P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
delay(1);
P1=0xff; P3=0xff; P2=0xff;
j++;
}
j++; //隔一列
for(i=0;i<5;i++) //時個位
{
if(c==1&&SHAN)P0=0x00;
else P0=ASCII86[disbuf[4]]; //調時狀態(tài)時個位閃爍
P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
delay(1);
P1=0xff; P3=0xff; P2=0xff;
j++;
}
if(!SHAN) {P0=0x81;} else P0=0x00; //秒閃
P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
delay(1);
P1=0xff; P3=0xff; P2=0xff;
j++;
for(i=0;i<5;i++) //分十位
{
P0=ASCII86[disbuf[3]];
P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
delay(1);
P1=0xff; P3=0xff; P2=0xff;
j++;
}
j++;
for(i=0;i<5;i++) //分個位
{
if(c==2&&SHAN)P0=0x00;
else P0=ASCII86[disbuf[2]]; //調分狀態(tài)時分閃爍
P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
delay(1);
P1=0xff; P3=0xff; P2=0xff;
j++;
}
本文引用地址:http://m.butianyuan.cn/article/201611/321448.htm}
void delay(uchar t)
{
uchar i; //定義變量
for(;t>0;t--) //如果t大于0,t減1(外層循環(huán))
for(i=124;i>0;i--); //i等于124,如果i大于0,i減1
}
void timer0() interrupt 1 //定時器0(中斷1)
{
uchar tim1,tim2; //定義臨時變量
TL0=TL0+0XB0;TH0=0X3C; //重裝定時器初值
tim1++; //每中斷一次tim1加1
if(tim1==10) //中斷10(0.5秒)
{
SHAN=!SHAN; //閃爍標志取反
tim1=0;tim2++; //tim1清零,tim2加1
if(tim2==2) //到了1秒
{
tim2=0;second++; //tim2清零,秒加1
if(second>=60) //如果秒到60
{
second=0;minute++; //秒變0,分加1
if(minute>=60) //如果分到60
{
minute=0;hour++; //分變0,時加1
if(hour>=24) hour=0; //如果時到24,時變0
}
}
}
}
}
評論