The Smart Watch using SSD1306 and I2C. The Time obtain using SNTP protocol from NTP Server.
Dependencies: SNTPClinet WIZnetInterface mbed-src
Fork of SSD1306_smart_watch by
SSD1306.h@2:19e8cd8a0e0c, 2015-06-29 (annotated)
- Committer:
- eunkyoungkim
- Date:
- Mon Jun 29 04:27:44 2015 +0000
- Revision:
- 2:19e8cd8a0e0c
- Parent:
- 0:6e799e373101
modify SNTPClient
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eunkyoungkim | 0:6e799e373101 | 1 | #include "data.h" |
eunkyoungkim | 0:6e799e373101 | 2 | #define addr (0x78) |
eunkyoungkim | 0:6e799e373101 | 3 | |
eunkyoungkim | 0:6e799e373101 | 4 | #if defined(TARGET_WIZwiki_W7500) |
eunkyoungkim | 0:6e799e373101 | 5 | #define SDA PA_10 |
eunkyoungkim | 0:6e799e373101 | 6 | #define SCL PA_9 |
eunkyoungkim | 0:6e799e373101 | 7 | #endif |
eunkyoungkim | 0:6e799e373101 | 8 | |
eunkyoungkim | 0:6e799e373101 | 9 | I2C i2c(SDA, SCL); |
eunkyoungkim | 0:6e799e373101 | 10 | |
eunkyoungkim | 0:6e799e373101 | 11 | void send_cmd(uint8_t cmd){ |
eunkyoungkim | 0:6e799e373101 | 12 | char c[2] ={0x00,cmd}; |
eunkyoungkim | 0:6e799e373101 | 13 | |
eunkyoungkim | 0:6e799e373101 | 14 | i2c.write(addr,c,2,1); |
eunkyoungkim | 0:6e799e373101 | 15 | |
eunkyoungkim | 0:6e799e373101 | 16 | } |
eunkyoungkim | 0:6e799e373101 | 17 | |
eunkyoungkim | 0:6e799e373101 | 18 | void send_data(uint8_t data){ |
eunkyoungkim | 0:6e799e373101 | 19 | char c[2] = {0x40,data}; |
eunkyoungkim | 0:6e799e373101 | 20 | i2c.write(addr,c,2,1); |
eunkyoungkim | 0:6e799e373101 | 21 | |
eunkyoungkim | 0:6e799e373101 | 22 | } |
eunkyoungkim | 0:6e799e373101 | 23 | |
eunkyoungkim | 0:6e799e373101 | 24 | void init(void) |
eunkyoungkim | 0:6e799e373101 | 25 | { |
eunkyoungkim | 0:6e799e373101 | 26 | wait_ms(5); // TBD |
eunkyoungkim | 0:6e799e373101 | 27 | |
eunkyoungkim | 0:6e799e373101 | 28 | send_cmd(0xae); // display off |
eunkyoungkim | 0:6e799e373101 | 29 | send_cmd(0xd5); // display divide ratio/osc. freq. ratio |
eunkyoungkim | 0:6e799e373101 | 30 | send_cmd(0x80); |
eunkyoungkim | 0:6e799e373101 | 31 | send_cmd(0xa8); // multiplex ation mode: 63 |
eunkyoungkim | 0:6e799e373101 | 32 | send_cmd(0x3f); |
eunkyoungkim | 0:6e799e373101 | 33 | send_cmd(0xd3); // set display offset |
eunkyoungkim | 0:6e799e373101 | 34 | send_cmd(0x00); |
eunkyoungkim | 0:6e799e373101 | 35 | send_cmd(0x40); // set display start line |
eunkyoungkim | 0:6e799e373101 | 36 | send_cmd(0x8d); // set display offset |
eunkyoungkim | 0:6e799e373101 | 37 | send_cmd(0x14); |
eunkyoungkim | 0:6e799e373101 | 38 | send_cmd(0xa1); // segment remap |
eunkyoungkim | 0:6e799e373101 | 39 | send_cmd(0xc8); // set COM output scan direction |
eunkyoungkim | 0:6e799e373101 | 40 | send_cmd(0xda); // common pads hardware: alternative |
eunkyoungkim | 0:6e799e373101 | 41 | send_cmd(0x12); |
eunkyoungkim | 0:6e799e373101 | 42 | send_cmd(0x81); // contrast control |
eunkyoungkim | 0:6e799e373101 | 43 | send_cmd(0xcf); |
eunkyoungkim | 0:6e799e373101 | 44 | send_cmd(0xd9); // set pre-charge period |
eunkyoungkim | 0:6e799e373101 | 45 | send_cmd(0xf1); |
eunkyoungkim | 0:6e799e373101 | 46 | send_cmd(0xdb); // VCOM deselect level mode |
eunkyoungkim | 0:6e799e373101 | 47 | send_cmd(0x40); // set vcomh = 0.83 * VCC |
eunkyoungkim | 0:6e799e373101 | 48 | send_cmd(0xa4); // set entire display on/off |
eunkyoungkim | 0:6e799e373101 | 49 | send_cmd(0xa6); // set normal display |
eunkyoungkim | 0:6e799e373101 | 50 | send_cmd(0xaf); // set display on |
eunkyoungkim | 0:6e799e373101 | 51 | } |
eunkyoungkim | 0:6e799e373101 | 52 | |
eunkyoungkim | 0:6e799e373101 | 53 | // set position (x, 8*y) |
eunkyoungkim | 0:6e799e373101 | 54 | void locate(int x, int y){ |
eunkyoungkim | 0:6e799e373101 | 55 | send_cmd(0xb0+y); |
eunkyoungkim | 0:6e799e373101 | 56 | send_cmd(((x&0xf0)>>4)|0x10); |
eunkyoungkim | 0:6e799e373101 | 57 | send_cmd((x&0x0f)|0x01); |
eunkyoungkim | 0:6e799e373101 | 58 | } |
eunkyoungkim | 0:6e799e373101 | 59 | |
eunkyoungkim | 0:6e799e373101 | 60 | void cls(void){ |
eunkyoungkim | 0:6e799e373101 | 61 | int x, y; |
eunkyoungkim | 0:6e799e373101 | 62 | for(y = 0; y < 8; y++){ |
eunkyoungkim | 0:6e799e373101 | 63 | locate(0, y); |
eunkyoungkim | 0:6e799e373101 | 64 | for(x = 0; x < 128; x++) send_data(0x00); |
eunkyoungkim | 0:6e799e373101 | 65 | } |
eunkyoungkim | 0:6e799e373101 | 66 | } |
eunkyoungkim | 0:6e799e373101 | 67 | |
eunkyoungkim | 0:6e799e373101 | 68 | |
eunkyoungkim | 0:6e799e373101 | 69 | |
eunkyoungkim | 0:6e799e373101 | 70 | void OLED_ShowStr(unsigned char x, unsigned char y, char ch[], unsigned char TextSize) |
eunkyoungkim | 0:6e799e373101 | 71 | { |
eunkyoungkim | 0:6e799e373101 | 72 | unsigned char c = 0,i = 0,j = 0; |
eunkyoungkim | 0:6e799e373101 | 73 | switch(TextSize) |
eunkyoungkim | 0:6e799e373101 | 74 | { |
eunkyoungkim | 0:6e799e373101 | 75 | case 1: |
eunkyoungkim | 0:6e799e373101 | 76 | { |
eunkyoungkim | 0:6e799e373101 | 77 | while(ch[j] != '\0') |
eunkyoungkim | 0:6e799e373101 | 78 | { |
eunkyoungkim | 0:6e799e373101 | 79 | c = ch[j] - 32; |
eunkyoungkim | 0:6e799e373101 | 80 | if(x > 126) |
eunkyoungkim | 0:6e799e373101 | 81 | { |
eunkyoungkim | 0:6e799e373101 | 82 | x = 0; |
eunkyoungkim | 0:6e799e373101 | 83 | y++; |
eunkyoungkim | 0:6e799e373101 | 84 | } |
eunkyoungkim | 0:6e799e373101 | 85 | locate(x,y); |
eunkyoungkim | 0:6e799e373101 | 86 | for(i=0;i<6;i++) |
eunkyoungkim | 0:6e799e373101 | 87 | send_data(F6x8[c][i]); |
eunkyoungkim | 0:6e799e373101 | 88 | x += 6; |
eunkyoungkim | 0:6e799e373101 | 89 | j++; |
eunkyoungkim | 0:6e799e373101 | 90 | } |
eunkyoungkim | 0:6e799e373101 | 91 | }break; |
eunkyoungkim | 0:6e799e373101 | 92 | case 2: |
eunkyoungkim | 0:6e799e373101 | 93 | { |
eunkyoungkim | 0:6e799e373101 | 94 | while(ch[j] != '\0') |
eunkyoungkim | 0:6e799e373101 | 95 | { |
eunkyoungkim | 0:6e799e373101 | 96 | c = ch[j] - 32; |
eunkyoungkim | 0:6e799e373101 | 97 | if(x > 120) |
eunkyoungkim | 0:6e799e373101 | 98 | { |
eunkyoungkim | 0:6e799e373101 | 99 | x = 0; |
eunkyoungkim | 0:6e799e373101 | 100 | y++; |
eunkyoungkim | 0:6e799e373101 | 101 | } |
eunkyoungkim | 0:6e799e373101 | 102 | locate(x,y); |
eunkyoungkim | 0:6e799e373101 | 103 | for(i=0;i<8;i++) |
eunkyoungkim | 0:6e799e373101 | 104 | send_data(F8X16[c*16+i]); |
eunkyoungkim | 0:6e799e373101 | 105 | locate(x,y+1); |
eunkyoungkim | 0:6e799e373101 | 106 | for(i=0;i<8;i++) |
eunkyoungkim | 0:6e799e373101 | 107 | send_data(F8X16[c*16+i+8]); |
eunkyoungkim | 0:6e799e373101 | 108 | x += 8; |
eunkyoungkim | 0:6e799e373101 | 109 | j++; |
eunkyoungkim | 0:6e799e373101 | 110 | } |
eunkyoungkim | 0:6e799e373101 | 111 | }break; |
eunkyoungkim | 0:6e799e373101 | 112 | } |
eunkyoungkim | 0:6e799e373101 | 113 | } |
eunkyoungkim | 0:6e799e373101 | 114 | void OLED_DrawBMP(unsigned char x0, |
eunkyoungkim | 0:6e799e373101 | 115 | unsigned char y0,unsigned char x1, |
eunkyoungkim | 0:6e799e373101 | 116 | unsigned char y1,unsigned char BMP[]) |
eunkyoungkim | 0:6e799e373101 | 117 | { |
eunkyoungkim | 0:6e799e373101 | 118 | unsigned int j=0; |
eunkyoungkim | 0:6e799e373101 | 119 | unsigned char x,y; |
eunkyoungkim | 0:6e799e373101 | 120 | |
eunkyoungkim | 0:6e799e373101 | 121 | if(y1%8==0) |
eunkyoungkim | 0:6e799e373101 | 122 | y = y1/8; |
eunkyoungkim | 0:6e799e373101 | 123 | else |
eunkyoungkim | 0:6e799e373101 | 124 | y = y1/8 + 1; |
eunkyoungkim | 0:6e799e373101 | 125 | for(y=y0;y<y1;y++) |
eunkyoungkim | 0:6e799e373101 | 126 | { |
eunkyoungkim | 0:6e799e373101 | 127 | locate(x0,y); |
eunkyoungkim | 0:6e799e373101 | 128 | for(x=x0;x<x1;x++) |
eunkyoungkim | 0:6e799e373101 | 129 | { |
eunkyoungkim | 0:6e799e373101 | 130 | send_data(BMP[j++]); |
eunkyoungkim | 0:6e799e373101 | 131 | } |
eunkyoungkim | 0:6e799e373101 | 132 | } |
eunkyoungkim | 0:6e799e373101 | 133 | } |
eunkyoungkim | 0:6e799e373101 | 134 | //==========================================================// |
eunkyoungkim | 0:6e799e373101 | 135 | // Prints a display big number (96 bytes) in coordinates X Y, |
eunkyoungkim | 0:6e799e373101 | 136 | // being multiples of 8. This means we have 16 COLS (0-15) |
eunkyoungkim | 0:6e799e373101 | 137 | // and 8 ROWS (0-7). |
eunkyoungkim | 0:6e799e373101 | 138 | void printBigNumber(unsigned char s, int x, int y) |
eunkyoungkim | 0:6e799e373101 | 139 | { |
eunkyoungkim | 0:6e799e373101 | 140 | locate(x,y); |
eunkyoungkim | 0:6e799e373101 | 141 | int salto=0; |
eunkyoungkim | 0:6e799e373101 | 142 | for(int i=0; i<96; i++) { |
eunkyoungkim | 0:6e799e373101 | 143 | if(s == ' ') { |
eunkyoungkim | 0:6e799e373101 | 144 | send_data(0); |
eunkyoungkim | 0:6e799e373101 | 145 | } else |
eunkyoungkim | 0:6e799e373101 | 146 | send_data(bigNumbers[s-0x30][i]); |
eunkyoungkim | 0:6e799e373101 | 147 | |
eunkyoungkim | 0:6e799e373101 | 148 | if(salto == 23) { |
eunkyoungkim | 0:6e799e373101 | 149 | salto = 0; |
eunkyoungkim | 0:6e799e373101 | 150 | x++; |
eunkyoungkim | 0:6e799e373101 | 151 | locate(x,y); |
eunkyoungkim | 0:6e799e373101 | 152 | } else { |
eunkyoungkim | 0:6e799e373101 | 153 | salto++; |
eunkyoungkim | 0:6e799e373101 | 154 | } |
eunkyoungkim | 0:6e799e373101 | 155 | } |
eunkyoungkim | 0:6e799e373101 | 156 | } |
eunkyoungkim | 0:6e799e373101 | 157 | void printBigTime(char *s) |
eunkyoungkim | 0:6e799e373101 | 158 | { |
eunkyoungkim | 0:6e799e373101 | 159 | |
eunkyoungkim | 0:6e799e373101 | 160 | int y=0; |
eunkyoungkim | 0:6e799e373101 | 161 | int lon = strlen(s); |
eunkyoungkim | 0:6e799e373101 | 162 | if(lon == 6) { |
eunkyoungkim | 0:6e799e373101 | 163 | y = 0; |
eunkyoungkim | 0:6e799e373101 | 164 | } else if (lon == 5) { |
eunkyoungkim | 0:6e799e373101 | 165 | y = 3; |
eunkyoungkim | 0:6e799e373101 | 166 | } else if (lon == 4) { |
eunkyoungkim | 0:6e799e373101 | 167 | y = 6; |
eunkyoungkim | 0:6e799e373101 | 168 | } |
eunkyoungkim | 0:6e799e373101 | 169 | else if(lon == 3) { |
eunkyoungkim | 0:6e799e373101 | 170 | y = 9; |
eunkyoungkim | 0:6e799e373101 | 171 | } else if (lon == 2) { |
eunkyoungkim | 0:6e799e373101 | 172 | y = 12; |
eunkyoungkim | 0:6e799e373101 | 173 | } else if (lon == 1) { |
eunkyoungkim | 0:6e799e373101 | 174 | y = 15; |
eunkyoungkim | 0:6e799e373101 | 175 | } |
eunkyoungkim | 0:6e799e373101 | 176 | |
eunkyoungkim | 0:6e799e373101 | 177 | int x = 2; |
eunkyoungkim | 0:6e799e373101 | 178 | while(*s) { |
eunkyoungkim | 0:6e799e373101 | 179 | printBigNumber(*s, x, y); |
eunkyoungkim | 0:6e799e373101 | 180 | |
eunkyoungkim | 0:6e799e373101 | 181 | y+=3; |
eunkyoungkim | 0:6e799e373101 | 182 | x=2; |
eunkyoungkim | 0:6e799e373101 | 183 | locate(x,y); |
eunkyoungkim | 0:6e799e373101 | 184 | *s++; |
eunkyoungkim | 0:6e799e373101 | 185 | } |
eunkyoungkim | 0:6e799e373101 | 186 | } |
eunkyoungkim | 0:6e799e373101 | 187 | void LED_P23x32Str(unsigned char x, unsigned char y, char ch[]) |
eunkyoungkim | 0:6e799e373101 | 188 | { |
eunkyoungkim | 0:6e799e373101 | 189 | unsigned char c = 0, i = 0, j = 0, k = 0; |
eunkyoungkim | 0:6e799e373101 | 190 | while (ch[j] != '\0') |
eunkyoungkim | 0:6e799e373101 | 191 | { |
eunkyoungkim | 0:6e799e373101 | 192 | c = ch[j] - '0'; |
eunkyoungkim | 0:6e799e373101 | 193 | if (x > 120) { |
eunkyoungkim | 0:6e799e373101 | 194 | x = 0; |
eunkyoungkim | 0:6e799e373101 | 195 | y++; |
eunkyoungkim | 0:6e799e373101 | 196 | } |
eunkyoungkim | 0:6e799e373101 | 197 | |
eunkyoungkim | 0:6e799e373101 | 198 | for (k = 0; k < 4; k++) { |
eunkyoungkim | 0:6e799e373101 | 199 | locate(x, y + k); |
eunkyoungkim | 0:6e799e373101 | 200 | for (i = 0; i < 23; i++) { |
eunkyoungkim | 0:6e799e373101 | 201 | send_data(F23x32[c * 23 * 4 + k * 23 + i]); |
eunkyoungkim | 0:6e799e373101 | 202 | } |
eunkyoungkim | 0:6e799e373101 | 203 | } |
eunkyoungkim | 0:6e799e373101 | 204 | x += 25; |
eunkyoungkim | 0:6e799e373101 | 205 | j++; |
eunkyoungkim | 0:6e799e373101 | 206 | } |
eunkyoungkim | 0:6e799e373101 | 207 | } |
eunkyoungkim | 0:6e799e373101 | 208 | |
eunkyoungkim | 0:6e799e373101 | 209 |