本帖最后由 zjy226 于 2010-3-27 22:47 编辑
我写了一个可以调时间的电子钟程序,可是在学习板上调不来啊!
希望有高手指点啊!!
#include <reg51.h>
#define SEG P0 //数码管
#define SCANP P2 //数码管扫描信号
#define TH (65536-50000)/256
#define TL (65536-50000)%256
unsigned char count=0;
unsigned char m=0;
unsigned char f=0;
unsigned char s=0;
unsigned char scan=0;
unsigned char state=0;
unsigned char xs[6];
unsigned char i;
unsigned char tab[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
void js(void); //计时
void fx(void); //分析时间数据
void disp1(void); //显示正常状态时间
void disp2(void); //显示调分
void disp3(void); //显示调时
void delay(void);
void debouncer(void); //防抖
main ()
{ IE=0x87;
TCON=0x05;
TMOD=0x01;
TH0=TH;
TL0=TL;
TR0=1;
while(1)
{ switch(state) //根据状态显示
{ case(0):
disp1();
break;
case(1):
disp2();
break;
case(2):
disp3();
break;
}
}
}
void T0_1s(void)interrupt 1 //定时中断
{ TH0=TH;
TL0=TL;
if(++count==20)
{ count=0;
js();
fx();
}
}
void js(void)
{ m=m+1;
if(m==60)
{ m=0;f=f+1;}
if(f==60)
{ f=0;s=s+1;}
if(s==24)
s=0;
}
void fx(void)
{ xs[0]=m%10;
xs[1]=m/10;
xs[2]=f%10;
xs[3]=f/10;
xs[4]=s%10;
xs[5]=s/10;
}
void disp1(void)
{
scan=7;
for(i=0;i<6;i++)
{ SCANP=scan--;
SEG=tab[xs];
delay();
}
}
void disp2(void)
{ scan=5;
for(i=2;i<4;i++)
{ SCANP=scan--;
SEG=tab[xs];
delay();
}
}
void disp3(void)
{ scan=3;
for(i=4;i<6;i++)
{ SCANP=scan--;
SEG=tab[xs];
delay();
}
}
void delay(void)
{ unsigned char j;
for(j=0;j<250;j++);
}
void states(void)interrupt 0 //调整电子钟的状态
{ debouncer();
TR0=0;
if(state==0)
{ state=1;
}
if(state==1)
{ state=2;
}
if(state==2)
{state=0;
TR0=1;}
}
void tiaozheng(void)interrupt 2 //根据状态调时
{
debouncer();
if(state==0);
if(state==1)
{ f=f+1;
if(f==60)f=0;
}
if(state==2)
{ s=s+1;
if(s==24)s=0;
}
}
void debouncer(void)
{ unsigned char j;
for(j=0;j<250;j++)
for(i=0;i<250;i++);
}
} |