SSD1306(OLED) Figure Test
Dependencies: mbed
SSD1306.h
00001 #include "data.h" 00002 #define addr (0x78) 00003 00004 #if defined(TARGET_WIZwiki_W7500) 00005 #define SDA PA_10 00006 #define SCL PA_9 00007 #endif 00008 00009 I2C i2c(SDA, SCL); 00010 00011 void send_cmd(uint8_t cmd){ 00012 char c[2] ={0x00,cmd}; 00013 00014 i2c.write(addr,c,2,1); 00015 00016 } 00017 00018 void send_data(uint8_t data){ 00019 char c[2] = {0x40,data}; 00020 i2c.write(addr,c,2,1); 00021 00022 } 00023 00024 void init(void) 00025 { 00026 wait_ms(5); // TBD 00027 00028 send_cmd(0xae); // display off 00029 send_cmd(0xd5); // display divide ratio/osc. freq. ratio 00030 send_cmd(0x80); 00031 send_cmd(0xa8); // multiplex ation mode: 63 00032 send_cmd(0x3f); 00033 send_cmd(0xd3); // set display offset 00034 send_cmd(0x00); 00035 send_cmd(0x40); // set display start line 00036 send_cmd(0x8d); // set display offset 00037 send_cmd(0x14); 00038 send_cmd(0xa1); // segment remap 00039 send_cmd(0xc8); // set COM output scan direction 00040 send_cmd(0xda); // common pads hardware: alternative 00041 send_cmd(0x12); 00042 send_cmd(0x81); // contrast control 00043 send_cmd(0xcf); 00044 send_cmd(0xd9); // set pre-charge period 00045 send_cmd(0xf1); 00046 send_cmd(0xdb); // VCOM deselect level mode 00047 send_cmd(0x40); // set vcomh = 0.83 * VCC 00048 send_cmd(0xa4); // set entire display on/off 00049 send_cmd(0xa6); // set normal display 00050 send_cmd(0xaf); // set display on 00051 } 00052 00053 // set position (x, 8*y) 00054 void locate(int x, int y){ 00055 send_cmd(0xb0+y); 00056 send_cmd(((x&0xf0)>>4)|0x10); 00057 send_cmd((x&0x0f)|0x01); 00058 } 00059 00060 void cls(void){ 00061 int x, y; 00062 for(y = 0; y < 8; y++){ 00063 locate(0, y); 00064 for(x = 0; x < 128; x++) send_data(0x00); 00065 } 00066 } 00067 00068 00069 00070 void OLED_ShowStr(unsigned char x, unsigned char y, char ch[], unsigned char TextSize) 00071 { 00072 unsigned char c = 0,i = 0,j = 0; 00073 switch(TextSize) 00074 { 00075 case 1: 00076 { 00077 while(ch[j] != '\0') 00078 { 00079 c = ch[j] - 32; 00080 if(x > 126) 00081 { 00082 x = 0; 00083 y++; 00084 } 00085 locate(x,y); 00086 for(i=0;i<6;i++) 00087 send_data(F6x8[c][i]); 00088 x += 6; 00089 j++; 00090 } 00091 }break; 00092 case 2: 00093 { 00094 while(ch[j] != '\0') 00095 { 00096 c = ch[j] - 32; 00097 if(x > 120) 00098 { 00099 x = 0; 00100 y++; 00101 } 00102 locate(x,y); 00103 for(i=0;i<8;i++) 00104 send_data(F8X16[c*16+i]); 00105 locate(x,y+1); 00106 for(i=0;i<8;i++) 00107 send_data(F8X16[c*16+i+8]); 00108 x += 8; 00109 j++; 00110 } 00111 }break; 00112 } 00113 } 00114 void OLED_DrawBMP(unsigned char x0, 00115 unsigned char y0,unsigned char x1, 00116 unsigned char y1,unsigned char BMP[]) 00117 { 00118 unsigned int j=0; 00119 unsigned char x,y; 00120 00121 if(y1%8==0) 00122 y = y1/8; 00123 else 00124 y = y1/8 + 1; 00125 for(y=y0;y<y1;y++) 00126 { 00127 locate(x0,y); 00128 for(x=x0;x<x1;x++) 00129 { 00130 send_data(BMP[j++]); 00131 } 00132 } 00133 } 00134 00135 00136 void OLED_Showchar(unsigned char x, unsigned char y, char ch[], unsigned char TextSize) 00137 { 00138 unsigned char c = 0,i = 0,j = 0; 00139 switch(TextSize) 00140 { 00141 case 1: 00142 { 00143 c = ch[j] - 32; 00144 if(x > 126) 00145 { 00146 x = 0; 00147 y++; 00148 } 00149 locate(x,y); 00150 for(i=0;i<6;i++) 00151 send_data(F6x8[c][i]); 00152 x += 6; 00153 j++; 00154 00155 }break; 00156 case 2: 00157 { 00158 c = ch[j] - 32; 00159 if(x > 120) 00160 { 00161 x = 0; 00162 y++; 00163 } 00164 locate(x,y); 00165 for(i=0;i<8;i++) 00166 send_data(F8X16[c*16+i]); 00167 locate(x,y+1); 00168 for(i=0;i<8;i++) 00169 send_data(F8X16[c*16+i+8]); 00170 x += 8; 00171 j++; 00172 00173 }break; 00174 } 00175 } 00176 00177 //==========================================================// 00178 // Prints a display big number (96 bytes) in coordinates X Y, 00179 // being multiples of 8. This means we have 16 COLS (0-15) 00180 // and 8 ROWS (0-7). 00181 void printBigNumber(unsigned char s, int x, int y) 00182 { 00183 locate(x,y); 00184 int salto=0; 00185 for(int i=0; i<96; i++) { 00186 if(s == ' ') { 00187 send_data(0); 00188 } else 00189 send_data(bigNumbers[s-0x30][i]); 00190 00191 if(salto == 23) { 00192 salto = 0; 00193 x++; 00194 locate(x,y); 00195 } else { 00196 salto++; 00197 } 00198 } 00199 } 00200 void printBigTime(char *s) 00201 { 00202 00203 int y=0; 00204 int lon = strlen(s); 00205 if(lon == 6) { 00206 y = 0; 00207 } else if (lon == 5) { 00208 y = 3; 00209 } else if (lon == 4) { 00210 y = 6; 00211 } 00212 else if(lon == 3) { 00213 y = 9; 00214 } else if (lon == 2) { 00215 y = 12; 00216 } else if (lon == 1) { 00217 y = 15; 00218 } 00219 00220 int x = 2; 00221 while(*s) { 00222 printBigNumber(*s, x, y); 00223 00224 y+=3; 00225 x=2; 00226 locate(x,y); 00227 *s++; 00228 } 00229 } 00230 void LED_P23x32Str(unsigned char x, unsigned char y, char ch[]) 00231 { 00232 unsigned char c = 0, i = 0, j = 0, k = 0; 00233 while (ch[j] != '\0') 00234 { 00235 c = ch[j] - '0'; 00236 if (x > 120) { 00237 x = 0; 00238 y++; 00239 } 00240 00241 for (k = 0; k < 4; k++) { 00242 locate(x, y + k); 00243 for (i = 0; i < 23; i++) { 00244 send_data(F23x32[c * 23 * 4 + k * 23 + i]); 00245 } 00246 } 00247 x += 25; 00248 j++; 00249 } 00250 } 00251 00252
Generated on Thu Jul 21 2022 05:54:54 by 1.7.2