E-Paper Device (EPD) based MiniNote module, powered by mbed on LPC1114FBD48. Shared in public domain with enclosure in 3D step format, hardware interface compatible with microBUS interface. Anyone can contribute on this project.
ssd1606.cpp
00001 /* 00002 * Code ported from EDP-MSP430 and IAR-STM32-SK 00003 * Allan K Liu 00004 */ 00005 00006 #include "mbed.h" 00007 #include "ssd1606.h" 00008 //#include "font.h" 00009 #include "rom_image.h" 00010 #include "rom_font.h" 00011 00012 #include <stdarg.h> 00013 00014 const unsigned char init_data[]={ 00015 0x82,0x00,0x00,0x00,0xAA,0x00,0x00,0x00, 00016 0xAA,0xAA,0x00,0x00,0xAA,0xAA,0xAA,0x00, 00017 0x55,0xAA,0xAA,0x00,0x55,0x55,0x55,0x55, 00018 0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55, 00019 0xAA,0xAA,0xAA,0xAA,0x15,0x15,0x15,0x15, 00020 0x05,0x05,0x05,0x05,0x01,0x01,0x01,0x01, 00021 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 00022 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 00023 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 00024 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 00025 0x41,0x45,0xF1,0xFF,0x5F,0x55,0x01,0x00, 00026 0x00,0x00,}; 00027 00028 00029 SSD1606::SSD1606(PinName cs, PinName rst, PinName dc, PinName busy, PinName data, PinName clk) 00030 : _cs(cs), 00031 _reset(rst), 00032 _dc(dc), 00033 _busy(busy), 00034 _data(data), 00035 _clk(clk) 00036 { 00037 _cursor_x = 0; 00038 _cursor_y = 0; 00039 _cs = DigitalOut(cs); 00040 _reset = DigitalOut(rst); 00041 _dc = DigitalOut(dc); 00042 _busy = DigitalIn(busy); 00043 _data = DigitalOut(data); 00044 _clk = DigitalOut(clk); 00045 } 00046 00047 void SSD1606::reset() 00048 { 00049 _reset = 1; 00050 wait_ms(1); 00051 _reset = 0; 00052 wait_ms(1); 00053 _reset = 1; 00054 wait_ms(1); 00055 } 00056 00057 void SSD1606::read_busy() 00058 { 00059 while(1) 00060 { 00061 asm("nop"); 00062 if(_busy==0) 00063 break; 00064 } 00065 } 00066 00067 void SSD1606::initialize() 00068 { 00069 _send_command(0x10); 00070 _send_data(0x00); 00071 #ifdef MODE3 00072 _send_command(0x11); 00073 _send_data(0x03); 00074 _send_command(0x44); 00075 _send_data(0x00); 00076 _send_data(0x11); 00077 _send_command(0x45); 00078 _send_data(0x00); 00079 _send_data(0xAB); 00080 _send_command(0x4E); 00081 _send_data(0x00); 00082 _send_command(0x4F); 00083 _send_data(0x00); 00084 #endif 00085 #ifdef MODE2 00086 _send_command(0x11); 00087 _send_data(0x02); 00088 _send_command(0x44); 00089 _send_data(0x11); 00090 _send_data(0x00); 00091 _send_command(0x45); 00092 _send_data(0x00); 00093 _send_data(0xAB); 00094 _send_command(0x4E); 00095 _send_data(0x11); 00096 _send_command(0x4F); 00097 _send_data(0x00); 00098 #endif 00099 #ifdef MODE1 00100 _send_command(0x11); 00101 _send_data(0x01); 00102 _send_command(0x44); 00103 _send_data(0x00); 00104 _send_data(0x11); 00105 _send_command(0x45); 00106 _send_data(0xAB); 00107 _send_data(0x00); 00108 _send_command(0x4E); 00109 _send_data(0x00); 00110 _send_command(0x4F); 00111 _send_data(0xAB); 00112 #endif 00113 #ifdef MODE0 00114 _send_command(0x11); 00115 _send_data(0x00); 00116 _send_command(0x44); 00117 _send_data(0x11); 00118 _send_data(0x00); 00119 _send_command(0x45); 00120 _send_data(0xAB); 00121 _send_data(0x00); 00122 _send_command(0x4E); 00123 _send_data(0x11); 00124 _send_command(0x4F); 00125 _send_data(0xAB); 00126 #endif 00127 _send_command(0xF0); 00128 _send_data(0x1F); 00129 _send_command(0x21); 00130 _send_data(0x03); 00131 _send_command(0x2C); 00132 _send_data(0xA0); 00133 _send_command(0x3C); 00134 _send_data(0x63); 00135 _send_command(0x22); 00136 _send_data(0xC4); 00137 00138 set_lut(); 00139 } 00140 00141 00142 00143 void SSD1606::rom_image(const unsigned char *bitmap) 00144 { 00145 int i=0; 00146 _send_command(0x24); 00147 00148 for (i=0; i <3096; i++) 00149 _send_data(bitmap[i]); 00150 00151 _send_command(0x20); 00152 wait_ms(1); 00153 read_busy(); 00154 } 00155 00156 void SSD1606::update(void) 00157 { 00158 int i = 0; 00159 _send_command(0x24); 00160 00161 for (i=0; i<3096; i++) 00162 //_send_data(_screen[i]); 00163 //_send_data(buf[i]); 00164 00165 wait_ms(1); 00166 read_busy(); 00167 } 00168 00169 /* Hardware Switch off Power Supply for EPD mode (MOSFET) 00170 */ 00171 void SSD1606::off() 00172 { 00173 } 00174 00175 void SSD1606::deepsleep() 00176 { 00177 } 00178 00179 void SSD1606::sleep() 00180 { 00181 _send_command(0x10); 00182 _send_data(0x01); 00183 } 00184 00185 void SSD1606::wake() 00186 { 00187 _send_command(0x10); 00188 _send_data(0x00); 00189 } 00190 00191 void SSD1606::set_command_between_images() 00192 { 00193 _send_command(0x22); 00194 _send_data(0xC7); 00195 _send_command(0x21); 00196 _send_data(0x03); 00197 } 00198 00199 void SSD1606::clear() 00200 { 00201 for (int i=0; i<3096; i++) 00202 _send_data(0xFF); 00203 _cursor_x = 0; 00204 _cursor_y = 0; 00205 } 00206 00207 void SSD1606::_vspi_write(unsigned char value) 00208 { 00209 unsigned char tmp; 00210 tmp = value; 00211 00212 for (int i=0; i<8; i++) 00213 { 00214 if(tmp & 0x80) 00215 { 00216 _data = 1; 00217 }else{ 00218 _data = 0; 00219 } 00220 _clk = 1; 00221 wait_us(SPI_BUS_DELAY); 00222 _clk = 0; 00223 tmp = tmp<<1; 00224 } 00225 } 00226 00227 void SSD1606::_send_command(unsigned char code) 00228 { 00229 _cs = 1; wait_us(SPI_BUS_DELAY); 00230 _cs = 0; wait_us(SPI_BUS_DELAY); // Maybe _cs set low before _dc set low? 00231 _clk = 0; wait_us(SPI_BUS_DELAY); 00232 _dc = 0; wait_us(SPI_BUS_DELAY); 00233 00234 //_spi.write(code); 00235 _vspi_write(code); 00236 wait_us(SPI_BUS_DELAY); 00237 _cs = 1; wait_us(SPI_BUS_DELAY); 00238 } 00239 00240 void SSD1606::_send_data(unsigned char value) 00241 { 00242 _cs = 1; wait_us(SPI_BUS_DELAY); 00243 _cs = 0; wait_us(SPI_BUS_DELAY); 00244 _clk = 0; wait_us(SPI_BUS_DELAY); 00245 _dc = 1; wait_us(SPI_BUS_DELAY); // Maybe _cs set low before _dc set high? 00246 //_spi.write(value); 00247 _vspi_write(value); 00248 wait_us(SPI_BUS_DELAY); 00249 _cs = 1; wait_us(SPI_BUS_DELAY); 00250 } 00251 00252 void SSD1606::set_lut(void) 00253 { 00254 unsigned char i; 00255 _send_command(0x32); 00256 for(i=0; i<90; i++) 00257 { 00258 _send_data(init_data[i]); 00259 } 00260 } 00261 00262 void SSD1606::_draw_pattern(unsigned char value, unsigned int pix) 00263 { 00264 int i = 0; 00265 unsigned char x, y; 00266 for (x=0; x<SSD1606_WIDTH; x++) 00267 { 00268 for (y=0; y<COLBUF_SIZE; y++) 00269 { 00270 i++; 00271 if (i<pix) 00272 _send_data(value); 00273 else 00274 _send_data(0xFF); 00275 } 00276 } 00277 } 00278 00279 void SSD1606::test_image(unsigned char idx) 00280 { 00281 switch(idx){ 00282 case TEST_GREY1: 00283 break; 00284 case TEST_GREY2: 00285 break; 00286 case TEST_BLK: 00287 break; 00288 case TEST_WHT: 00289 clear(); 00290 break; 00291 case TEST_HALF: 00292 break; 00293 case TEST_STRIP1: 00294 break; 00295 case TEST_STRIP2: 00296 break; 00297 default: 00298 break; 00299 } 00300 } 00301 00302 00303 void SSD1606::set_font(unsigned char *font, unsigned char width) 00304 { 00305 } 00306 00307 void SSD1606::_send_data_1bpp(unsigned char value) 00308 { 00309 unsigned char temp; 00310 temp = EPD_2bpp_LUT[value & 0x0F]; 00311 _send_data(temp); 00312 temp = EPD_2bpp_LUT[value>>4 & 0x0F]; 00313 _send_data(temp); 00314 }
Generated on Mon Jul 18 2022 01:51:50 by 1.7.2