Kim Min
/
Xadow_Watch_RGBOLED
...
Fork of Xadow_Watch_RGBOLED by
main.cpp
- Committer:
- loovee
- Date:
- 2014-04-01
- Revision:
- 0:99c0050a285c
File content as of revision 0:99c0050a285c:
#include "mbed.h" //#include "USBSerial.h" #include "Defs.h" #include "pinmap.h" #include "font_watch.h" #include "DS1337.h" #define HARD_SPI 1 //USBSerial pc; // functions void spiWrite(unsigned char data); void writeCommand(unsigned char cmd); void writeData(unsigned char data); void writeColor(unsigned int data); void initOLED(void); void clearOLED(void); void fillRect(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned int outlineColor, unsigned int fillColor); void drawLine(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned int color); void fillOLED(unsigned int color); //DigitalOut blue(P0_20); DigitalOut white(P0_23); DigitalOut PowerON_OLED(P0_15); DigitalOut DC_OLED(P0_11); DigitalOut CS_OLED(P0_2); #if HARD_SPI SPI spi(P0_9, P0_20, P0_10); // mosi, miso, sclk #else DigitalOut MOSI_OLED(P0_9); DigitalOut SCK_OLED(P0_10); #endif DS1337 RTC(P0_5, P0_4); 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; 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(33); RTC.setHours(16); RTC.setDays(18); RTC.setDayOfWeek(2); RTC.setMonths(3); RTC.setYears(2014); RTC.setTime(); } void drawPix(int x, int y, unsigned int color) { //fillRect(x, y, x, y, color, color); int x1 = 95-y; int y1 = x; drawLine(x1, y1, x1, y1, color); } 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]); } unsigned int make_color(unsigned char r, unsigned char g, unsigned char b) { unsigned int color_ = r; color_ = r>>3; // red color_ = color_<<6 | (g>>2); // green color_ = color_<<5 | (b>>3); // blue return color_; } void dispString(char *str) { clearOLED(); int color = make_color(255,255, 255); int x=0, y=0; int pix = 0; while(*str) { dispChar(*str, x, y, make_color(255, 255, 255)); 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; int color_ = make_color(255, 255, 255); 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_ = make_color(125, 255, 62); dispChar('M', 0, 40, color_); dispChar('a', 8, 40, color_); dispChar('r', 16, 40, color_); // dispChar() dispFont_small(30, 40, color_, font_ascii[time_now.day/10+'0'-32]); dispFont_small(38, 40, color_, font_ascii[time_now.day%10+'0'-32]); } void show_time() { clearOLED(); int color_ = make_color(255, 255, 255); refresh_day(); for(int i=0; i<63; i++) { drawPix(i, 56, color_); drawPix(i, 57, color_); } refresh_time(); } int main() { uart.baud(38400); pin_function(P0_15,1); pin_function(P0_10,1); //pin_mode(P0_15,OpenDrain); PowerON_OLED = 0; // power on OLED module wait_ms(5); PowerON_OLED = 1; // power off OLED module wait_ms(5); PowerON_OLED = 0; // power on OLED module wait_ms(5); #if HARD_SPI spi.format(8,3); spi.frequency(1000000); #else SCK_OLED = 1; CS_OLED = 1; #endif initOLED(); clearOLED(); //unsigned int color = 0; // blue = 0; dispString("xadow smart watch"); wait(1); //setTime(); time_init(); show_time(); char ble_str[40]; int len_str = 0; drawBuff(12, 0, 40, 40, make_color(153, 153, 255), font_ophw); for(;;) { time_refresh(); if(time_now.day != time_buf.day) { refresh_day(); } if(time_now.minutes != time_buf.minutes) { refresh_time(); } 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(); 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(len_str>0) { ble_str[len_str] = '\0'; dispString(ble_str); wait(3); show_time(); len_str = 0; } } } void spiWrite(unsigned char data) { #if HARD_SPI spi.write(data); #else for(unsigned char i=0;i<8;i++) { SCK_OLED = 0; if(data&0x80) { MOSI_OLED = 1; } else { MOSI_OLED = 0; } data<<=1; wait_us(1); SCK_OLED = 1; wait_us(1); } #endif } void writeCommand(unsigned char cmd) { DC_OLED = 0; CS_OLED = 0; spiWrite(cmd); CS_OLED = 1; } void writeData(unsigned char data) { DC_OLED = 1; CS_OLED = 0; spiWrite(data); CS_OLED = 1; } void writeColor(unsigned int data) { DC_OLED = 1; CS_OLED = 0; spiWrite(data>>8); spiWrite(data); CS_OLED = 1; } void initOLED(void) { writeCommand(SSD1331_CMD_DISPLAYOFF); // 0xAE writeCommand(SSD1331_CMD_SETREMAP); // 0xA0 #if defined SSD1331_COLORORDER_RGB writeCommand(0x72); // RGB Color #else writeCommand(0x76); // BGR Color #endif writeCommand(SSD1331_CMD_STARTLINE); // 0xA1 writeCommand(0x0); writeCommand(SSD1331_CMD_DISPLAYOFFSET); // 0xA2 writeCommand(0x0); writeCommand(SSD1331_CMD_NORMALDISPLAY); // 0xA4 writeCommand(SSD1331_CMD_SETMULTIPLEX); // 0xA8 writeCommand(0x3F); // 0x3F 1/64 duty writeCommand(SSD1331_CMD_SETMASTER); // 0xAD writeCommand(0x8E); writeCommand(SSD1331_CMD_POWERMODE); // 0xB0 writeCommand(0x0B); writeCommand(SSD1331_CMD_PRECHARGE); // 0xB1 writeCommand(0x31); writeCommand(SSD1331_CMD_CLOCKDIV); // 0xB3 writeCommand(0xF0); // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16) writeCommand(SSD1331_CMD_PRECHARGEA); // 0x8A writeCommand(0x64); writeCommand(SSD1331_CMD_PRECHARGEB); // 0x8B writeCommand(0x78); writeCommand(SSD1331_CMD_PRECHARGEA); // 0x8C writeCommand(0x64); writeCommand(SSD1331_CMD_PRECHARGELEVEL); // 0xBB writeCommand(0x3A); writeCommand(SSD1331_CMD_VCOMH); // 0xBE writeCommand(0x3E); writeCommand(SSD1331_CMD_MASTERCURRENT); // 0x87 writeCommand(0x06); writeCommand(SSD1331_CMD_CONTRASTA); // 0x81 writeCommand(0x91); writeCommand(SSD1331_CMD_CONTRASTB); // 0x82 writeCommand(0x50); writeCommand(SSD1331_CMD_CONTRASTC); // 0x83 writeCommand(0x7D); writeCommand(SSD1331_CMD_DISPLAYON); //--turn on oled panel } void clearOLED(void) { fillRect(0,0,95,63,0,0); } void fillOLED(unsigned int color) { fillRect(0,0,95,63,color,color); } void fillRect(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned int outlineColor, unsigned int fillColor) { writeCommand(SSD1331_CMD_FILL); writeCommand(0x01); writeCommand(SSD1331_CMD_DRAWRECT); writeCommand(x0); // Starting column writeCommand(y0); // Starting row writeCommand(x1); // End column writeCommand(y1); // End row // Outline color writeCommand((uint8_t)((outlineColor >> 11) << 1)); writeCommand((uint8_t)((outlineColor >> 5) & 0x3F)); writeCommand((uint8_t)((outlineColor << 1) & 0x3F)); // Fill color writeCommand((uint8_t)((fillColor >> 11) << 1)); writeCommand((uint8_t)((fillColor >> 5) & 0x3F)); writeCommand((uint8_t)((fillColor << 1) & 0x3F)); // Delay while the fill completes wait_ms(SSD1331_DELAYS_HWFILL); } void drawLine(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned int color) { writeCommand(SSD1331_CMD_DRAWLINE); writeCommand(x0); writeCommand(y0); writeCommand(x1); writeCommand(y1); //wait_ms(SSD1331_DELAYS_HWLINE); writeCommand((uint8_t)((color >> 11) << 1)); writeCommand((uint8_t)((color >> 5) & 0x3F)); writeCommand((uint8_t)((color << 1) & 0x3F)); // wait_ms(SSD1331_DELAYS_HWLINE); }