FRMD KL25Z <=i2c=> NXP PCF8563 (RTC) FRMD KL25Z SPI=> MCP23S17 => (GLCD) T6963C FRMD KL25Z Tsi => 3 button : <--> <enter> <++> FRMD KL25Z => Bip()
Fork of RTC8564NB_Clock by
Diff: RTC.h
- Revision:
- 2:c271f83a69e4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RTC.h Wed May 14 04:46:52 2014 +0000 @@ -0,0 +1,246 @@ +#ifndef RTC_H +#define RTC_H + +#include "mbed.h" +#include "GLCD_spi.h" +#include "TouchMenu.h" + +#define RTC8563 0xA2 + +#define CONTROL1 0x00 +#define CONTROL2 0x01 +#define SECONDS 0x02 +#define MINUTES 0x03 +#define HOURS 0x04 +#define DAYS 0x05 +#define WEEKDAYS 0x06 +#define MONTHS 0x07 +#define YEARS 0x08 +#define MINUTE_ALARM 0x09 +#define HOUR_ALARM 0x0A +#define DAY_ALARM 0x0B +#define WEEKDAY_ALARM 0x0C +#define CLOCKOUT_FREQ 0x0D +#define TIMER_CINTROL 0x0E +#define TIMER 0x0F +#define _READ 0x01 + +I2C i2c(PTE0, PTE1); //SDA, SCL +TouchRun TchR2; +DigitalOut K_LED(LED1), P_LED(LED3), Z_LED(LED2); + + +char year, month, day, week, hour, minute, sec; +int iyear, imonth, iday, iweek, ihour, iminute, isec; +char ntp_year[3], ntp_month[3], ntp_day[3], ntp_week[4]; +char ntp_hour[3], ntp_minute[3], ntp_sec[3]; +char week_val; + +char week_chr[7][4] = {"Vas","Het","Ked","Sze","Csu","Pen","Szo"}; +//------------------------------------------------------------------- +void rtc_write(char address, char value){ + i2c.start(); + i2c.write(RTC8563); + i2c.write(address); + i2c.write(value); + i2c.stop(); +} +//------------------------------------------------------------------- +char rtc_read(char address){ + char value; + i2c.start(); + i2c.write(RTC8563); + i2c.write(address); + i2c.start(); + i2c.write(RTC8563 | _READ); + value = i2c.read(0); + i2c.stop(); + + return value; +} +//------------------------------------------------------------------- +void time_just(){ + char _min, _hour; + //test_led = !test_led; + _min = rtc_read(MINUTES); + if (_min >= 0x30) { + _hour = rtc_read(HOURS); + if (_hour == 0x23) + _hour = 0x00; + else if ((_hour & 0x0F) == 0x09) + _hour = (_hour & 0xF0) + 0x10; + else + _hour = _hour + 0x01; + rtc_write(HOURS, _hour); + } + rtc_write(MINUTES, 0x00); + rtc_write(SECONDS, 0x00); +} +//------------------------------------------------------------------ +void rtc_reset(){ + //just_button.rise(&time_just); + + lcd_cls(); + lcd_string(2,1,"RTC8563 CLOCK RESET" ); + wait(1); + + rtc_write(CONTROL1, 0x20); //stop + rtc_write(CONTROL2, 0x00); + rtc_write(YEARS, 0x36); //((ntp_year[0]-0x30)<<4)+(ntp_year[1]-0x30)); + rtc_write(MONTHS,0x02); //((ntp_month[0]-0x30)<<4)+(ntp_month[1]-0x30)); + rtc_write(DAYS, 0x03); //((ntp_day[0]-0x30)<<4)+(ntp_day[1]-0x30)); + rtc_write(HOURS, 0x04); //((ntp_hour[0]-0x30)<<4)+(ntp_hour[1]-0x30)); + rtc_write(MINUTES,0x05); //((ntp_minute[0]-0x30)<<4)+(ntp_minute[1]-0x30)); + rtc_write(SECONDS,0x00); //((ntp_sec[0]-0x30)<<4)+(ntp_sec[1]-0x30)); + rtc_write(WEEKDAYS, week_val); + rtc_write(CLOCKOUT_FREQ, 0x00); // 0x83 = TE on & 1Hz + rtc_write(TIMER_CINTROL, 0x00); + rtc_write(CONTROL1, 0x00); //start +} +//------------------------------------------------------------------ +void rtc_data_read(){ + i2c.start(); + i2c.write(0xA2); + i2c.write(0x02); + i2c.stop(); + i2c.start(); + i2c.write(0xA3); + sec = i2c.read(SECONDS) & 0x7F; + minute = i2c.read(MINUTES) & 0x7F; + hour = i2c.read(HOURS) & 0x3F; + day = i2c.read(DAYS) & 0x3F; + week = i2c.read(WEEKDAYS) & 0x07; + month = i2c.read(MONTHS) & 0x1F; + year = i2c.read(YEARS); + i2c.stop(); + + + //lcd.locate(0,0); + sprintf(buffer,"%c%c/%c%c/%c%c %s", + ((year >> 4) & 0x0F) + 0x30, (year & 0x0F) + 0x30, //int((year >> 4)& 0x0F)*10 + int(year & 0x0F), + ((month >> 4) & 0x01) + 0x30, (month & 0x0F) + 0x30, + ((day >> 4) & 0x03)+ 0x30, (day & 0x0F) + 0x30, + week_chr[week & 0x07]); + lcd_string(0,0,buffer); + //lcd.locate(0,1); + sprintf(buffer,"%c%c:%c%c:%c%c", + ((hour >> 4) & 0x03) + 0x30, (hour & 0x0F) + 0x30, + (minute >> 4) + 0x30, (minute & 0x0F) + 0x30, + (sec >> 4) + 0x30, (sec & 0x0F) + 0x30 ); + lcd_string(0,13,buffer); +} +//-------------------------------------------------------------- +void rtc_data_set(){ + + rtc_data_read(); + //-------------------------------------------------- + year = (int)((((year >> 4)& 0x0F)*10) + (year & 0x0F)); + + sprintf(buffer,"Year: "); + year = SetBox(year, 0, 99); + Bip(1,1); + + sprintf(buffer,"%d",year); + if(year > 9){ // két helyiértékesetén + year = buffer[0] & 0x0F; + year = (year<<4) + (buffer[1] & 0x0F); + }else{ // egy helyiérték esetén + year = buffer[0] & 0x0F; + } + // a visszaalakítás azonos mint a beolvasásnál + //sprintf(buffer,"Year:%c%c", ((year >> 4) & 0x0F) + 0x30, (year & 0x0F) + 0x30); + //lcd_string(5,0,buffer); + //-------------------------------------------------- + month = (int)((((month >> 4)& 0x01)*10) + (month & 0x0F)); + + sprintf(buffer,"Month: "); + month = SetBox(month, 1, 12); + Bip(1,1); + + sprintf(buffer,"%d",month); + if(month > 9){ // két helyiértékesetén + month = buffer[0] & 0x0F; + month = (month<<4) + (buffer[1] & 0x0F); + }else{ // egy helyiérték esetén + month = buffer[0] & 0x0F; + } + //-------------------------------------------------- + day = (int)((((day >> 4)& 0x03)*10) + (day & 0x0F)); + + sprintf(buffer,"Day: "); + day = SetBox(day, 1, 31); + Bip(1,1); + + sprintf(buffer,"%d",day); + if(day > 9){ // két helyiértékesetén + day = buffer[0] & 0x0F; + day = (day<<4) + (buffer[1] & 0x0F); + }else{ // egy helyiérték esetén + day = buffer[0] & 0x0F; + } + + //-------------------------------------------------- + week = (int)((((week >> 4)& 0x03)*10) + (week & 0x0F)); + + sprintf(buffer,"Week: "); + week = SetBox(week + 1, 1, 7); + Bip(1,1); + + sprintf(buffer,"%d",week - 1); + if(week > 9){ // két helyiértékesetén + week = buffer[0] & 0x0F; + week = (week<<4) + (buffer[1] & 0x0F); + }else{ // egy helyiérték esetén + week = buffer[0] & 0x0F; + } + + //-------------------------------------------------- + hour = (int)((((hour >> 4)& 0x03)*10) + (hour & 0x0F)); + + sprintf(buffer,"Hour: "); + hour = SetBox(hour, 0, 23); + Bip(1,1); + + sprintf(buffer,"%d",hour); + if(hour > 9){ // két helyiértékesetén + hour = buffer[0] & 0x0F; + hour = (hour<<4) + (buffer[1] & 0x0F); + }else{ // egy helyiérték esetén + hour = buffer[0] & 0x0F; + } + + //-------------------------------------------------- + minute = (int)((((minute >> 4)& 0x07)*10) + (minute & 0x0F)); + + sprintf(buffer,"Minute: "); + minute = SetBox(minute, 0, 23); + Bip(1,1); + + sprintf(buffer,"%d",minute); + if(minute > 9){ // két helyiértékesetén + minute = buffer[0] & 0x0F; + minute = (minute<<4) + (buffer[1] & 0x0F); + }else{ // egy helyiérték esetén + minute = buffer[0] & 0x0F; + } + //------------------------------------------------- + + rtc_write(CONTROL1, 0x20); //stop + rtc_write(CONTROL2, 0x00); + rtc_write(YEARS, year); //((ntp_year[0]-0x30)<<4)+(ntp_year[1]-0x30)); + rtc_write(MONTHS,month); + rtc_write(DAYS, day); + rtc_write(WEEKDAYS,week); + rtc_write(HOURS, hour); + rtc_write(MINUTES, minute); + rtc_write(SECONDS,0x00); + rtc_write(CONTROL1, 0x00); //start +} + + + + + + + +#endif \ No newline at end of file