|

楼主 |
发表于 2009-1-22 14:26:43
|
显示全部楼层
源程序当年写得并不规范,反正是好使了就行了。改了以后仍没大动,也是好使了就行了。
- #include <stdio.h>
- #include <reg51.h>
- #define TIMCNT 3126
- #define lowbit(c) (c%10)
- #define hibit(c) (c/10)
- //#include <sio.c>
- code char *version="-=<<Clock V1.2 Written by He Liang 2001.5.4>>=-\n";
- // 0 1 2 3 4 5 6 7 8 9 10 11 12
- code unsigned char asctb[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x2, 0,0x30,0};
- // 0 1 2 3 4 5 6 7 8 9 10 11 12
- code unsigned char daypm[]={0xff,31,28,31,30,31,30,31,31,30,31,30,31,0xff};
- data unsigned char mode=0,year=0,month=1,day=1,hour=0,min=0,sec=0,week=0,setup=0;
- data unsigned char ddlycnt=0;
- data unsigned int timcnt=TIMCNT,delaycnt;
- idata unsigned char dbuf[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
- bit modi=0,flash,date=0,h12=0;
- void inittimer0(void)
- {
- TMOD&=0xf0;
- TMOD+=0x02;
- TH0=0;
- TL0=0;
- TR0=1;
- ET0=1;
- EA=1;
- }
- void timer0(void) interrupt 1
- {
- static unsigned char k=1;
- static unsigned char dc=0;
- k<<=1;
- dc++;
- if(k==0){k=1;dc=0;}
- P1=0;
- T1=1;
- T1=0;
- P1=~dbuf[dc];
- RD=1;
- RD=0;
- P1=k;
- T1=1;
- T1=0;
- if(delaycnt!=0)delaycnt--;
- timcnt--;
- if(timcnt==0)
- {
- if(!modi)sec++;
- if(sec>59)sec=0;
- timcnt=TIMCNT;
- }
- }
- void display()
- {
- unsigned char c,h;
- h12=0;
- switch(mode)
- {
- case 0:
- date=0;
- break;
- case 1:
- date=0;
- if(setup==0)h12=1;
- break;
- case 2:
- date=1;
- if(setup==0){ddlycnt++;if(ddlycnt>5){ddlycnt=0;mode=0;}}
- break;
- case 3:
- if(setup==0)
- {
- if(delaycnt==0)
- {
- date=!date;
- if(date)delaycnt=TIMCNT*2;else delaycnt=TIMCNT*5;
- }
- }
- else
- date=0;
- break;
- }
- if(date)
- {
- dbuf[0]=asctb[hibit(year)];
- dbuf[1]=asctb[lowbit(year)];
- dbuf[2]=asctb[12];
- dbuf[3]=asctb[hibit(month)];
- dbuf[4]=asctb[lowbit(month)];
- dbuf[5]=asctb[12];
- dbuf[6]=asctb[hibit(day)];
- dbuf[7]=asctb[lowbit(day)];
- }else
- {
- h=hour;
- if(h12){
- h%=12;
- if(h==0)h=12;
- }
- c=hibit(h);if(c==0)c=11;
- dbuf[0]=asctb[c];
- dbuf[1]=asctb[lowbit(h)];
- dbuf[2]=asctb[10];
- dbuf[3]=asctb[hibit(min)];
- dbuf[4]=asctb[lowbit(min)];
- dbuf[5]=asctb[10];
- dbuf[6]=asctb[hibit(sec)];
- dbuf[7]=asctb[lowbit(sec)];
- }
- if(!flash && setup>0 && setup <4)
- {
- c=setup-1;
- c=c+c+c;
- dbuf[c]=0;
- dbuf[c+1]=0;
- }
- if(!h12&&(setup!=4||flash))dbuf[week]|=1;
- }
- void caltim()
- {
- static data unsigned char se=0;
- if(sec!=se)
- {
- se=sec;
- if(sec==0)
- {
- min++;
- if(min>59)
- {
- hour++;min=0;
- if(hour>23)
- {
- hour=0;week++;if(week>6)week=0;
- day++;
- if(day>daypm[month]+((month==2 && (year&3)==0)?1:0))
- {
- month++;day=1;
- if(month>12)
- {
- year++;month=1;
- if(year>99)year=0;
- }
- }
- }
- }
- }
- flash=1;
- display();
- }
- if(setup!=0&&delaycnt==0)
- {
- delaycnt=750;
- flash=!flash;
- display();
- }
- }
- char _getkey(void)
- {
- static unsigned char cnt=254,lastkey=0,repcnt=10,lstk=0;
- unsigned char k;
- INT0=1;INT1=1;
- k=P3;
- k=(~(k>>2))&3;
- if(k!=lstk){lstk=k;cnt=254;}
- if(cnt>0){cnt--;return 0;}
- cnt=254;
- if(k==lastkey)
- {
- repcnt--;
- if(repcnt==0){repcnt=2;return k;}
- else return 0;
- }else
- {
- lastkey=k;
- repcnt=6;
- return k;
- }
- }
- main()
- {
- unsigned char key;
- inittimer0();
- // initsio();
- while(1)
- {
- PCON|=1;
- caltim();
- key=_getkey();
- if(key!=0)
- {
- ddlycnt=0;
- switch(key)
- {
- case 1:
- setup++;
- if(setup>4)setup=0;
- if(setup!=3)modi=0;
- delaycnt=0;
- break;
- case 2:
- if(mode==2)
- {
- switch(setup)
- {
- case 0:
- mode++;
- if(mode>3)mode=0;
- break;
- case 1:
- year++;
- if(year>99)year=0;
- break;
- case 2:
- month++;
- if(month>12)month=1;
- break;
- case 3:
- day++;
- if(day>daypm[month]+((month==2 && (year&3)==0)?1:0))day=1;
- break;
- case 4:
- week++;
- if(week>6)week=0;
- break;
- }
- }else{
- switch(setup)
- {
- case 0:
- mode++;
- if(mode>3)mode=0;
- break;
- case 1:
- hour++;
- if(hour>23)hour=0;
- break;
- case 2:
- min++;
- if(min>59)min=0;
- break;
- case 3:
- modi=1;
- sec++;
- if(sec>59)sec=0;
- timcnt=TIMCNT;
- break;
- case 4:
- week++;
- if(week>6)week=0;
- break;
- }
- }
- delaycnt=2400;
- flash=1;
- break;
-
- }
- display();
- }
- }
- }
复制代码
[ 本帖最后由 翌阳 于 2009-1-22 14:29 编辑 ] |
|