Kai Liu / Mbed 2 deprecated LPC1114_EBadge

Dependencies:   mbed _24LCXXX

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 }