www.pudn.com > TG12864.rar > time1.c


   
  
 
/* 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  
 
#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; 
      } 
 
 
} 
/* ***************************** */