/* this file is write for GUN MANGER */ /* date: 1997/5/12 */ /* HARDWARE is 89C51 intel CPU */ /* 6M clock */ code char DATE[]= "DATE:5/12/1997"; code char author[]= "author: HTZ "; code char reason[]=" reason: for XIAN SHI PING SAFE_RUN CLOCK "; #include <io51.h>
#define PP1 (*(char *)0x01f70a) #define PP2 (*(char *)0x01f70b) #define PP3 (*(char *)0x01f70c)
#define YEAR (*(char *)0x01f709) #define MONTH (*(char *)0x01f708) #define DAY (*(char *)0x01f707) #define WEEK (*(char *)0x01f706) #define HOURSET (*(char *)0x01f705) #define HOUR (*(char *)0x01f704) #define MINSET (*(char *)0x01f703) #define MIN (*(char *)0x01f702) #define SECSET (*(char *)0x01f701) #define SEC (*(char *)0x01f700)
#define KEY1 INT0 #define KEY2 INT1 #define KEY3 T0 #define KEY4 T1
#define LYEAR_1 0x00 #define LYEAR_2 0x10 #define LYEAR_3 0x20 #define LYEAR_4 0x30
#define LMONTH_H 0x40 #define LMONTH_L 0x50
#define LDAY_H 0x60 #define LDAY_L 0x70
#define LHOUR_H 0x80 #define LHOUR_L 0x90
#define LMIN_H 0xa0 #define LMIN_L 0xb0
#define LSEC_H 0xc0 #define LSEC_L 0xd0
#define LWEEK 0xe0 #define LRESAVED1 0xf0
#define LENABLE RXD
typedef struct _TIME { char Year ; char Month; char Day ; char Hour ; char Min ; char Sec ; char Week ;
} TIME; typedef TIME * PTime ; TIME st,gt;
bit KEY,SETTIME,GETTIME,DT,DayChange;
static char f=-1; #define PERIOD (-250) /* 250*2us=500us */
void Delay(char msec ); void ActiveDs12887(void); void GetTime(PTime pt); void SetTime(PTime pt); void init(void); void KeyProc(void) ; void SendPlus(void); void SendDat (char dat,char addr1,char addr2); void Disp(void); void main(void) { Delay(10); ActiveDs12887(); init(); while(1) { if(SETTIME) SetTime(&st); if(GETTIME) GetTime(&st); if(DT) Disp(); if(KEY) KeyProc(); if(DayChange) SendPlus();
} }
/* ***************************** */ void Delay(char msec ) { unsigned char i,j; for(i=0;i<2*msec;i++) { for(j=0;j<250;j++); /* 6M CRY 2us*250=500us*2=1ms */ } }
/* ***************************** */ void ActiveDs12887(void) { PP1=0x20; PP2=0x02; PP3=0; }
/* ***************************** */ void GetTime(PTime pt) { GETTIME=0;
if(f!=0) pt->Sec = SEC ; if(f!=1) pt->Min = MIN ; if(f!=2) pt->Hour = HOUR ;
if(f!=3) { if( (pt->Day!=DAY)&&!(pt->Sec)&&!(pt->Min)&&!(pt->Hour) ) DayChange=1; pt->Day = DAY ; } if(f!=4) pt->Month= MONTH ; if(f!=5) pt->Year = YEAR ; pt->Week=WEEK; }
/* ***************************** */ void SetTime(PTime pt) { SETTIME=0; SECSET = pt->Sec ; MINSET = pt->Min ; HOURSET = pt->Hour ; /* DAY = pt->Day ; MONTH = pt->Month; YEAR = pt->Year ; */ }
/* ***************************** */ void init(void) { /* internal var init */ GETTIME=1; KEY=1; /* Hardware init */ TXD=RXD=1; LENABLE=1; /* setup timer 0 interrupt */ TH0 = PERIOD; /* set timer period */ TL0 = PERIOD; TR0 =1; /* start timer 0 */ ET0 =1; /* enable timer 0 interrupt */ EA=1;
}
/* ***************************** */ void KeyProc(void) {
/* KEY1 is used for FUNCTION is used to select Year,Month,Day,Hours,min,sec */ if(KEY1==0){ Delay(20); if(KEY1==0) { if(f++>7) f=0; } } /* KEY2 is used for ++ */ if(KEY2==0) { Delay(20); if(KEY2==0) { switch (f) { case 0: if(st.Sec++>=60 ) st.Sec=0; break; case 1: if(st.Min++>=60 ) st.Min=0; break; case 2: if(st.Hour++>=24 ) st.Hour=0; break; case 3: if(st.Day++>31 ) st.Day=0; break; case 4: if(st.Month++>12) st.Month=0; break; case 5: if(st.Year++>99) st.Year=0; break; default: f=-1; } } } /* KEY3 is used for --;
*/ if(KEY3==0) { Delay(20); if(KEY3==0) { switch (f) { case 0: if(st.Sec--< 0 ) st.Sec=59; break; case 1: if(st.Min--< 0 ) st.Min=59; break; case 2: if(st.Hour--< 0) st.Hour=23; break; case 3: if(st.Day--< 0 ) st.Day=31; break; case 4: if(st.Month--< 0) st.Month=12; break; case 5: if(st.Year--< 0 ) st.Year=99; break; default: f=-1; } } } /* KEY4 is used for OK;
*/ if(KEY4==0) { Delay(20); if(KEY4==0) SETTIME=1; } }
/* ***************************** */ bit InT0; /* Define Timer 0 ISR based on io51.h, using the #pragma form: */ interrupt [0x0b] /*using [1]*/ void T0_int(void) /* actual address specified in io51.h */ { /* service the interrupt */ static unsigned char count=0; static unsigned char count1=0; TH0 = PERIOD; /* set timer period */ TL0 |= PERIOD; if(InT0) return; InT0=1; ++count; if(!(count%20)) KEY=1; /* 500us*20=1000us(10ms) */ if(!(count%200)) /* 500us*200=0.1s */ { ++count1; if(!(count1%5)) { /* 0.1s*5=0.5s */ GETTIME=1; DT=1; } } InT0=0; }
/* ***************************** */ void SendPlus(void) { DayChange=0; TXD=0; Delay(1); /* 1ms ----__----- */ TXD=1;
}
/* ***************************** */ void SendDat (char dat,char addr1,char addr2) { P1=(dat>>4&0x0f+'0') | addr1; LENABLE=0;LENABLE=1; P1=(dat &0x0f+'0') | addr2; LENABLE=0;LENABLE=1; } bit bsec,bmin,bhour,bday,bmonth,byear,bweek; void Disp(void) { DT=0;
SendDat(gt.Week,0xf0 ,LWEEK); switch (f) { case 0: bsec=!bsec; if(bsec) SendDat(0xAA,LSEC_H ,LSEC_L ); else SendDat(gt.Sec,LSEC_H ,LSEC_L ); break; case 1: bmin=!bmin; if(bmin) SendDat(0xAA ,LMIN_H ,LMIN_L ); else SendDat(gt.Min ,LMIN_H ,LMIN_L ); break; case 2: bhour=!bhour; if(bhour) SendDat(0xAA ,LHOUR_H ,LHOUR_L ); else SendDat(gt.Hour ,LHOUR_H ,LHOUR_L ); break; case 3: bday=!bday; if(bday) SendDat(0xAA ,LDAY_H ,LDAY_L ); else SendDat(gt.Day ,LDAY_H ,LDAY_L ); break; case 4: bmonth=!bmonth; if(bmonth)SendDat(0xAA ,LMONTH_H,LMONTH_L ); else SendDat(gt.Month ,LMONTH_H,LMONTH_L ); break; case 5: byear=!byear; if(byear) { SendDat(0xAA,LYEAR_1,LYEAR_2 ); } else { SendDat(gt.Year ,LYEAR_1,LYEAR_2 ); } break; }
} /* ***************************** */
(文章推荐人:老万)
|