Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of NokiaLCD by
NokiaLCD.cpp
00001 /* mbed Nokia LCD Library 00002 * Copyright (c) 2007-2010, sford 00003 */ 00004 00005 #include "NokiaLCD.h" 00006 00007 #include "mbed.h" 00008 00009 #define NOKIALCD_ROWS 16 00010 #define NOKIALCD_COLS 16 00011 #define NOKIALCD_WIDTH 130 00012 #define NOKIALCD_HEIGHT 132 00013 #define NOKIALCD_FREQUENCY 5000000 00014 00015 NokiaLCD::NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type) 00016 : _spi(mosi, NC, sclk) 00017 , _rst(rst) 00018 , _cs(cs) { 00019 00020 _type = type; 00021 00022 _row = 0; 00023 _column = 0; 00024 _foreground = 0x00FFFFFF; 00025 _background = 0x00000000; 00026 00027 reset(); 00028 } 00029 00030 void NokiaLCD::reset() { 00031 00032 // setup the SPI interface and bring display out of reset 00033 _cs = 1; 00034 _rst = 0; 00035 _spi.format(9); 00036 _spi.frequency(NOKIALCD_FREQUENCY); 00037 wait_ms(1); 00038 _rst = 1; 00039 wait_ms(1); 00040 00041 _cs = 0; 00042 00043 switch (_type) { 00044 case LCD6100: 00045 command(0xCA); // display control 00046 data(0); 00047 data(32); 00048 data(0); 00049 command(0xBB); 00050 data(1); 00051 command(0xD1); // oscillator on 00052 command(0x94); // sleep out 00053 command(0x20); // power control 00054 data(0x0F); 00055 command(0xA7); // invert display 00056 command(0x81); // Voltage control 00057 data(39); // contrast setting: 0..63 00058 data(3); // resistance ratio 00059 wait_ms(1); 00060 command(0xBC); 00061 data(0); 00062 data(1); 00063 data(4); 00064 command(0xAF); // turn on the display 00065 break; 00066 00067 case LCD6610: 00068 command(0xCA); // display control 00069 data(0); 00070 data(32); 00071 data(0); 00072 command(0xBB); 00073 data(1); 00074 command(0xD1); // oscillator on 00075 command(0x94); // sleep out 00076 command(0x20); // power control 00077 data(0x0F); 00078 command(0xA7); // invert display 00079 command(0x81); // Voltage control 00080 data(39); // contrast setting: 0..63 00081 data(3); // resistance ratio 00082 wait_ms(1); 00083 command(0xBC); 00084 data(0); 00085 data(0); 00086 data(2); 00087 command(0xAF); // turn on the display 00088 break; 00089 00090 case PCF8833: 00091 command(0x11); // sleep out 00092 command(0x3A); // column mode 00093 data(0x05); 00094 command(0x36); // madctl 00095 data(0x60); // vertical RAM, flip x 00096 command(0x25); // setcon 00097 data(0x30);// contrast 0x30 00098 wait_ms(2); 00099 command(0x29);//DISPON 00100 command(0x03);//BSTRON 00101 break; 00102 } 00103 00104 _cs = 1; 00105 00106 cls(); 00107 } 00108 00109 void NokiaLCD::command(int value) { 00110 _spi.write(value & 0xFF); 00111 } 00112 00113 void NokiaLCD::data(int value) { 00114 _spi.write(value | 0x100); 00115 } 00116 00117 void NokiaLCD::_window(int x, int y, int width, int height) { 00118 int x1 = x + 0; 00119 int y1 = y + 0; 00120 int x2 = x1 + width - 1; 00121 int y2 = y1 + height - 1; 00122 00123 switch (_type) { 00124 case LCD6100: 00125 case LCD6610: 00126 command(0x15); // column 00127 data(x1); 00128 data(x2); 00129 command(0x75); // row 00130 data(y1); 00131 data(y2); 00132 command(0x5C); // start write to ram 00133 break; 00134 case PCF8833: 00135 command(0x2A); // column 00136 data(x1); 00137 data(x2); 00138 command(0x2B); // row 00139 data(y1); 00140 data(y2); 00141 command(0x2C); // start write to ram 00142 break; 00143 } 00144 } 00145 00146 void NokiaLCD::_putp(int colour) { 00147 int gr = ((colour >> 20) & 0x0F) 00148 | ((colour >> 8 ) & 0xF0); 00149 int nb = ((colour >> 4 ) & 0x0F); 00150 data(nb); 00151 data(gr); 00152 } 00153 00154 const unsigned char FONT8x8[97][8] = { 00155 0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char 00156 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20 00157 0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // ! 00158 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // " 00159 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // # 00160 0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $ 00161 0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // % 00162 0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // & 00163 0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // ' 00164 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // ( 00165 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // ) 00166 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // * 00167 0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // + 00168 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // , 00169 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // - 00170 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // . 00171 0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash) 00172 0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30 00173 0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1 00174 0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2 00175 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3 00176 0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4 00177 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5 00178 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6 00179 0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7 00180 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8 00181 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9 00182 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // : 00183 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ; 00184 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // < 00185 0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // = 00186 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // > 00187 0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ? 00188 0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40 00189 0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A 00190 0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B 00191 0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C 00192 0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D 00193 0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E 00194 0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F 00195 0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G 00196 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H 00197 0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I 00198 0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J 00199 0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K 00200 0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L 00201 0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M 00202 0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N 00203 0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O 00204 0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50 00205 0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q 00206 0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R 00207 0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S 00208 0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T 00209 0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U 00210 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V 00211 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W 00212 0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X 00213 0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y 00214 0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z 00215 0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [ 00216 0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash) 00217 0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ] 00218 0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^ 00219 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _ 00220 0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60 00221 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a 00222 0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b 00223 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c 00224 0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d 00225 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e 00226 0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f 00227 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g 00228 0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h 00229 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i 00230 0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j 00231 0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k 00232 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l 00233 0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m 00234 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n 00235 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o 00236 0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p 00237 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q 00238 0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r 00239 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s 00240 0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t 00241 0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u 00242 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v 00243 0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w 00244 0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x 00245 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y 00246 0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z 00247 0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // { 00248 0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // | 00249 0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // } 00250 0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~ 00251 0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00 00252 }; // DEL 00253 00254 void NokiaLCD::locate(int column, int row) { 00255 _column = column; 00256 _row = row; 00257 } 00258 00259 void NokiaLCD::newline() { 00260 _column = 0; 00261 _row++; 00262 if (_row >= _rows) { 00263 _row = 0; 00264 } 00265 } 00266 00267 int NokiaLCD::_putc(int value) { 00268 int x = _column * 8; // FIXME: Char sizes 00269 int y = _row * 8; 00270 bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); 00271 00272 _column++; 00273 00274 if (_column >= NOKIALCD_COLS) { 00275 _row++; 00276 _column = 0; 00277 } 00278 00279 if (_row >= NOKIALCD_ROWS) { 00280 _row = 0; 00281 } 00282 00283 return value; 00284 } 00285 00286 void NokiaLCD::cls() { 00287 fill(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT, _background); 00288 _row = 0; 00289 _column = 0; 00290 } 00291 00292 00293 void NokiaLCD::window(int x, int y, int width, int height) { 00294 _cs = 0; 00295 _window(x, y, width, height); 00296 _cs = 1; 00297 } 00298 00299 void NokiaLCD::putp(int colour) { 00300 _cs = 0; 00301 _putp(colour); 00302 _cs = 1; 00303 } 00304 00305 void NokiaLCD::pixel(int x, int y, int colour) { 00306 _cs = 0; 00307 _window(x, y, 1, 1); 00308 switch (_type) { 00309 case LCD6100: 00310 case PCF8833: 00311 00312 _putp(colour); 00313 00314 break; 00315 case LCD6610: 00316 00317 int r4 = (colour >> (16 + 4)) & 0xF; 00318 int g4 = (colour >> (8 + 4)) & 0xF; 00319 int b4 = (colour >> (0 + 4)) & 0xF; 00320 int d1 = (r4 << 4) | g4; 00321 int d2 = (b4 << 4) | r4; 00322 int d3 = (g4 << 4) | b4; 00323 data(d1); 00324 data(d2); 00325 data(d3); 00326 00327 break; 00328 } 00329 _cs = 1; 00330 } 00331 00332 void NokiaLCD::fill(int x, int y, int width, int height, int colour) { 00333 _cs = 0; 00334 _window(x, y, width, height); 00335 switch (_type) { 00336 case LCD6100: 00337 case PCF8833: 00338 for (int i=0; i<width*height; i++) { 00339 _putp(colour); 00340 } 00341 break; 00342 case LCD6610: 00343 for (int i=0; i<width*height/2; i++) { 00344 int r4 = (colour >> (16 + 4)) & 0xF; 00345 int g4 = (colour >> (8 + 4)) & 0xF; 00346 int b4 = (colour >> (0 + 4)) & 0xF; 00347 int d1 = (r4 << 4) | g4; 00348 int d2 = (b4 << 4) | r4; 00349 int d3 = (g4 << 4) | b4; 00350 data(d1); 00351 data(d2); 00352 data(d3); 00353 } 00354 break; 00355 } 00356 _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT); 00357 _cs = 1; 00358 } 00359 00360 void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) { 00361 _cs = 0; 00362 _window(x, y, width, height); 00363 00364 switch (_type) { 00365 case LCD6100: 00366 case PCF8833: 00367 for (int i=0; i<width*height; i++) { 00368 _putp(colour[i]); 00369 } 00370 break; 00371 case LCD6610: 00372 for (int i=0; i<width*height/2; i++) { 00373 int r41 = (colour[i*2] >> (16 + 4)) & 0xF; 00374 int g41 = (colour[i*2] >> (8 + 4)) & 0xF; 00375 int b41 = (colour[i*2] >> (0 + 4)) & 0xF; 00376 00377 int r42 = (colour[i*2+1] >> (16 + 4)) & 0xF; 00378 int g42 = (colour[i*2+1] >> (8 + 4)) & 0xF; 00379 int b42 = (colour[i*2+1] >> (0 + 4)) & 0xF; 00380 int d1 = (r41 << 4) | g41; 00381 int d2 = (b41 << 4) | r42; 00382 int d3 = (g42 << 4) | b42; 00383 data(d1); 00384 data(d2); 00385 data(d3); 00386 } 00387 break; 00388 } 00389 _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT); 00390 _cs = 1; 00391 } 00392 00393 void NokiaLCD::bitblit(int x, int y, int width, int height, const char* bitstream) { 00394 _cs = 0; 00395 _window(x, y, width, height); 00396 00397 switch (_type) { 00398 case LCD6100: 00399 case PCF8833: 00400 for (int i=0; i<height*width; i++) { 00401 int byte = i / 8; 00402 int bit = i % 8; 00403 int colour = ((bitstream[byte] << bit) & 0x80) ? _foreground : _background; 00404 _putp(colour); 00405 } 00406 break; 00407 case LCD6610: 00408 for(int i=0; i<height*width/2; i++) { 00409 int byte1 = (i*2) / 8; 00410 int bit1 = (i*2) % 8; 00411 int colour1 = ((bitstream[byte1] << bit1) & 0x80) ? _foreground : _background; 00412 int byte2 = (i*2+1) / 8; 00413 int bit2 = (i*2+1) % 8; 00414 int colour2 = ((bitstream[byte2] << bit2) & 0x80) ? _foreground : _background; 00415 00416 int r41 = (colour1 >> (16 + 4)) & 0xF; 00417 int g41 = (colour1 >> (8 + 4)) & 0xF; 00418 int b41 = (colour1 >> (0 + 4)) & 0xF; 00419 00420 int r42 = (colour2 >> (16 + 4)) & 0xF; 00421 int g42 = (colour2 >> (8 + 4)) & 0xF; 00422 int b42 = (colour2 >> (0 + 4)) & 0xF; 00423 int d1 = (r41 << 4) | g41; 00424 int d2 = (b41 << 4) | r42; 00425 int d3 = (g42 << 4) | b42; 00426 data(d1); 00427 data(d2); 00428 data(d3); 00429 } 00430 break; 00431 } 00432 _window(0, 0, _width, _height); 00433 _cs = 1; 00434 } 00435 00436 void NokiaLCD::foreground(int c) { 00437 _foreground = c; 00438 } 00439 00440 void NokiaLCD::background(int c) { 00441 _background = c; 00442 } 00443 00444 int NokiaLCD::width() { 00445 return NOKIALCD_WIDTH; 00446 } 00447 00448 int NokiaLCD::height() { 00449 return NOKIALCD_HEIGHT; 00450 } 00451 00452 int NokiaLCD::columns() { 00453 return NOKIALCD_COLS; 00454 } 00455 00456 int NokiaLCD::rows() { 00457 return NOKIALCD_ROWS; 00458 }
Generated on Sat Jul 16 2022 15:33:47 by
1.7.2
