Kai Liu / Mbed 2 deprecated LPC1114_EBadge

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 }