|

楼主 |
发表于 2011-1-24 11:48:12
|
显示全部楼层
- #pragma code
- #include <stdio.h>
- #include <reg51.h>
- //#define TIMCNT 1563
- //#define TIMCNT 3200
- //#define TIMCNT 1200 //1200 for 7.3728MHz
- #define TIMCNT 3000 //for 18.432MHz
- #define DOT 0x80
- #define CHAR_c 97
- #define CHAR_P 115|0x80
- #define CHAR_d 94
- #define CHAR_o 92
- #define CHAR_f 113
- #define CHAR_minus 64
- #define KEYDELAY TIMCNT/4
- #define KEY RD
- code char version[]=" ==<<Clock V1.3 by 翌展 2009.3.10>>==\n";
- data unsigned char asctb[]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113};
- data unsigned char digbit[]={0xe0,0xd0,0xc8,0xc4};//11100000,11010000,11001000,11000100
- data unsigned char light=8,bright,alight=0,alon=32,maxtl[8]={0,0,0,0,0,0,0,0};
- // 0,1 2 3 4 5 6 7 8 9 1011 12 13 14 15
- data unsigned char gama[]={1,1,2,2,3,3,4,5,6,7,8,10,13,18,24,32,32};
- data unsigned char mode=0,alhour=0,almin=0,almode=0,hour=0,min=0,sec=0,week=0,flash=0,se=0;
- data unsigned char dispdot=0; //0: none 1:flash 2:always
- data unsigned char P1bit=0x3;
- data unsigned int timcnt=TIMCNT;
- data unsigned char dbuf[4]={0xff,0xff,0xff,0xff},pbuf1[4]={0xfc,0xfc,0xfc,0xfc},pbuf3[4]={0xe3,0xd3,0xcb,0xc7};
- bit modi=0,h12=0,lkey=0,rkey=0,dot=0,alarm=0,alarm_on=0,power=1,dot2=0,active=0;
- void inittimer0(void)
- {
- TMOD&=0xf0;
- TMOD|=0x02;
- TH0=0;
- TL0=0;
- TR0=1;
- ET0=1;
- EA=1;
- }
- void timer0(void) interrupt 1
- {
- timcnt--;
- if(timcnt==0)
- {
- if(!modi)sec++;
- if(sec>119)sec=0;
- dot=!dot;
- timcnt=TIMCNT;
- }
- }
- void display_almode(void)
- {
- switch(almode){
- case 0: //off
- dbuf[0]=0;
- dbuf[1]=CHAR_o;
- dbuf[2]=CHAR_f;
- dbuf[3]=CHAR_f;
- break;
- case 1: //p.d.
- dbuf[0]=0;
- dbuf[1]=CHAR_P;
- dbuf[2]=0;
- dbuf[3]=CHAR_d|DOT;
- break;
- case 2: //1-5
- dbuf[0]=CHAR_d;
- dbuf[1]=asctb[1];
- dbuf[2]=CHAR_minus;
- dbuf[3]=asctb[5];
- break;
- }
- }
- void display_hm(unsigned char h,unsigned char m,bit b)
- {
- dbuf[1]=asctb[h%10];
- h/=10;
- if(b && !h)dbuf[0]=0;else dbuf[0]=asctb[h];
- dbuf[2]=asctb[m/10];
- dbuf[3]=asctb[m%10];
- }
- void display(void)
- {
- static unsigned char pid=0;
- unsigned char c,h;
- flash=0;dispdot=1;
- switch(mode)
- {
- case 0: //12 hour
- h=hour%12;if(h==0)h=12;
- display_hm(h,min,1);
- if(hour<12)dbuf[0]|=DOT;
- break;
- case 1: //24 hour
- display_hm(hour,min,1);
- break;
- case 2: //second
- display_hm(min,sec>>1,0);
- dispdot=2;
- break;
- case 3: //h setup
- display_hm(hour,min,1);
- flash=1;
- break;
- case 4: //m setup
- display_hm(hour,min,1);
- flash=2;
- if(modi)dispdot=2;
- break;
- case 5: //week setup
- dbuf[0]=0;
- dbuf[1]=asctb[week];
- dbuf[2]=CHAR_d;
- dbuf[3]=0;
- flash=1;
- dispdot=0;
- break;
- case 6: //s setup
- display_hm(min,sec>>1,0);
- dispdot=2;
- flash=2;
- break;
- case 7: //week
- dbuf[0]=0;
- dbuf[1]=asctb[week];
- dbuf[2]=CHAR_d; //'d'
- dbuf[3]=0;
- dispdot=0;
- break;
- case 8: //alarm
- if((sec & 6)==6){
- display_almode();
- dispdot=0;
- }else{
- display_hm(alhour,almin,1);
- dispdot=2;
- }
- break;
- case 9: //alarm hour setup
- display_hm(alhour,almin,1);
- dbuf[3]|=DOT;
- flash=1;
- dispdot=2;
- break;
- case 10: //alarm min setup
- display_hm(alhour,almin,1);
- dbuf[3]|=DOT;
- flash=2;
- dispdot=2;
- break;
- case 11: //alarm mode setup 0:off 1: p.d. 2:1-5
- display_almode();
- flash=3;
- dispdot=0;
- break;
- case 12: //display bright senser data
- dbuf[0]=asctb[light];
- dbuf[1]=0;
- dbuf[2]=asctb[bright/10];
- dbuf[3]=asctb[bright%10];
- dispdot=0;
- break;
- case 13: //display MAX RUN DELAY
- pid++;if(pid>63)pid=0;
- c=pid>>3;
- dbuf[0]=asctb[c];
- dbuf[1]=CHAR_minus;
- c=maxtl[c];
- dbuf[2]=asctb[c>>4];
- dbuf[3]=asctb[c&0xf];
- dispdot=0;
- break;
- case 14: //min was set and wait for starting
- display_hm(hour,min,1);
- dispdot=2;
- break;
- case 15: //LED & alarm light check
- dbuf[0]=0xff;
- dbuf[1]=0xff;
- dbuf[2]=0xff;
- dbuf[3]=0xff;
- dispdot=0;
- pid++;
- if(pid>63)pid=0;
- alight=pid>>2;
- alarm_on=1;
- break;
- }
- }
- void display_dot(void)
- {
- if(dispdot==1 && dot2 || dispdot==2){dbuf[1]|=DOT;dbuf[2]|=DOT;}
- }
- void bufferproc(void)
- {
- if(almode)dbuf[3]|=DOT;
- if(!dot2){
- if(flash&1){
- dbuf[0]&=DOT;dbuf[1]&=DOT;
- }
- if(flash&2){
- dbuf[2]&=DOT;dbuf[3]&=DOT;
- }
- }
- pbuf1[0]=dbuf[0]&0xfc;
- pbuf3[0]=dbuf[0]&3|digbit[0];
- pbuf1[1]=dbuf[1]&0xfc;
- pbuf3[1]=dbuf[1]&3|digbit[1];
- pbuf1[2]=dbuf[2]&0xfc;
- pbuf3[2]=dbuf[2]&3|digbit[2];
- pbuf1[3]=dbuf[3]&0xfc;
- pbuf3[3]=dbuf[3]&3|digbit[3];
- }
- bit caltim(void)
- {
- if(se!=sec)
- {
- se=sec;
- if(sec==0)
- {
- min++;
- if(min>59)
- {
- hour++;min=0;
- if(hour>23)
- {
- hour=0;week++;if(week>6)week=0;
- }
- }
- }
- return 1;
- }
- return 0;
- }
- void LEDscan(void)
- {
- static unsigned char dly=8,dig=0;
- dly--;
- if(dly==0){dly=8;P3=0xc0;} // 11000000
- if(dly==light){
- dig++;
- if(dig>3)dig=0;
- P1=pbuf1[dig]|P1bit;
- P3=pbuf3[dig];
- }
- if(alarm_on){
- alon--; ///alarm
- if(alon==0){alon=32;P10=1;P1bit|=1;}
- if(alon==alight){P10=0;P1bit&=2;}
- }
- }
- void bright_senser(void)
- {
- static unsigned char bcount=63,b2=0;
- if((P1bit&0x2)==0x2){
- if(!P11 && bcount!=0)bcount--;
- else{
- bright=(bright+bcount)>>1;
- if(b2>bright+4 || b2+4<bright){
- light=gama[bright/6]; //0-63 /6 =0-10 //(bright>>3)+1; //*8/256;
- b2=bright;
- }
- P1bit&=0x1;
- P11=0;
- bcount=10;
- }
- }else{
- if(bcount!=0)bcount--;else{
- P1bit|=0x2;
- P11=1;
- bcount=63;
- }
- }
- }
- void alarmlight(void)
- {
- static unsigned char mina=0,fade=0;
- // static unsigned int fade=0;
- if(almode==0)return;
- if(mina!=min){
- mina=min;
- if(!alarm && alhour==hour && almin==min && (almode==1||week>0 && week<6)){
- alarm=1;alarm_on=1;fade=0;alight=0;
- }
- if(alarm){
- if(fade<46){
- if(fade<16)alight=gama[fade]; //0-15
- else if(fade<31)alight=32; //16-30
- else alight=gama[45-fade]; //31-45
- fade++;
- }else{
- alarm=0;alarm_on=0;fade=0;alight=0;P10=1;P1bit|=1;
- }
- }
- }
- }
- void chkpower(void)
- {
- if(P1bit&1){
- power=P10;
- if(!power){P1=3;P3=0;}
- }
- }
- void setup(void)
- {
- static unsigned int kcode=0;
- unsigned char key=0;
- ///----------------------getkey
- if(!KEY){
- lkey=1;
- if(!rkey){
- kcode++;
- if(kcode>KEYDELAY*2){key=2;rkey=1;}
- }
- }else if(lkey){
- if(kcode<KEYDELAY/20)key=0;
- else if(!rkey)key=1;
- lkey=0;
- rkey=0;
- kcode=0;
- }
- if(!key)return;
- //------------------setup
- if(alarm){alarm=0;alarm_on=0;P1bit|=1;return;} //turn off alarm
-
- switch(mode){
- case 0: //12h
- if(key==2)mode=3;
- else mode=1;
- break;
- case 1: //24h
- if(key==2)mode=12;else mode=2;
- break;
- case 2: //second
- if(key==2)mode=6;else mode=7;
- break;
- case 3: //hour setup
- if(key==2)mode=4;else{
- hour++;
- if(hour>23)hour=0;
- }
- break;
- case 4: //minute setup
- if(key==2){mode=modi?14:0;}else{
- modi=1;
- min++;
- if(min>59)min=0;
- }
- break;
- case 5: //week setup
- if(key==2){mode=7;}else{
- week++;
- if(week>6)week=0;
- }
- break;
- case 6: //second setup
- if(key==2){mode=2;}
- else{
- timcnt=TIMCNT;
- if(sec<59)se=0;
- sec=0;
- }
- break;
- case 7: //week
- if(key==2)mode=5;else mode=8;
- break;
- case 8: //alarm
- if(key==2)mode=9;else mode=0;
- break;
- case 9: //alarm hour setup
- if(key==2)mode=10;else{
- alhour++;
- if(alhour>23)alhour=0;
- }
- break;
- case 10: //alarm min setup
- if(key==2)mode=11;else{
- almin++;
- if(almin>59)almin=0;
- }
- break;
- case 11: //alarm mode setup 0:off 1: week 2:1-5
- if(key==2)mode=8;else{
- almode++;
- if(almode>2)almode=0;
- }
- break;
- case 12: //display bright senser data
- mode=13;
- break;
- case 13: //display MAX RUN DELAY
- mode=15;
- break;
- case 14: //min was set and wait for starting
- modi=0;
- sec=0;se=0;
- timcnt=TIMCNT;
- mode=0;
- break;
- case 15:
- alarm_on=0;P1bit|=1; //alarm light check
- mode=1;
- break;
- default:
- mode=0;
-
- }
- }
- main()
- {
- unsigned char c=0,d=0;
- bit b;
- inittimer0();
- while(1)
- {
- PCON|=1;
- b=caltim();
- if(!power){chkpower();continue;}
- LEDscan();
- if(b)continue;
- if(d>maxtl[c]){maxtl[c]=d;}
- c++;
- switch(c){
- case 1:
- if(dot2!=dot){dot2=dot;active=1;}
- chkpower();
- break;
- case 2:
- if(active)display();
- break;
- case 3:
- if(active)display_dot();
- break;
- case 4:
- if(active)bufferproc();
- break;
- case 5:
- if(active)alarmlight();
- break;
- case 6:
- bright_senser();
- break;
- case 7:
- setup();
- break;
- case 8:
- active=0;
- c=0;
- break;
- default:
- c=0;
- }
- d=TL0;
- }
- }
复制代码 |
|