文章编号:650 .2968

『关闭窗口』

卖破烂 ,我的第一个c语言代码,是一个安全运行天数显示的(haotz)


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


}
/* ***************************** */


(文章推荐人:老万)

 

返回大虾论坛 返回首页