/***************************************************************************/ /* DS1302.C */ /***************************************************************************/ #include #include /* Register declarations for DS5000 */ sbit IO = P0^2; sbit SCLK = P0^1; sbit RSTB = P0^0; /***************************************************************************/ /* Prototypes */ /***************************************************************************/ void clkwritebyte(); void ramwritebyte(); uchar rbyte_3w(); void reset_3w(); void wbyte_3w(uchar); void initialize_DS1302(); void disp_clk_regs(uchar); void burstramrd(); void burstramwr(); /* ----------------------------------------------------------------------- */ void reset_3w() { SCLK = 0; RSTB = 0; RSTB = 1; } /* ----------------------------------------------------------------------- */ void wbyte_3w(uchar W_Byte) { uchar i; for(i = 0; i < 8; ++i) { IO = 0; if(W_Byte & 0x01) { IO = 1; /* set port pin high to read data */ } SCLK = 0; SCLK = 1; W_Byte >>= 1; } } /* ----------------------------------------------------------------------- */ uchar rbyte_3w() { uchar i; uchar R_Byte; uchar TmpByte; R_Byte = 0x00; IO = 1; for(i=0; i<8; ++i) { SCLK = 1; SCLK = 0; TmpByte = (uchar)IO; TmpByte <<= 7; R_Byte >>= 1; R_Byte |= TmpByte; } return R_Byte; } /* ----------------------------------------------------------------------- */ void clkwritebyte() { uchar ClkAdd; uchar ClkData; /* Get Clock Address & Data */ printf("\nWrite Clock ADDRESS:"); scanf("%bu", &ClkAdd); printf("\nWrite Clock DATA:"); scanf("%bx", &ClkData); /* Prepare Command Byte for Clock Write */ ClkAdd = ((ClkAdd * 2) | 0x80); reset_3w(); wbyte_3w(ClkAdd); wbyte_3w(ClkData); reset_3w(); } /* ----------------------------------------------------------------------- */ void ramwritebyte() { uchar ramadd; uchar ramdata; /* Get Ram Address & Data */ printf("\nWrite Ram ADDRESS (HEX):"); scanf("%bx", &ramadd); printf("\nWrite Ram DATA (HEX):"); scanf("%bx", &ramdata); /* Prepare Command Byte for Ram Write */ ramadd = ((ramadd * 2) | 0xC0); reset_3w(); wbyte_3w(ramadd); wbyte_3w(ramdata); reset_3w(); } void disp_clk_regs(uchar loop) /* ---- read and display clock registers ---- */ { uchar lsec = 99, sec, min, hrs, dte, mon, day, yr; do /* Read & Display Clock Registers */ { reset_3w(); wbyte_3w(0xBF); /* clock burst */ sec = rbyte_3w(); min = rbyte_3w(); hrs = rbyte_3w(); dte = rbyte_3w(); mon = rbyte_3w(); day = rbyte_3w(); yr = rbyte_3w(); reset_3w(); if(sec != lsec || !loop) /* print once per second */ { printf("\nYr Day Mon Dte Hrs Min Sec"); printf("\n%2.bX %2.bX %2.bX %2.bX", yr, day, mon, dte); printf(" %2.bX %2.bX %2.bX", hrs, min, sec); lsec = sec; } if(!loop) break; } while(!RI); if(loop) _getkey(); } void burstramrd() /* ----------- read RAM in burst mode --------------- */ { uchar rmary[31]; uchar i; reset_3w(); wbyte_3w(0xFF); /* RAM burst read */ for (i=0; i<31; ++i) { rmary[i] = rbyte_3w(); } reset_3w(); printf("\nDS1302 Ram"); printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX", rmary[0], rmary[1], rmary[2], rmary[3], rmary[4], rmary[5], rmary[6], rmary[7]); printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX", rmary[8], rmary[9], rmary[10], rmary[11], rmary[12], rmary[13], rmary[14], rmary[15]); printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX", rmary[16], rmary[17], rmary[18], rmary[19], rmary[20], rmary[21], rmary[22], rmary[23]); printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX", rmary[24], rmary[25], rmary[26], rmary[27], rmary[28], rmary[29], rmary[30]); } void burstramwr() /* ------ write one value to entire array --------- */ { uchar ramdata; uchar i; /* Get Ram Data */ printf("\nWrite Ram DATA (HEX):"); scanf("%bx", &ramdata); reset_3w(); wbyte_3w(0xfe); /* RAM burst write */ for (i=0; i<31; ++i) { wbyte_3w(ramdata); } reset_3w(); } void initialize_DS1302() /* ----------------------------------------- */ /* Note: NO error checking is done on the user entries! */ { uchar yr, mn, date, dy, hr, min, sec, day; printf("\nEnter the year (0-99): "); scanf("%bx", &yr); printf("\nEnter the month (1-12): "); scanf("%bx", &mn); printf("\nEnter the date (1-31): "); scanf("%bx", &date); printf("\nEnter the day (1-7): "); scanf("%bx", &dy); printf("\nEnter the hour (1-24): "); scanf("%bx", &hr); hr = hr & 0x3f; /* force clock to 24 hour mode */ printf("\nEnter the minute (0-59): "); scanf("%bx", &min); printf("\nEnter the second (0-59): "); scanf("%bx", &sec); reset_3w(); wbyte_3w(0x8e); /* control register */ wbyte_3w(0); /* disable write protect */ reset_3w(); wbyte_3w(0x90); /* trickle charger register */ wbyte_3w(0xab); /* enable, 2 diodes, 8K resistor */ reset_3w(); wbyte_3w(0xbe); /* clock burst write (eight registers) */ wbyte_3w(sec); wbyte_3w(min); wbyte_3w(hr); wbyte_3w(date); wbyte_3w(mn); wbyte_3w(dy); wbyte_3w(yr); wbyte_3w(0); /* must write control register in burst mode */ reset_3w(); } main (void) /* ----------------------------------------------------- */ { uchar i, M, M1; while (1) { printf("\nDS1302\n"); printf("I. initialize DS1302\n"); printf("CW. Write Byte CR. Read Time\n"); printf("RW. Write RAM RR. Read RAM\n"); printf("\nEnter Menu Selection:"); M = _getkey(); switch(M) { case 'C': case 'c': printf("\rEnter Clock Routine to run:C"); M1 = _getkey(); switch(M1) { case 'R': case 'r': disp_clk_regs(1); break; case 'W': case 'w': clkwritebyte(); break; } break; case 'I': case 'i': initialize_DS1302(); break; case 'R': case 'r': printf("\rEnter Ram Routine to run:R"); M1 = _getkey(); switch(M1) { case 'B': case 'b': ramwritebyte(); break; case 'R': case 'r': burstramrd(); break; case 'W': case 'w': burstramwr(); break; } break; } } }