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.
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 131 00012 #define NOKIALCD_HEIGHT 131 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(31); 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); // 16 bits par pixel 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 + 2; 00119 /* 00120 int x1 = x; 00121 int y1 = y + 0; 00122 int x2 = x1 + width - 1; 00123 int y2 = y1 + height - 1; 00124 */ 00125 int x1 = x; 00126 int y1 = y + 0; 00127 int x2 = x1 + width-1; 00128 int y2 = y1 + height-1; 00129 switch (_type) { 00130 case LCD6100: 00131 case LCD6610: 00132 command(0x15); // column 00133 data(x1); 00134 data(x2); 00135 command(0x75); // row 00136 data(y1); 00137 data(y2); 00138 command(0x5C); // start write to ram 00139 break; 00140 case PCF8833: 00141 command(0x2A); // column 00142 data(x1); 00143 data(x2); 00144 command(0x2B); // row 00145 data(y1); 00146 data(y2); 00147 command(0x2C); // start write to ram 00148 break; 00149 } 00150 } 00151 00152 void NokiaLCD::_putp(int colour) { 00153 /* int gr = ((colour >> 20) & 0x0F) 00154 | ((colour >> 8 ) & 0xF0); 00155 int nb = ((colour >> 4 ) & 0x0F); 00156 gr = 0xe0; 00157 nb = 0x07; 00158 data(nb); 00159 data(gr); 00160 */ 00161 int rg = ((colour >> 16) & 0xF8) 00162 | ((colour >> 13 ) & 0x07); 00163 int gb = ((colour >> 5 ) & 0xE0) 00164 | ((colour >> 3 ) & 0x1f); 00165 // rg = 0xf8; 00166 // rg &= 0x07; 00167 // gb &= 0xe0; 00168 // rg = 0x07; 00169 // gb = 0xe0; 00170 data(rg); 00171 data(gb); 00172 00173 } 00174 00175 const unsigned char FONT8x8[97][8] = { 00176 0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char 00177 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20 00178 0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // ! 00179 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // " 00180 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // # 00181 0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $ 00182 0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // % 00183 0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // & 00184 0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // ' 00185 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // ( 00186 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // ) 00187 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // * 00188 0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // + 00189 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // , 00190 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // - 00191 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // . 00192 0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash) 00193 0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30 00194 0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1 00195 0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2 00196 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3 00197 0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4 00198 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5 00199 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6 00200 0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7 00201 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8 00202 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9 00203 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // : 00204 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ; 00205 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // < 00206 0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // = 00207 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // > 00208 0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ? 00209 0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40 00210 0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A 00211 0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B 00212 0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C 00213 0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D 00214 0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E 00215 0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F 00216 0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G 00217 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H 00218 0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I 00219 0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J 00220 0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K 00221 0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L 00222 0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M 00223 0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N 00224 0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O 00225 0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50 00226 0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q 00227 0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R 00228 0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S 00229 0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T 00230 0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U 00231 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V 00232 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W 00233 0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X 00234 0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y 00235 0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z 00236 0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [ 00237 0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash) 00238 0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ] 00239 0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^ 00240 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _ 00241 0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60 00242 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a 00243 0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b 00244 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c 00245 0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d 00246 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e 00247 0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f 00248 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g 00249 0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h 00250 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i 00251 0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j 00252 0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k 00253 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l 00254 0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m 00255 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n 00256 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o 00257 0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p 00258 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q 00259 0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r 00260 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s 00261 0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t 00262 0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u 00263 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v 00264 0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w 00265 0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x 00266 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y 00267 0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z 00268 0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // { 00269 0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // | 00270 0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // } 00271 0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~ 00272 0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00 00273 }; // DEL 00274 00275 void NokiaLCD::locate(int column, int row) { 00276 _column = column; 00277 _row = row; 00278 } 00279 00280 void NokiaLCD::newline() { 00281 _column = 0; 00282 _row++; 00283 if (_row >= _rows) { 00284 _row = 0; 00285 } 00286 } 00287 00288 int NokiaLCD::_putc(int value) { 00289 int x = _column * 8; // FIXME: Char sizes 00290 int y = _row * 8; 00291 // bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); 00292 bitblit(y , x, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); 00293 00294 _column++; 00295 00296 if (_column >= NOKIALCD_COLS) { 00297 _row++; 00298 _column = 0; 00299 } 00300 00301 if (_row >= NOKIALCD_ROWS) { 00302 _row = 0; 00303 } 00304 00305 return value; 00306 } 00307 00308 void NokiaLCD::cls() { 00309 fill(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT, _background); 00310 _row = 0; 00311 _column = 0; 00312 } 00313 00314 00315 void NokiaLCD::window(int x, int y, int width, int height) { 00316 _cs = 0; 00317 _window(x, y, width, height); 00318 _cs = 1; 00319 } 00320 00321 void NokiaLCD::putp(int colour) { 00322 _cs = 0; 00323 _putp(colour); 00324 _cs = 1; 00325 } 00326 00327 void NokiaLCD::pixel(int x, int y, int colour) { 00328 _cs = 0; 00329 // _window(x, y, 1, 1); 00330 _window(y, x, 1, 1); 00331 _putp(colour); 00332 _cs = 1; 00333 } 00334 00335 void NokiaLCD::fill(int x, int y, int width, int height, int colour) { 00336 _cs = 0; 00337 // _window(x, y, width, height); 00338 _window(y+1, x+1, height, width); 00339 switch (_type) { 00340 case LCD6100: 00341 case PCF8833: 00342 for (int i=0; i<width*height; i++) { 00343 _putp(colour); 00344 } 00345 break; 00346 case LCD6610: 00347 for (int i=0; i<width*height/2; i++) { 00348 int r4 = (colour >> (16 + 4)) & 0xF; 00349 int g4 = (colour >> (8 + 4)) & 0xF; 00350 int b4 = (colour >> (0 + 4)) & 0xF; 00351 int d1 = (r4 << 4) | g4; 00352 int d2 = (b4 << 4) | r4; 00353 int d3 = (g4 << 4) | b4; 00354 data(d1); 00355 data(d2); 00356 data(d3); 00357 } 00358 break; 00359 } 00360 _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT); 00361 _cs = 1; 00362 } 00363 00364 void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) { 00365 _cs = 0; 00366 00367 _window(x, y, width, height); 00368 00369 switch (_type) { 00370 case LCD6100: 00371 case PCF8833: 00372 for (int i=0; i<width*height; i++) { 00373 _putp(colour[i]); 00374 } 00375 break; 00376 case LCD6610: 00377 for (int i=0; i<width*height/2; i++) { 00378 int r41 = (colour[i*2] >> (16 + 4)) & 0xF; 00379 int g41 = (colour[i*2] >> (8 + 4)) & 0xF; 00380 int b41 = (colour[i*2] >> (0 + 4)) & 0xF; 00381 00382 int r42 = (colour[i*2+1] >> (16 + 4)) & 0xF; 00383 int g42 = (colour[i*2+1] >> (8 + 4)) & 0xF; 00384 int b42 = (colour[i*2+1] >> (0 + 4)) & 0xF; 00385 int d1 = (r41 << 4) | g41; 00386 int d2 = (b41 << 4) | r42; 00387 int d3 = (g42 << 4) | b42; 00388 data(d1); 00389 data(d2); 00390 data(d3); 00391 } 00392 break; 00393 } 00394 _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT); 00395 _cs = 1; 00396 } 00397 00398 void NokiaLCD::bitblit(int x, int y, int width, int height, const char* bitstream) { 00399 _cs = 0; 00400 _window(x, y, width, height); 00401 00402 switch (_type) { 00403 case LCD6100: 00404 case PCF8833: 00405 for (int i=0; i<height*width; i++) { 00406 int byte = i / 8; 00407 int bit = i % 8; 00408 int colour = ((bitstream[byte] << bit) & 0x80) ? _foreground : _background; 00409 _putp(colour); 00410 } 00411 break; 00412 case LCD6610: 00413 for(int i=0; i<height*width/2; i++) { 00414 int byte1 = (i*2) / 8; 00415 int bit1 = (i*2) % 8; 00416 int colour1 = ((bitstream[byte1] << bit1) & 0x80) ? _foreground : _background; 00417 int byte2 = (i*2+1) / 8; 00418 int bit2 = (i*2+1) % 8; 00419 int colour2 = ((bitstream[byte2] << bit2) & 0x80) ? _foreground : _background; 00420 00421 int r41 = (colour1 >> (16 + 4)) & 0xF; 00422 int g41 = (colour1 >> (8 + 4)) & 0xF; 00423 int b41 = (colour1 >> (0 + 4)) & 0xF; 00424 00425 int r42 = (colour2 >> (16 + 4)) & 0xF; 00426 int g42 = (colour2 >> (8 + 4)) & 0xF; 00427 int b42 = (colour2 >> (0 + 4)) & 0xF; 00428 int d1 = (r41 << 4) | g41; 00429 int d2 = (b41 << 4) | r42; 00430 int d3 = (g42 << 4) | b42; 00431 data(d1); 00432 data(d2); 00433 data(d3); 00434 } 00435 break; 00436 } 00437 _window(0, 0, _width, _height); 00438 _cs = 1; 00439 } 00440 00441 void NokiaLCD::foreground(int c) { 00442 _foreground = c; 00443 } 00444 00445 void NokiaLCD::background(int c) { 00446 _background = c; 00447 } 00448 00449 int NokiaLCD::width() { 00450 return NOKIALCD_WIDTH; 00451 } 00452 00453 int NokiaLCD::height() { 00454 return NOKIALCD_HEIGHT; 00455 } 00456 00457 int NokiaLCD::columns() { 00458 return NOKIALCD_COLS; 00459 } 00460 00461 int NokiaLCD::rows() { 00462 return NOKIALCD_ROWS; 00463 }
Generated on Thu Jul 14 2022 16:07:51 by
1.7.2