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

E-Badge MiniNote Project on mbed/NXP LPC1114 platform

Committer:
allankliu
Date:
Wed Jun 11 09:14:00 2014 +0000
Revision:
4:5032c106eea1
Parent:
3:1fa000d4da94
Tested on hardware.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
allankliu 2:bb9f154ea2f4 1 /*
allankliu 2:bb9f154ea2f4 2 * Code ported from EDP-MSP430 and IAR-STM32-SK
allankliu 2:bb9f154ea2f4 3 * Allan K Liu
allankliu 2:bb9f154ea2f4 4 */
allankliu 2:bb9f154ea2f4 5
allankliu 0:33994cfad0c2 6 #include "mbed.h"
allankliu 0:33994cfad0c2 7 #include "ssd1606.h"
allankliu 2:bb9f154ea2f4 8 //#include "font.h"
allankliu 2:bb9f154ea2f4 9 #include "rom_image.h"
allankliu 2:bb9f154ea2f4 10 #include "rom_font.h"
allankliu 0:33994cfad0c2 11
allankliu 0:33994cfad0c2 12 #include <stdarg.h>
allankliu 0:33994cfad0c2 13
allankliu 0:33994cfad0c2 14 const unsigned char init_data[]={
allankliu 0:33994cfad0c2 15 0x82,0x00,0x00,0x00,0xAA,0x00,0x00,0x00,
allankliu 0:33994cfad0c2 16 0xAA,0xAA,0x00,0x00,0xAA,0xAA,0xAA,0x00,
allankliu 0:33994cfad0c2 17 0x55,0xAA,0xAA,0x00,0x55,0x55,0x55,0x55,
allankliu 0:33994cfad0c2 18 0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,
allankliu 0:33994cfad0c2 19 0xAA,0xAA,0xAA,0xAA,0x15,0x15,0x15,0x15,
allankliu 0:33994cfad0c2 20 0x05,0x05,0x05,0x05,0x01,0x01,0x01,0x01,
allankliu 0:33994cfad0c2 21 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
allankliu 0:33994cfad0c2 22 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
allankliu 0:33994cfad0c2 23 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
allankliu 0:33994cfad0c2 24 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
allankliu 0:33994cfad0c2 25 0x41,0x45,0xF1,0xFF,0x5F,0x55,0x01,0x00,
allankliu 0:33994cfad0c2 26 0x00,0x00,};
allankliu 0:33994cfad0c2 27
allankliu 0:33994cfad0c2 28
allankliu 2:bb9f154ea2f4 29 SSD1606::SSD1606(PinName cs, PinName rst, PinName dc, PinName busy, PinName data, PinName clk)
allankliu 2:bb9f154ea2f4 30 : _cs(cs),
allankliu 2:bb9f154ea2f4 31 _reset(rst),
allankliu 2:bb9f154ea2f4 32 _dc(dc),
allankliu 2:bb9f154ea2f4 33 _busy(busy),
allankliu 2:bb9f154ea2f4 34 _data(data),
allankliu 2:bb9f154ea2f4 35 _clk(clk)
allankliu 0:33994cfad0c2 36 {
allankliu 2:bb9f154ea2f4 37 _cursor_x = 0;
allankliu 2:bb9f154ea2f4 38 _cursor_y = 0;
allankliu 2:bb9f154ea2f4 39 _cs = DigitalOut(cs);
allankliu 2:bb9f154ea2f4 40 _reset = DigitalOut(rst);
allankliu 2:bb9f154ea2f4 41 _dc = DigitalOut(dc);
allankliu 2:bb9f154ea2f4 42 _busy = DigitalIn(busy);
allankliu 2:bb9f154ea2f4 43 _data = DigitalOut(data);
allankliu 2:bb9f154ea2f4 44 _clk = DigitalOut(clk);
allankliu 0:33994cfad0c2 45 }
allankliu 0:33994cfad0c2 46
allankliu 0:33994cfad0c2 47 void SSD1606::reset()
allankliu 0:33994cfad0c2 48 {
allankliu 0:33994cfad0c2 49 _reset = 1;
allankliu 2:bb9f154ea2f4 50 wait_ms(1);
allankliu 0:33994cfad0c2 51 _reset = 0;
allankliu 3:1fa000d4da94 52 wait_ms(1);
allankliu 0:33994cfad0c2 53 _reset = 1;
allankliu 3:1fa000d4da94 54 wait_ms(1);
allankliu 2:bb9f154ea2f4 55 }
allankliu 2:bb9f154ea2f4 56
allankliu 2:bb9f154ea2f4 57 void SSD1606::read_busy()
allankliu 2:bb9f154ea2f4 58 {
allankliu 3:1fa000d4da94 59 while(1)
allankliu 3:1fa000d4da94 60 {
allankliu 3:1fa000d4da94 61 asm("nop");
allankliu 3:1fa000d4da94 62 if(_busy==0)
allankliu 3:1fa000d4da94 63 break;
allankliu 2:bb9f154ea2f4 64 }
allankliu 0:33994cfad0c2 65 }
allankliu 0:33994cfad0c2 66
allankliu 0:33994cfad0c2 67 void SSD1606::initialize()
allankliu 0:33994cfad0c2 68 {
allankliu 0:33994cfad0c2 69 _send_command(0x10);
allankliu 0:33994cfad0c2 70 _send_data(0x00);
allankliu 0:33994cfad0c2 71 #ifdef MODE3
allankliu 0:33994cfad0c2 72 _send_command(0x11);
allankliu 0:33994cfad0c2 73 _send_data(0x03);
allankliu 0:33994cfad0c2 74 _send_command(0x44);
allankliu 0:33994cfad0c2 75 _send_data(0x00);
allankliu 0:33994cfad0c2 76 _send_data(0x11);
allankliu 0:33994cfad0c2 77 _send_command(0x45);
allankliu 0:33994cfad0c2 78 _send_data(0x00);
allankliu 0:33994cfad0c2 79 _send_data(0xAB);
allankliu 0:33994cfad0c2 80 _send_command(0x4E);
allankliu 0:33994cfad0c2 81 _send_data(0x00);
allankliu 0:33994cfad0c2 82 _send_command(0x4F);
allankliu 0:33994cfad0c2 83 _send_data(0x00);
allankliu 0:33994cfad0c2 84 #endif
allankliu 0:33994cfad0c2 85 #ifdef MODE2
allankliu 0:33994cfad0c2 86 _send_command(0x11);
allankliu 0:33994cfad0c2 87 _send_data(0x02);
allankliu 0:33994cfad0c2 88 _send_command(0x44);
allankliu 0:33994cfad0c2 89 _send_data(0x11);
allankliu 0:33994cfad0c2 90 _send_data(0x00);
allankliu 0:33994cfad0c2 91 _send_command(0x45);
allankliu 0:33994cfad0c2 92 _send_data(0x00);
allankliu 0:33994cfad0c2 93 _send_data(0xAB);
allankliu 0:33994cfad0c2 94 _send_command(0x4E);
allankliu 0:33994cfad0c2 95 _send_data(0x11);
allankliu 0:33994cfad0c2 96 _send_command(0x4F);
allankliu 0:33994cfad0c2 97 _send_data(0x00);
allankliu 0:33994cfad0c2 98 #endif
allankliu 0:33994cfad0c2 99 #ifdef MODE1
allankliu 0:33994cfad0c2 100 _send_command(0x11);
allankliu 0:33994cfad0c2 101 _send_data(0x01);
allankliu 0:33994cfad0c2 102 _send_command(0x44);
allankliu 0:33994cfad0c2 103 _send_data(0x00);
allankliu 0:33994cfad0c2 104 _send_data(0x11);
allankliu 0:33994cfad0c2 105 _send_command(0x45);
allankliu 0:33994cfad0c2 106 _send_data(0xAB);
allankliu 0:33994cfad0c2 107 _send_data(0x00);
allankliu 0:33994cfad0c2 108 _send_command(0x4E);
allankliu 0:33994cfad0c2 109 _send_data(0x00);
allankliu 0:33994cfad0c2 110 _send_command(0x4F);
allankliu 0:33994cfad0c2 111 _send_data(0xAB);
allankliu 0:33994cfad0c2 112 #endif
allankliu 0:33994cfad0c2 113 #ifdef MODE0
allankliu 0:33994cfad0c2 114 _send_command(0x11);
allankliu 0:33994cfad0c2 115 _send_data(0x00);
allankliu 0:33994cfad0c2 116 _send_command(0x44);
allankliu 0:33994cfad0c2 117 _send_data(0x11);
allankliu 0:33994cfad0c2 118 _send_data(0x00);
allankliu 0:33994cfad0c2 119 _send_command(0x45);
allankliu 0:33994cfad0c2 120 _send_data(0xAB);
allankliu 0:33994cfad0c2 121 _send_data(0x00);
allankliu 0:33994cfad0c2 122 _send_command(0x4E);
allankliu 0:33994cfad0c2 123 _send_data(0x11);
allankliu 0:33994cfad0c2 124 _send_command(0x4F);
allankliu 0:33994cfad0c2 125 _send_data(0xAB);
allankliu 0:33994cfad0c2 126 #endif
allankliu 0:33994cfad0c2 127 _send_command(0xF0);
allankliu 0:33994cfad0c2 128 _send_data(0x1F);
allankliu 0:33994cfad0c2 129 _send_command(0x21);
allankliu 0:33994cfad0c2 130 _send_data(0x03);
allankliu 0:33994cfad0c2 131 _send_command(0x2C);
allankliu 0:33994cfad0c2 132 _send_data(0xA0);
allankliu 0:33994cfad0c2 133 _send_command(0x3C);
allankliu 0:33994cfad0c2 134 _send_data(0x63);
allankliu 0:33994cfad0c2 135 _send_command(0x22);
allankliu 0:33994cfad0c2 136 _send_data(0xC4);
allankliu 0:33994cfad0c2 137
allankliu 0:33994cfad0c2 138 set_lut();
allankliu 0:33994cfad0c2 139 }
allankliu 0:33994cfad0c2 140
allankliu 2:bb9f154ea2f4 141
allankliu 0:33994cfad0c2 142
allankliu 0:33994cfad0c2 143 void SSD1606::rom_image(const unsigned char *bitmap)
allankliu 0:33994cfad0c2 144 {
allankliu 2:bb9f154ea2f4 145 int i=0;
allankliu 0:33994cfad0c2 146 _send_command(0x24);
allankliu 0:33994cfad0c2 147
allankliu 0:33994cfad0c2 148 for (i=0; i <3096; i++)
allankliu 0:33994cfad0c2 149 _send_data(bitmap[i]);
allankliu 0:33994cfad0c2 150
allankliu 0:33994cfad0c2 151 _send_command(0x20);
allankliu 2:bb9f154ea2f4 152 wait_ms(1);
allankliu 2:bb9f154ea2f4 153 read_busy();
allankliu 0:33994cfad0c2 154 }
allankliu 0:33994cfad0c2 155
allankliu 2:bb9f154ea2f4 156 void SSD1606::update(void)
allankliu 0:33994cfad0c2 157 {
allankliu 2:bb9f154ea2f4 158 int i = 0;
allankliu 2:bb9f154ea2f4 159 _send_command(0x24);
allankliu 2:bb9f154ea2f4 160
allankliu 2:bb9f154ea2f4 161 for (i=0; i<3096; i++)
allankliu 2:bb9f154ea2f4 162 //_send_data(_screen[i]);
allankliu 2:bb9f154ea2f4 163 //_send_data(buf[i]);
allankliu 2:bb9f154ea2f4 164
allankliu 2:bb9f154ea2f4 165 wait_ms(1);
allankliu 2:bb9f154ea2f4 166 read_busy();
allankliu 0:33994cfad0c2 167 }
allankliu 0:33994cfad0c2 168
allankliu 2:bb9f154ea2f4 169 /* Hardware Switch off Power Supply for EPD mode (MOSFET)
allankliu 2:bb9f154ea2f4 170 */
allankliu 0:33994cfad0c2 171 void SSD1606::off()
allankliu 0:33994cfad0c2 172 {
allankliu 0:33994cfad0c2 173 }
allankliu 0:33994cfad0c2 174
allankliu 2:bb9f154ea2f4 175 void SSD1606::deepsleep()
allankliu 2:bb9f154ea2f4 176 {
allankliu 2:bb9f154ea2f4 177 }
allankliu 2:bb9f154ea2f4 178
allankliu 0:33994cfad0c2 179 void SSD1606::sleep()
allankliu 0:33994cfad0c2 180 {
allankliu 0:33994cfad0c2 181 _send_command(0x10);
allankliu 0:33994cfad0c2 182 _send_data(0x01);
allankliu 0:33994cfad0c2 183 }
allankliu 0:33994cfad0c2 184
allankliu 2:bb9f154ea2f4 185 void SSD1606::wake()
allankliu 2:bb9f154ea2f4 186 {
allankliu 2:bb9f154ea2f4 187 _send_command(0x10);
allankliu 2:bb9f154ea2f4 188 _send_data(0x00);
allankliu 2:bb9f154ea2f4 189 }
allankliu 2:bb9f154ea2f4 190
allankliu 0:33994cfad0c2 191 void SSD1606::set_command_between_images()
allankliu 0:33994cfad0c2 192 {
allankliu 0:33994cfad0c2 193 _send_command(0x22);
allankliu 0:33994cfad0c2 194 _send_data(0xC7);
allankliu 0:33994cfad0c2 195 _send_command(0x21);
allankliu 0:33994cfad0c2 196 _send_data(0x03);
allankliu 0:33994cfad0c2 197 }
allankliu 0:33994cfad0c2 198
allankliu 0:33994cfad0c2 199 void SSD1606::clear()
allankliu 0:33994cfad0c2 200 {
allankliu 3:1fa000d4da94 201 for (int i=0; i<3096; i++)
allankliu 2:bb9f154ea2f4 202 _send_data(0xFF);
allankliu 0:33994cfad0c2 203 _cursor_x = 0;
allankliu 0:33994cfad0c2 204 _cursor_y = 0;
allankliu 0:33994cfad0c2 205 }
allankliu 0:33994cfad0c2 206
allankliu 2:bb9f154ea2f4 207 void SSD1606::_vspi_write(unsigned char value)
allankliu 2:bb9f154ea2f4 208 {
allankliu 3:1fa000d4da94 209 unsigned char tmp;
allankliu 3:1fa000d4da94 210 tmp = value;
allankliu 3:1fa000d4da94 211
allankliu 2:bb9f154ea2f4 212 for (int i=0; i<8; i++)
allankliu 2:bb9f154ea2f4 213 {
allankliu 3:1fa000d4da94 214 if(tmp & 0x80)
allankliu 2:bb9f154ea2f4 215 {
allankliu 2:bb9f154ea2f4 216 _data = 1;
allankliu 2:bb9f154ea2f4 217 }else{
allankliu 2:bb9f154ea2f4 218 _data = 0;
allankliu 2:bb9f154ea2f4 219 }
allankliu 2:bb9f154ea2f4 220 _clk = 1;
allankliu 2:bb9f154ea2f4 221 wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 222 _clk = 0;
allankliu 3:1fa000d4da94 223 tmp = tmp<<1;
allankliu 2:bb9f154ea2f4 224 }
allankliu 2:bb9f154ea2f4 225 }
allankliu 2:bb9f154ea2f4 226
allankliu 0:33994cfad0c2 227 void SSD1606::_send_command(unsigned char code)
allankliu 0:33994cfad0c2 228 {
allankliu 2:bb9f154ea2f4 229 _cs = 1; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 230 _cs = 0; wait_us(SPI_BUS_DELAY); // Maybe _cs set low before _dc set low?
allankliu 2:bb9f154ea2f4 231 _clk = 0; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 232 _dc = 0; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 233
allankliu 2:bb9f154ea2f4 234 //_spi.write(code);
allankliu 2:bb9f154ea2f4 235 _vspi_write(code);
allankliu 2:bb9f154ea2f4 236 wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 237 _cs = 1; wait_us(SPI_BUS_DELAY);
allankliu 0:33994cfad0c2 238 }
allankliu 0:33994cfad0c2 239
allankliu 0:33994cfad0c2 240 void SSD1606::_send_data(unsigned char value)
allankliu 0:33994cfad0c2 241 {
allankliu 2:bb9f154ea2f4 242 _cs = 1; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 243 _cs = 0; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 244 _clk = 0; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 245 _dc = 1; wait_us(SPI_BUS_DELAY); // Maybe _cs set low before _dc set high?
allankliu 2:bb9f154ea2f4 246 //_spi.write(value);
allankliu 2:bb9f154ea2f4 247 _vspi_write(value);
allankliu 2:bb9f154ea2f4 248 wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 249 _cs = 1; wait_us(SPI_BUS_DELAY);
allankliu 0:33994cfad0c2 250 }
allankliu 0:33994cfad0c2 251
allankliu 0:33994cfad0c2 252 void SSD1606::set_lut(void)
allankliu 0:33994cfad0c2 253 {
allankliu 0:33994cfad0c2 254 unsigned char i;
allankliu 0:33994cfad0c2 255 _send_command(0x32);
allankliu 0:33994cfad0c2 256 for(i=0; i<90; i++)
allankliu 0:33994cfad0c2 257 {
allankliu 0:33994cfad0c2 258 _send_data(init_data[i]);
allankliu 0:33994cfad0c2 259 }
allankliu 0:33994cfad0c2 260 }
allankliu 2:bb9f154ea2f4 261
allankliu 2:bb9f154ea2f4 262 void SSD1606::_draw_pattern(unsigned char value, unsigned int pix)
allankliu 2:bb9f154ea2f4 263 {
allankliu 2:bb9f154ea2f4 264 int i = 0;
allankliu 2:bb9f154ea2f4 265 unsigned char x, y;
allankliu 3:1fa000d4da94 266 for (x=0; x<SSD1606_WIDTH; x++)
allankliu 2:bb9f154ea2f4 267 {
allankliu 3:1fa000d4da94 268 for (y=0; y<COLBUF_SIZE; y++)
allankliu 2:bb9f154ea2f4 269 {
allankliu 2:bb9f154ea2f4 270 i++;
allankliu 2:bb9f154ea2f4 271 if (i<pix)
allankliu 2:bb9f154ea2f4 272 _send_data(value);
allankliu 2:bb9f154ea2f4 273 else
allankliu 2:bb9f154ea2f4 274 _send_data(0xFF);
allankliu 2:bb9f154ea2f4 275 }
allankliu 2:bb9f154ea2f4 276 }
allankliu 2:bb9f154ea2f4 277 }
allankliu 2:bb9f154ea2f4 278
allankliu 2:bb9f154ea2f4 279 void SSD1606::test_image(unsigned char idx)
allankliu 2:bb9f154ea2f4 280 {
allankliu 2:bb9f154ea2f4 281 switch(idx){
allankliu 2:bb9f154ea2f4 282 case TEST_GREY1:
allankliu 2:bb9f154ea2f4 283 break;
allankliu 2:bb9f154ea2f4 284 case TEST_GREY2:
allankliu 2:bb9f154ea2f4 285 break;
allankliu 2:bb9f154ea2f4 286 case TEST_BLK:
allankliu 2:bb9f154ea2f4 287 break;
allankliu 2:bb9f154ea2f4 288 case TEST_WHT:
allankliu 2:bb9f154ea2f4 289 clear();
allankliu 2:bb9f154ea2f4 290 break;
allankliu 2:bb9f154ea2f4 291 case TEST_HALF:
allankliu 2:bb9f154ea2f4 292 break;
allankliu 2:bb9f154ea2f4 293 case TEST_STRIP1:
allankliu 2:bb9f154ea2f4 294 break;
allankliu 2:bb9f154ea2f4 295 case TEST_STRIP2:
allankliu 2:bb9f154ea2f4 296 break;
allankliu 2:bb9f154ea2f4 297 default:
allankliu 2:bb9f154ea2f4 298 break;
allankliu 2:bb9f154ea2f4 299 }
allankliu 2:bb9f154ea2f4 300 }
allankliu 2:bb9f154ea2f4 301
allankliu 2:bb9f154ea2f4 302
allankliu 2:bb9f154ea2f4 303 void SSD1606::set_font(unsigned char *font, unsigned char width)
allankliu 2:bb9f154ea2f4 304 {
allankliu 2:bb9f154ea2f4 305 }
allankliu 3:1fa000d4da94 306
allankliu 3:1fa000d4da94 307 void SSD1606::_send_data_1bpp(unsigned char value)
allankliu 3:1fa000d4da94 308 {
allankliu 3:1fa000d4da94 309 unsigned char temp;
allankliu 3:1fa000d4da94 310 temp = EPD_2bpp_LUT[value & 0x0F];
allankliu 3:1fa000d4da94 311 _send_data(temp);
allankliu 3:1fa000d4da94 312 temp = EPD_2bpp_LUT[value>>4 & 0x0F];
allankliu 3:1fa000d4da94 313 _send_data(temp);
allankliu 3:1fa000d4da94 314 }