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.

Dependencies:   mbed _24LCXXX

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ssd1606.cpp Source File

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 }