#include #include #include "delay.h" #include "lcd.h" #define DATA RA2 #define SCLK RA0 #define RST RA1 #define DATA_Tris TRISA2 #define _XTAL_FREQ 4000000 __CONFIG(XT & WDTDIS & LVPDIS & DEBUGDIS & BORDIS); void clk_write(unsigned char dat) { char x; for(x=0;x<8;x++) { if(dat & 0x01) //put bit on data pin { DATA = 1; } else DATA = 0; SCLK = 1; //toggle clock to latch bit SCLK = 0; dat >>= 1; //move next bit into place } } unsigned char clk_read(void) { char x; unsigned char dat,tmpdat; dat = 0; DATA_Tris = 1; //make DATA input for(x=0;x<8;x++) { if(DATA) //read a bit { tmpdat |= 1; } else { tmpdat |= 0; } tmpdat <<= 7; dat >>= 1; dat |= tmpdat; SCLK = 1; //toggle clock to latch bit SCLK = 0; } DATA_Tris = 0; return(dat); } unsigned char bin_dec(unsigned char value) { unsigned char val =0; if(value & (1<<0)) val =(val + 1); if(value & (1<<1)) val =(val + 2); if(value & (1<<2)) val =(val + 4); if(value & (1<<3)) val =(val + 8); if(value & (1<<4)) val =(val + 10); if(value & (1<<5)) val =(val + 20); if(value & (1<<6)) val =(val + 40); if(value & (1<<7)) val =(val + 80); return(val); } char sec; char min; char hour; char date; char month; char day; char year; char control; void main (void) { char a =0; char b =0; ADCON1 =7; TRISA =0; TRISB =0; TRISC =0; PORTA =0; PORTB =0; PORTC =0; lcd_init(); RST = 1; clk_write(0xbe); //burst read clk_write(0x0); //sec clk_write(0b00110000); //min clk_write(0b00100001); //hours clk_write(0b00001001); //date clk_write(0b00001000); //month clk_write(0b00000001); //day clk_write(0b00010000); //year clk_write(0x0); //control RST = 0; while(1) { RST = 1; //read hours clk_write(0xbf); //burst read sec = clk_read(); //sec min = clk_read(); //min hour = clk_read(); //hours date = clk_read(); //date month = clk_read(); //month day = clk_read(); //day year = clk_read(); //year control = clk_read(); //control RST = 0; lcd_goto(0); // select first line switch (day) { case 1: lcd_puts("Po"); break; case 2: lcd_puts("Ut"); break; case 3: lcd_puts("St"); break; case 4: lcd_puts("St"); break; case 5: lcd_puts("Pi"); break; case 6: lcd_puts("So"); break; case 7: lcd_puts("Ne"); break; default: lcd_puts("--"); } lcd_goto(3); hour =bin_dec(hour); a = (hour / 10) % 10; // extract 0.01 volts digit lcd_putch(a + 48); a = hour % 10; // extract 0.001 volts digit lcd_putch(a + 48); lcd_puts(":"); lcd_goto(6); min =bin_dec(min); a = (min / 10) % 10; // extract 0.01 volts digit lcd_putch(a + 48); a = min % 10; // extract 0.001 volts digit lcd_putch(a + 48); lcd_puts(":"); lcd_goto(9); sec =bin_dec(sec); a = (sec / 10) % 10; // extract 0.01 volts digit lcd_putch(a + 48); a = sec % 10; // extract 0.001 volts digit lcd_putch(a + 48); lcd_goto(0x40); // Select second line date =bin_dec(date); a = (date / 10) % 10; // extract 0.01 volts digit lcd_putch(a + 48); a = date % 10; // extract 0.001 volts digit lcd_putch(a + 48); lcd_puts("."); month =bin_dec(month); a = (month / 10) % 10; // extract 0.01 volts digit lcd_putch(a + 48); a = month % 10; // extract 0.001 volts digit lcd_putch(a + 48); lcd_puts("."); lcd_puts("20"); year =bin_dec(year); a = (year / 10) % 10; // extract 0.01 volts digit lcd_putch(a + 48); a = year % 10; // extract 0.001 volts digit lcd_putch(a + 48); lcd_puts(" "); } }