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:
Mon Jun 09 11:01:38 2014 +0000
Revision:
2:bb9f154ea2f4
Parent:
0:33994cfad0c2
Child:
3:1fa000d4da94
Fixed software SPI, reduce memory usage with 1K5 framebuffer and lightweight I2C NVMEM _24LCXXX lib.The code can be fited into LPC1114/2xx devices.

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 2:bb9f154ea2f4 52 wait_ms(5);
allankliu 0:33994cfad0c2 53 _reset = 1;
allankliu 2:bb9f154ea2f4 54 wait_ms(5);
allankliu 2:bb9f154ea2f4 55 }
allankliu 2:bb9f154ea2f4 56
allankliu 2:bb9f154ea2f4 57 void SSD1606::read_busy()
allankliu 2:bb9f154ea2f4 58 {
allankliu 2:bb9f154ea2f4 59 while(_busy==1){
allankliu 2:bb9f154ea2f4 60 wait_ms(1);
allankliu 2:bb9f154ea2f4 61 }
allankliu 0:33994cfad0c2 62 }
allankliu 0:33994cfad0c2 63
allankliu 0:33994cfad0c2 64 void SSD1606::initialize()
allankliu 0:33994cfad0c2 65 {
allankliu 0:33994cfad0c2 66 reset();
allankliu 0:33994cfad0c2 67 _send_command(0x10);
allankliu 0:33994cfad0c2 68 _send_data(0x00);
allankliu 0:33994cfad0c2 69 #ifdef MODE3
allankliu 0:33994cfad0c2 70 _send_command(0x11);
allankliu 0:33994cfad0c2 71 _send_data(0x03);
allankliu 0:33994cfad0c2 72 _send_command(0x44);
allankliu 0:33994cfad0c2 73 _send_data(0x00);
allankliu 0:33994cfad0c2 74 _send_data(0x11);
allankliu 0:33994cfad0c2 75 _send_command(0x45);
allankliu 0:33994cfad0c2 76 _send_data(0x00);
allankliu 0:33994cfad0c2 77 _send_data(0xAB);
allankliu 0:33994cfad0c2 78 _send_command(0x4E);
allankliu 0:33994cfad0c2 79 _send_data(0x00);
allankliu 0:33994cfad0c2 80 _send_command(0x4F);
allankliu 0:33994cfad0c2 81 _send_data(0x00);
allankliu 0:33994cfad0c2 82 #endif
allankliu 0:33994cfad0c2 83 #ifdef MODE2
allankliu 0:33994cfad0c2 84 _send_command(0x11);
allankliu 0:33994cfad0c2 85 _send_data(0x02);
allankliu 0:33994cfad0c2 86 _send_command(0x44);
allankliu 0:33994cfad0c2 87 _send_data(0x11);
allankliu 0:33994cfad0c2 88 _send_data(0x00);
allankliu 0:33994cfad0c2 89 _send_command(0x45);
allankliu 0:33994cfad0c2 90 _send_data(0x00);
allankliu 0:33994cfad0c2 91 _send_data(0xAB);
allankliu 0:33994cfad0c2 92 _send_command(0x4E);
allankliu 0:33994cfad0c2 93 _send_data(0x11);
allankliu 0:33994cfad0c2 94 _send_command(0x4F);
allankliu 0:33994cfad0c2 95 _send_data(0x00);
allankliu 0:33994cfad0c2 96 #endif
allankliu 0:33994cfad0c2 97 #ifdef MODE1
allankliu 0:33994cfad0c2 98 _send_command(0x11);
allankliu 0:33994cfad0c2 99 _send_data(0x01);
allankliu 0:33994cfad0c2 100 _send_command(0x44);
allankliu 0:33994cfad0c2 101 _send_data(0x00);
allankliu 0:33994cfad0c2 102 _send_data(0x11);
allankliu 0:33994cfad0c2 103 _send_command(0x45);
allankliu 0:33994cfad0c2 104 _send_data(0xAB);
allankliu 0:33994cfad0c2 105 _send_data(0x00);
allankliu 0:33994cfad0c2 106 _send_command(0x4E);
allankliu 0:33994cfad0c2 107 _send_data(0x00);
allankliu 0:33994cfad0c2 108 _send_command(0x4F);
allankliu 0:33994cfad0c2 109 _send_data(0xAB);
allankliu 0:33994cfad0c2 110 #endif
allankliu 0:33994cfad0c2 111 #ifdef MODE0
allankliu 0:33994cfad0c2 112 _send_command(0x11);
allankliu 0:33994cfad0c2 113 _send_data(0x00);
allankliu 0:33994cfad0c2 114 _send_command(0x44);
allankliu 0:33994cfad0c2 115 _send_data(0x11);
allankliu 0:33994cfad0c2 116 _send_data(0x00);
allankliu 0:33994cfad0c2 117 _send_command(0x45);
allankliu 0:33994cfad0c2 118 _send_data(0xAB);
allankliu 0:33994cfad0c2 119 _send_data(0x00);
allankliu 0:33994cfad0c2 120 _send_command(0x4E);
allankliu 0:33994cfad0c2 121 _send_data(0x11);
allankliu 0:33994cfad0c2 122 _send_command(0x4F);
allankliu 0:33994cfad0c2 123 _send_data(0xAB);
allankliu 0:33994cfad0c2 124 #endif
allankliu 0:33994cfad0c2 125 _send_command(0xF0);
allankliu 0:33994cfad0c2 126 _send_data(0x1F);
allankliu 0:33994cfad0c2 127 _send_command(0x21);
allankliu 0:33994cfad0c2 128 _send_data(0x03);
allankliu 0:33994cfad0c2 129 _send_command(0x2C);
allankliu 0:33994cfad0c2 130 _send_data(0xA0);
allankliu 0:33994cfad0c2 131 _send_command(0x3C);
allankliu 0:33994cfad0c2 132 _send_data(0x63);
allankliu 0:33994cfad0c2 133 _send_command(0x22);
allankliu 0:33994cfad0c2 134 _send_data(0xC4);
allankliu 0:33994cfad0c2 135
allankliu 0:33994cfad0c2 136 set_lut();
allankliu 0:33994cfad0c2 137 }
allankliu 0:33994cfad0c2 138
allankliu 2:bb9f154ea2f4 139
allankliu 0:33994cfad0c2 140
allankliu 0:33994cfad0c2 141 void SSD1606::rom_image(const unsigned char *bitmap)
allankliu 0:33994cfad0c2 142 {
allankliu 2:bb9f154ea2f4 143 int i=0;
allankliu 0:33994cfad0c2 144 _send_command(0x24);
allankliu 0:33994cfad0c2 145
allankliu 0:33994cfad0c2 146 for (i=0; i <3096; i++)
allankliu 0:33994cfad0c2 147 _send_data(bitmap[i]);
allankliu 0:33994cfad0c2 148
allankliu 0:33994cfad0c2 149 _send_command(0x20);
allankliu 2:bb9f154ea2f4 150 wait_ms(1);
allankliu 2:bb9f154ea2f4 151 read_busy();
allankliu 0:33994cfad0c2 152 }
allankliu 0:33994cfad0c2 153
allankliu 2:bb9f154ea2f4 154 void SSD1606::update(void)
allankliu 0:33994cfad0c2 155 {
allankliu 2:bb9f154ea2f4 156 int i = 0;
allankliu 2:bb9f154ea2f4 157 _send_command(0x24);
allankliu 2:bb9f154ea2f4 158
allankliu 2:bb9f154ea2f4 159 for (i=0; i<3096; i++)
allankliu 2:bb9f154ea2f4 160 //_send_data(_screen[i]);
allankliu 2:bb9f154ea2f4 161 //_send_data(buf[i]);
allankliu 2:bb9f154ea2f4 162
allankliu 2:bb9f154ea2f4 163 wait_ms(1);
allankliu 2:bb9f154ea2f4 164 read_busy();
allankliu 0:33994cfad0c2 165 }
allankliu 0:33994cfad0c2 166
allankliu 2:bb9f154ea2f4 167 /* Hardware Switch off Power Supply for EPD mode (MOSFET)
allankliu 2:bb9f154ea2f4 168 */
allankliu 0:33994cfad0c2 169 void SSD1606::off()
allankliu 0:33994cfad0c2 170 {
allankliu 0:33994cfad0c2 171 }
allankliu 0:33994cfad0c2 172
allankliu 2:bb9f154ea2f4 173 void SSD1606::deepsleep()
allankliu 2:bb9f154ea2f4 174 {
allankliu 2:bb9f154ea2f4 175 }
allankliu 2:bb9f154ea2f4 176
allankliu 0:33994cfad0c2 177 void SSD1606::sleep()
allankliu 0:33994cfad0c2 178 {
allankliu 0:33994cfad0c2 179 _send_command(0x10);
allankliu 0:33994cfad0c2 180 _send_data(0x01);
allankliu 0:33994cfad0c2 181 }
allankliu 0:33994cfad0c2 182
allankliu 2:bb9f154ea2f4 183 void SSD1606::wake()
allankliu 2:bb9f154ea2f4 184 {
allankliu 2:bb9f154ea2f4 185 _send_command(0x10);
allankliu 2:bb9f154ea2f4 186 _send_data(0x00);
allankliu 2:bb9f154ea2f4 187 }
allankliu 2:bb9f154ea2f4 188
allankliu 0:33994cfad0c2 189 void SSD1606::set_command_between_images()
allankliu 0:33994cfad0c2 190 {
allankliu 0:33994cfad0c2 191 _send_command(0x22);
allankliu 0:33994cfad0c2 192 _send_data(0xC7);
allankliu 0:33994cfad0c2 193 _send_command(0x21);
allankliu 0:33994cfad0c2 194 _send_data(0x03);
allankliu 0:33994cfad0c2 195 }
allankliu 0:33994cfad0c2 196
allankliu 0:33994cfad0c2 197 void SSD1606::clear()
allankliu 0:33994cfad0c2 198 {
allankliu 2:bb9f154ea2f4 199 for (int i=0; i<FRAMEBUF_SIZE; i++)
allankliu 2:bb9f154ea2f4 200 _send_data(0xFF);
allankliu 0:33994cfad0c2 201 _cursor_x = 0;
allankliu 0:33994cfad0c2 202 _cursor_y = 0;
allankliu 0:33994cfad0c2 203 }
allankliu 0:33994cfad0c2 204
allankliu 2:bb9f154ea2f4 205 void SSD1606::_vspi_write(unsigned char value)
allankliu 2:bb9f154ea2f4 206 {
allankliu 2:bb9f154ea2f4 207 for (int i=0; i<8; i++)
allankliu 2:bb9f154ea2f4 208 {
allankliu 2:bb9f154ea2f4 209 if(value & 0x80)
allankliu 2:bb9f154ea2f4 210 {
allankliu 2:bb9f154ea2f4 211 _data = 1;
allankliu 2:bb9f154ea2f4 212 }else{
allankliu 2:bb9f154ea2f4 213 _data = 0;
allankliu 2:bb9f154ea2f4 214 }
allankliu 2:bb9f154ea2f4 215 _data = _data<<1;
allankliu 2:bb9f154ea2f4 216 _clk = 1;
allankliu 2:bb9f154ea2f4 217 wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 218 _clk = 0;
allankliu 2:bb9f154ea2f4 219 }
allankliu 2:bb9f154ea2f4 220 }
allankliu 2:bb9f154ea2f4 221
allankliu 0:33994cfad0c2 222 void SSD1606::_send_command(unsigned char code)
allankliu 0:33994cfad0c2 223 {
allankliu 2:bb9f154ea2f4 224 _cs = 1; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 225 _cs = 0; wait_us(SPI_BUS_DELAY); // Maybe _cs set low before _dc set low?
allankliu 2:bb9f154ea2f4 226 _clk = 0; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 227 _dc = 0; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 228
allankliu 2:bb9f154ea2f4 229 //_spi.write(code);
allankliu 2:bb9f154ea2f4 230 _vspi_write(code);
allankliu 2:bb9f154ea2f4 231 wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 232 _cs = 1; wait_us(SPI_BUS_DELAY);
allankliu 0:33994cfad0c2 233 }
allankliu 0:33994cfad0c2 234
allankliu 0:33994cfad0c2 235 void SSD1606::_send_data(unsigned char value)
allankliu 0:33994cfad0c2 236 {
allankliu 2:bb9f154ea2f4 237 _cs = 1; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 238 _cs = 0; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 239 _clk = 0; wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 240 _dc = 1; wait_us(SPI_BUS_DELAY); // Maybe _cs set low before _dc set high?
allankliu 2:bb9f154ea2f4 241 //_spi.write(value);
allankliu 2:bb9f154ea2f4 242 _vspi_write(value);
allankliu 2:bb9f154ea2f4 243 wait_us(SPI_BUS_DELAY);
allankliu 2:bb9f154ea2f4 244 _cs = 1; wait_us(SPI_BUS_DELAY);
allankliu 0:33994cfad0c2 245 }
allankliu 0:33994cfad0c2 246
allankliu 0:33994cfad0c2 247 void SSD1606::set_lut(void)
allankliu 0:33994cfad0c2 248 {
allankliu 0:33994cfad0c2 249 unsigned char i;
allankliu 0:33994cfad0c2 250 _send_command(0x32);
allankliu 0:33994cfad0c2 251 for(i=0; i<90; i++)
allankliu 0:33994cfad0c2 252 {
allankliu 0:33994cfad0c2 253 _send_data(init_data[i]);
allankliu 0:33994cfad0c2 254 }
allankliu 0:33994cfad0c2 255 }
allankliu 2:bb9f154ea2f4 256
allankliu 2:bb9f154ea2f4 257 void SSD1606::_draw_pattern(unsigned char value, unsigned int pix)
allankliu 2:bb9f154ea2f4 258 {
allankliu 2:bb9f154ea2f4 259 int i = 0;
allankliu 2:bb9f154ea2f4 260 unsigned char x, y;
allankliu 2:bb9f154ea2f4 261 for (x=0; x<SSD1606_LCDHEIGHT; x++)
allankliu 2:bb9f154ea2f4 262 {
allankliu 2:bb9f154ea2f4 263 for (y=0; y<SSD1606_LCDWIDTH; y++)
allankliu 2:bb9f154ea2f4 264 {
allankliu 2:bb9f154ea2f4 265 i++;
allankliu 2:bb9f154ea2f4 266 if (i<pix)
allankliu 2:bb9f154ea2f4 267 _send_data(value);
allankliu 2:bb9f154ea2f4 268 else
allankliu 2:bb9f154ea2f4 269 _send_data(0xFF);
allankliu 2:bb9f154ea2f4 270 }
allankliu 2:bb9f154ea2f4 271 }
allankliu 2:bb9f154ea2f4 272 }
allankliu 2:bb9f154ea2f4 273
allankliu 2:bb9f154ea2f4 274 void SSD1606::test_image(unsigned char idx)
allankliu 2:bb9f154ea2f4 275 {
allankliu 2:bb9f154ea2f4 276 switch(idx){
allankliu 2:bb9f154ea2f4 277 case TEST_GREY1:
allankliu 2:bb9f154ea2f4 278 break;
allankliu 2:bb9f154ea2f4 279 case TEST_GREY2:
allankliu 2:bb9f154ea2f4 280 break;
allankliu 2:bb9f154ea2f4 281 case TEST_BLK:
allankliu 2:bb9f154ea2f4 282 break;
allankliu 2:bb9f154ea2f4 283 case TEST_WHT:
allankliu 2:bb9f154ea2f4 284 clear();
allankliu 2:bb9f154ea2f4 285 break;
allankliu 2:bb9f154ea2f4 286 case TEST_HALF:
allankliu 2:bb9f154ea2f4 287 break;
allankliu 2:bb9f154ea2f4 288 case TEST_STRIP1:
allankliu 2:bb9f154ea2f4 289 break;
allankliu 2:bb9f154ea2f4 290 case TEST_STRIP2:
allankliu 2:bb9f154ea2f4 291 break;
allankliu 2:bb9f154ea2f4 292 default:
allankliu 2:bb9f154ea2f4 293 break;
allankliu 2:bb9f154ea2f4 294 }
allankliu 2:bb9f154ea2f4 295 }
allankliu 2:bb9f154ea2f4 296
allankliu 2:bb9f154ea2f4 297
allankliu 2:bb9f154ea2f4 298 void SSD1606::set_font(unsigned char *font, unsigned char width)
allankliu 2:bb9f154ea2f4 299 {
allankliu 2:bb9f154ea2f4 300 }