Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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);
}
