};
unsigned int TZ,Ti;
unsigned char ii,jj,nn,mm,tt, Ms;
/*延时函数*/
void DelayMs(unsigned int msec) {
unsigned int x,y; for(x=0; x<=msec;x++) {
for(y=0;y<=110;y++); } }
/*键盘去抖处理函数*/ unsigned char ChKey(bit Key) {
if(Key==0){ DelayMs(30);
if(Key==0) return(1); } }
/*定时器中断0处理(时钟)函数*/ void timer0(void) interrupt 1 using 1 {
TH0=-(5000/256); TL0=-(5000%6); TR0=1;
BUFFER[0]=BUFFER[0]+1; if (BUFFER[0]>201){
BUFFER[0]=0; BUFFER[1]=BUFFER[1]+1; Ms=!Ms;
if (BUFFER[1]==60){
BUFFER[1]=0;BUFFER[2]=BUFFER[2]+1; if (BUFFER[2]==60){
BUFFER[2]=0;BUFFER[3]=BUFFER[3]+1; if (BUFFER[3]==24) BUFFER[3]=0; } } } }
/*定时器中断1处理(LED驱动)函数*/ void timer1(void) interrupt 3 using 1 {
TH1=(Ti+tt*15)/256; TL1=(Ti+tt*15)%6;
if((put1==1)&&(ii<7)&&(Ms*w[ii]==0)) P2=~ASCIIDOC[v[ii]*6+jj]; else P2=0xff;
jj++; tt++;
if(jj>5) {ii++; jj=0;};
if(ii>10) {ii=0;put1=~put1; put2=~put2;tt=0;} }
/*主程序*/ void main(void) { Ms=1;
Ti=-2100; //根据实际调整 mm=14;
put1=0;put2=1; /*初始化定时中断0*/ TMOD=0x11;
TH0=-5000/256; TL0=-5000%6; TR0=1;ET0=1; /*初始化定时中断1*/ TH1=Ti/256; TL1=Ti%6; TR1=1;ET1=1;
/* 七个显示位置,中间为\符 */ v[0]=10; v[1]=10; v[2]=10; v[3]=13; v[4]=10; v[5]=10; v[6]=10;
/*正常运行状态,让中间\符闪现*/ w[1]=0; w[2]=0; w[3]=1; w[4]=0; w[5]=0;
/*摇摆棒初始启动*/ do { mm--;
DelayMs(120+mm*5); put1=~put1; put2=~put2; }while(mm>0);
/*启动显示*/ ii=0;jj=0; EA=1;
/*正式运行*/
for(;;){ while(1){
/*显示时和分*/ v[1]=BUFFER[3]/10;
v[2]=BUFFER[3]-v[1]*10; v[4]=BUFFER[2]/10; v[5]=BUFFER[2]-v[4]*10;
/*按键处理*/
if(ChKey(set0)==1){ //调整项键 if(TZ<2) TZ++; else TZ=0; /*闪现调整项*/ switch(TZ){
case 0:w[1]=0;w[2]=0;w[3]=1;w[4]=0;w[5]=0;break;//正常时秒闪 case 1:w[1]=0;w[2]=0;w[3]=0;w[4]=1;w[5]=1;break;//调分时分闪 case 2:w[1]=1;w[2]=1;w[3]=0;w[4]=0;w[5]=0;break;//调时时时闪 } };
DelayMs(300);
if(ChKey(set1)==1){ if(BUFFER[TZ+1] if(ChKey(set2)==1){ if(BUFFER[TZ+1]>0) BUFFER[TZ+1]--; else BUFFER[TZ+1]=maxnum[TZ-1];DelayMs(300);}; // 减法键 DelayMs(300); } } } 四. 结语 本制作的最大问题是操声和振动问题,尽管做了努力,还是没有完全解决,还有改善余地。由于设计没有考虑回摆时的显示,显示有明显闪烁现象,也需要进一步完善。