...
Dependencies: DS_1337 Grove_OLED_Display_128X64 mbed
main.cpp
- Committer:
- loovee
- Date:
- 2014-04-01
- Revision:
- 0:4683a4a41f47
File content as of revision 0:4683a4a41f47:
#include "mbed.h" #include "pinmap.h" #include "font_watch.h" #include "DS1337.h" #include "SeeedOLED.h" #define HARD_SPI 1 DigitalOut blue(P0_20); DigitalOut white(P0_23); #define I2C_FREQ 100000 I2C i2c(P0_5, P0_4); // sda, scl DS1337 RTC; Serial uart(P0_19, P0_18); typedef struct{ int hour; int minutes; int second; int year; int month; int day; int week; }TIME_S; TIME_S time_now, time_buf; unsigned char disp[1024]; void initDta() { for(int i=0; i<1024; i++) { disp[i] = 0x00; } } void display() { for(int i=0; i<8; i++) { oled.setTextXY(i,0); for(int j=0; j<128; j++) { oled.sendData(disp[128*i+j]); } } } void clearOled() { initDta(); display(); } void initOLED() { oled.sendCommand(SeeedOLED_Display_Off_Cmd); //display off wait_ms(5); oled.sendCommand(SeeedOLED_Display_On_Cmd); //display on wait_ms(5); oled.sendCommand(SeeedOLED_Normal_Display_Cmd); //Set Normal Display (default) oled.setNormalDisplay(); // Set display to normal mode (i.e non-inverse mode) oled.setPageMode(); // Set addressing mode to Page Mode clearOled(); } void time_init() { RTC.readTime(); time_now.hour = RTC.getHours(); time_now.minutes = RTC.getMinutes(); time_now.second = RTC.getSeconds(); time_now.year = RTC.getYears(); time_now.month = RTC.getMonths(); time_now.day = RTC.getDays(); time_now.week = RTC.getDayOfWeek(); time_buf.hour = RTC.getHours(); time_buf.minutes = RTC.getMinutes(); time_buf.second = RTC.getSeconds(); time_buf.year = RTC.getYears(); time_buf.month = RTC.getMonths(); time_buf.day = RTC.getDays(); time_buf.week = RTC.getDayOfWeek(); } void time_refresh() { RTC.readTime(); time_now.hour = RTC.getHours(); time_now.minutes = RTC.getMinutes(); time_now.second = RTC.getSeconds(); time_now.year = RTC.getYears(); time_now.month = RTC.getMonths(); time_now.day = RTC.getDays(); time_now.week = RTC.getDayOfWeek(); } void setTime() { RTC.setSeconds(50); RTC.setMinutes(35); RTC.setHours(17); RTC.setDays(27); RTC.setDayOfWeek(4); RTC.setMonths(3); RTC.setYears(2014); RTC.setTime(); } void drawPix(int x1, int y1, unsigned int color) { int x = 127-y1; int y = x1; int n = y/8; n = 128*n+x; int bit = y%8; if(color) disp[n] |= (0x01<<bit); else disp[n] &= ~(0x01<<bit); } void drawBuff(int x, int y, int buf_len, int buf_width, int color, const unsigned char *buff) { for(int i=0; i<(buf_width/8); i++) { for(int j=0; j<buf_len; j++) { for(int k=0; k<8; k++) { int clr_ = (buff[i*buf_len+j] & (0x01<<k)) ? color : 0; drawPix(j+x, 8*i+k+y, clr_); } } } } void dispFont(int x, int y, int color, const unsigned char *font) { drawBuff(x, y, 11, 32, color, font); } void dispFont_small(int x, int y, int color, const unsigned char *font) { drawBuff(x, y, 8, 16, color, font); } void dispChar(char c, int x, int y, int color) { c = c-32; drawBuff(x, y, 8, 16, color, font_ascii[c]); } void dispString(char *str) { clearOled(); int x=0, y=0; int pix = 0; while(*str) { dispChar(*str, x, y, 1); str++; x += 8; pix++; if(pix == 8) { pix = 0; x = 0; y += 16; } } } void dispDot(int x, int y, int color) { drawBuff(x, y, 7, 32, color, font_dot); } void refresh_time() { int y = 60+16; int color_ =1; dispFont(0, y, color_, font_num[time_now.hour/10]); dispFont(14, y, color_, font_num[time_now.hour%10]); dispDot(28, y-2, color_); dispFont(38, y, color_, font_num[time_now.minutes/10]); dispFont(52, y, color_, font_num[time_now.minutes%10]); } void refresh_day() { int color_ = 1; int y = 40+16; dispChar('M', 0, y, color_); dispChar('a', 8, y, color_); dispChar('r', 16, y, color_); // dispChar() dispFont_small(30, y, color_, font_ascii[time_now.day/10+'0'-32]); dispFont_small(38, y, color_, font_ascii[time_now.day%10+'0'-32]); } void show_time() { clearOled(); drawBuff(12, 0+16, 40, 40, 1, font_ophw); int color_ = 1; refresh_day(); for(int i=0; i<63; i++) { drawPix(i, 56+16, color_); drawPix(i, 57+16, color_); } refresh_time(); } int main() { uart.baud(38400); initOLED(); clearOled(); dispString("xadow smart watch"); display(); wait(1); //setTime(); time_init(); show_time(); char ble_str[40]; int len_str = 0; display(); for(;;) { time_refresh(); if(time_now.day != time_buf.day) { refresh_day(); display(); } if(time_now.minutes != time_buf.minutes) { refresh_time(); display(); } wait(0.1); while (uart.readable()) { ble_str[len_str++] = uart.getc(); } if(len_str == 1 && (ble_str[0] == 't' || ble_str[0] == 'T')) { time_refresh(); display(); uart.printf("%d/%d/%d\r\n", time_now.year, time_now.month, time_now.day); uart.printf("%d:%d:%d\r\n", time_now.hour, time_now.minutes, time_now.second); len_str = 0; } else if(ble_str[0] == 's' && len_str == 16) // set time { // s201403280944003 RTC.setSeconds((ble_str[13]-'0')*10+(ble_str[14]-'0')); RTC.setMinutes((ble_str[11]-'0')*10+(ble_str[12]-'0')); RTC.setHours((ble_str[9]-'0')*10+(ble_str[10]-'0')); RTC.setDays((ble_str[7]-'0')*10+(ble_str[8]-'0')); RTC.setDayOfWeek(ble_str[15]-'0'); RTC.setMonths((ble_str[5]-'0')*10+(ble_str[6]-'0')); RTC.setYears((ble_str[1]-'0')*1000+(ble_str[2]-'0')*100+(ble_str[3]-'0')*10+(ble_str[4]-'0')); RTC.setTime(); } else if(len_str>0) { uart.printf("get ok\r\n"); ble_str[len_str] = '\0'; dispString(ble_str); display(); wait(3); show_time(); display(); len_str = 0; } } }