This includes all known improvements from other people's spins on the Nokia library, including Alistair Popple's fix to the very poor contrast on newer LCD 6100 displays.

Fork of NokiaLCD by Iftekhar Choudhury

Committer:
plskeggs
Date:
Sun Jan 26 23:10:31 2014 +0000
Revision:
4:0a17a8a82c4c
Parent:
3:ea0c085881f3
Works with a Sparkfun LCD 6100.  Includes all changes from other people's spins of the original Nokia library, including the latest from Alistar Popple that fixes the very poor contrast issue.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:ff874f85ed33 1 /* mbed Nokia LCD Library
simon 0:ff874f85ed33 2 * Copyright (c) 2007-2010, sford
simon 0:ff874f85ed33 3 */
simon 0:ff874f85ed33 4
simon 0:ff874f85ed33 5 #include "NokiaLCD.h"
simon 0:ff874f85ed33 6
simon 0:ff874f85ed33 7 #include "mbed.h"
simon 0:ff874f85ed33 8
simon 0:ff874f85ed33 9 #define NOKIALCD_ROWS 16
simon 0:ff874f85ed33 10 #define NOKIALCD_COLS 16
simon 0:ff874f85ed33 11 #define NOKIALCD_WIDTH 130
ichoudhury6 3:ea0c085881f3 12 #define NOKIALCD_HEIGHT 132
plskeggs 4:0a17a8a82c4c 13 #define NOKIALCD_FREQUENCY 1000000
simon 0:ff874f85ed33 14
plskeggs 4:0a17a8a82c4c 15 NokiaLCD::NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type, int contrast)
simon 0:ff874f85ed33 16 : _spi(mosi, NC, sclk)
simon 0:ff874f85ed33 17 , _rst(rst)
simon 0:ff874f85ed33 18 , _cs(cs) {
simon 0:ff874f85ed33 19
simon 0:ff874f85ed33 20 _type = type;
simon 0:ff874f85ed33 21
simon 0:ff874f85ed33 22 _row = 0;
simon 0:ff874f85ed33 23 _column = 0;
simon 0:ff874f85ed33 24 _foreground = 0x00FFFFFF;
simon 0:ff874f85ed33 25 _background = 0x00000000;
plskeggs 4:0a17a8a82c4c 26 _rows = NOKIALCD_ROWS;
plskeggs 4:0a17a8a82c4c 27 _columns = NOKIALCD_COLS;
simon 0:ff874f85ed33 28
plskeggs 4:0a17a8a82c4c 29 //reset(contrast);
simon 0:ff874f85ed33 30 }
simon 0:ff874f85ed33 31
plskeggs 4:0a17a8a82c4c 32 void NokiaLCD::reset(int contrast) {
simon 0:ff874f85ed33 33
simon 0:ff874f85ed33 34 // setup the SPI interface and bring display out of reset
simon 0:ff874f85ed33 35 _cs = 1;
simon 0:ff874f85ed33 36 _rst = 0;
simon 0:ff874f85ed33 37 _spi.format(9);
simon 0:ff874f85ed33 38 _spi.frequency(NOKIALCD_FREQUENCY);
simon 0:ff874f85ed33 39 wait_ms(1);
simon 0:ff874f85ed33 40 _rst = 1;
simon 0:ff874f85ed33 41 wait_ms(1);
simon 0:ff874f85ed33 42
simon 0:ff874f85ed33 43 _cs = 0;
simon 0:ff874f85ed33 44
simon 0:ff874f85ed33 45 switch (_type) {
simon 0:ff874f85ed33 46 case LCD6100:
simon 0:ff874f85ed33 47 command(0xCA); // display control
plskeggs 4:0a17a8a82c4c 48 data(0xC);
simon 0:ff874f85ed33 49 data(32);
simon 0:ff874f85ed33 50 data(0);
simon 0:ff874f85ed33 51 command(0xBB);
simon 0:ff874f85ed33 52 data(1);
simon 0:ff874f85ed33 53 command(0xD1); // oscillator on
simon 0:ff874f85ed33 54 command(0x94); // sleep out
simon 0:ff874f85ed33 55 command(0x20); // power control
simon 0:ff874f85ed33 56 data(0x0F);
simon 0:ff874f85ed33 57 command(0xA7); // invert display
plskeggs 4:0a17a8a82c4c 58 command(0xBC); // data control
simon 0:ff874f85ed33 59 data(0);
simon 0:ff874f85ed33 60 data(1);
simon 0:ff874f85ed33 61 data(4);
plskeggs 4:0a17a8a82c4c 62 command(0x81); // Voltage control
plskeggs 4:0a17a8a82c4c 63 data(contrast);// contrast setting: 0..63
plskeggs 4:0a17a8a82c4c 64 data(3); // 3 resistance ratio
plskeggs 4:0a17a8a82c4c 65 wait_ms(10); // allow power supply to stabilize
simon 0:ff874f85ed33 66 command(0xAF); // turn on the display
simon 0:ff874f85ed33 67 break;
simon 0:ff874f85ed33 68
simon 0:ff874f85ed33 69 case LCD6610:
simon 0:ff874f85ed33 70 command(0xCA); // display control
simon 0:ff874f85ed33 71 data(0);
ichoudhury6 3:ea0c085881f3 72 data(32);
simon 0:ff874f85ed33 73 data(0);
simon 0:ff874f85ed33 74 command(0xBB);
simon 0:ff874f85ed33 75 data(1);
simon 0:ff874f85ed33 76 command(0xD1); // oscillator on
simon 0:ff874f85ed33 77 command(0x94); // sleep out
simon 0:ff874f85ed33 78 command(0x20); // power control
simon 0:ff874f85ed33 79 data(0x0F);
simon 0:ff874f85ed33 80 command(0xA7); // invert display
simon 0:ff874f85ed33 81 command(0x81); // Voltage control
plskeggs 4:0a17a8a82c4c 82 data(contrast);// contrast setting: 0..63
simon 0:ff874f85ed33 83 data(3); // resistance ratio
simon 0:ff874f85ed33 84 wait_ms(1);
simon 0:ff874f85ed33 85 command(0xBC);
simon 0:ff874f85ed33 86 data(0);
simon 0:ff874f85ed33 87 data(0);
simon 0:ff874f85ed33 88 data(2);
simon 0:ff874f85ed33 89 command(0xAF); // turn on the display
simon 0:ff874f85ed33 90 break;
simon 0:ff874f85ed33 91
simon 0:ff874f85ed33 92 case PCF8833:
simon 0:ff874f85ed33 93 command(0x11); // sleep out
simon 0:ff874f85ed33 94 command(0x3A); // column mode
simon 0:ff874f85ed33 95 data(0x05);
simon 0:ff874f85ed33 96 command(0x36); // madctl
simon 0:ff874f85ed33 97 data(0x60); // vertical RAM, flip x
simon 0:ff874f85ed33 98 command(0x25); // setcon
plskeggs 4:0a17a8a82c4c 99 data(contrast);// contrast 0x30
simon 0:ff874f85ed33 100 wait_ms(2);
simon 0:ff874f85ed33 101 command(0x29);//DISPON
simon 0:ff874f85ed33 102 command(0x03);//BSTRON
simon 0:ff874f85ed33 103 break;
simon 0:ff874f85ed33 104 }
simon 0:ff874f85ed33 105
simon 0:ff874f85ed33 106 _cs = 1;
simon 0:ff874f85ed33 107
simon 0:ff874f85ed33 108 cls();
simon 0:ff874f85ed33 109 }
simon 0:ff874f85ed33 110
simon 0:ff874f85ed33 111 void NokiaLCD::command(int value) {
simon 0:ff874f85ed33 112 _spi.write(value & 0xFF);
simon 0:ff874f85ed33 113 }
simon 0:ff874f85ed33 114
simon 0:ff874f85ed33 115 void NokiaLCD::data(int value) {
simon 0:ff874f85ed33 116 _spi.write(value | 0x100);
simon 0:ff874f85ed33 117 }
simon 0:ff874f85ed33 118
simon 0:ff874f85ed33 119 void NokiaLCD::_window(int x, int y, int width, int height) {
ichoudhury6 3:ea0c085881f3 120 int x1 = x + 0;
simon 0:ff874f85ed33 121 int y1 = y + 0;
simon 0:ff874f85ed33 122 int x2 = x1 + width - 1;
simon 0:ff874f85ed33 123 int y2 = y1 + height - 1;
simon 0:ff874f85ed33 124
simon 0:ff874f85ed33 125 switch (_type) {
simon 0:ff874f85ed33 126 case LCD6100:
simon 0:ff874f85ed33 127 case LCD6610:
simon 0:ff874f85ed33 128 command(0x15); // column
simon 0:ff874f85ed33 129 data(x1);
simon 0:ff874f85ed33 130 data(x2);
simon 0:ff874f85ed33 131 command(0x75); // row
simon 0:ff874f85ed33 132 data(y1);
simon 0:ff874f85ed33 133 data(y2);
simon 0:ff874f85ed33 134 command(0x5C); // start write to ram
simon 0:ff874f85ed33 135 break;
simon 0:ff874f85ed33 136 case PCF8833:
simon 0:ff874f85ed33 137 command(0x2A); // column
simon 0:ff874f85ed33 138 data(x1);
simon 0:ff874f85ed33 139 data(x2);
simon 0:ff874f85ed33 140 command(0x2B); // row
simon 0:ff874f85ed33 141 data(y1);
simon 0:ff874f85ed33 142 data(y2);
simon 0:ff874f85ed33 143 command(0x2C); // start write to ram
simon 0:ff874f85ed33 144 break;
simon 0:ff874f85ed33 145 }
simon 0:ff874f85ed33 146 }
simon 0:ff874f85ed33 147
simon 0:ff874f85ed33 148 void NokiaLCD::_putp(int colour) {
simon 0:ff874f85ed33 149 int gr = ((colour >> 20) & 0x0F)
simon 0:ff874f85ed33 150 | ((colour >> 8 ) & 0xF0);
simon 0:ff874f85ed33 151 int nb = ((colour >> 4 ) & 0x0F);
simon 0:ff874f85ed33 152 data(nb);
simon 0:ff874f85ed33 153 data(gr);
simon 0:ff874f85ed33 154 }
simon 0:ff874f85ed33 155
simon 0:ff874f85ed33 156 const unsigned char FONT8x8[97][8] = {
simon 0:ff874f85ed33 157 0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char
simon 0:ff874f85ed33 158 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
simon 0:ff874f85ed33 159 0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // !
simon 0:ff874f85ed33 160 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // "
simon 0:ff874f85ed33 161 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // #
simon 0:ff874f85ed33 162 0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $
simon 0:ff874f85ed33 163 0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // %
simon 0:ff874f85ed33 164 0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // &
simon 0:ff874f85ed33 165 0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // '
simon 0:ff874f85ed33 166 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // (
simon 0:ff874f85ed33 167 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // )
simon 0:ff874f85ed33 168 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // *
simon 0:ff874f85ed33 169 0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // +
simon 0:ff874f85ed33 170 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // ,
simon 0:ff874f85ed33 171 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // -
simon 0:ff874f85ed33 172 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // .
simon 0:ff874f85ed33 173 0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash)
simon 0:ff874f85ed33 174 0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30
simon 0:ff874f85ed33 175 0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1
simon 0:ff874f85ed33 176 0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2
simon 0:ff874f85ed33 177 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3
simon 0:ff874f85ed33 178 0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4
simon 0:ff874f85ed33 179 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5
simon 0:ff874f85ed33 180 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6
simon 0:ff874f85ed33 181 0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7
simon 0:ff874f85ed33 182 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8
simon 0:ff874f85ed33 183 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9
simon 0:ff874f85ed33 184 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // :
simon 0:ff874f85ed33 185 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ;
simon 0:ff874f85ed33 186 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // <
simon 0:ff874f85ed33 187 0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // =
simon 0:ff874f85ed33 188 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // >
simon 0:ff874f85ed33 189 0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ?
simon 0:ff874f85ed33 190 0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40
simon 0:ff874f85ed33 191 0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A
simon 0:ff874f85ed33 192 0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B
simon 0:ff874f85ed33 193 0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C
simon 0:ff874f85ed33 194 0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D
simon 0:ff874f85ed33 195 0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E
simon 0:ff874f85ed33 196 0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F
simon 0:ff874f85ed33 197 0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G
simon 0:ff874f85ed33 198 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H
simon 0:ff874f85ed33 199 0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I
simon 0:ff874f85ed33 200 0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J
simon 0:ff874f85ed33 201 0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K
simon 0:ff874f85ed33 202 0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L
simon 0:ff874f85ed33 203 0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M
simon 0:ff874f85ed33 204 0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N
simon 0:ff874f85ed33 205 0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O
simon 0:ff874f85ed33 206 0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50
simon 0:ff874f85ed33 207 0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q
simon 0:ff874f85ed33 208 0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R
simon 0:ff874f85ed33 209 0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S
simon 0:ff874f85ed33 210 0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T
simon 0:ff874f85ed33 211 0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U
simon 0:ff874f85ed33 212 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V
simon 0:ff874f85ed33 213 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W
simon 0:ff874f85ed33 214 0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X
simon 0:ff874f85ed33 215 0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y
simon 0:ff874f85ed33 216 0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z
simon 0:ff874f85ed33 217 0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [
simon 0:ff874f85ed33 218 0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash)
simon 0:ff874f85ed33 219 0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ]
simon 0:ff874f85ed33 220 0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^
simon 0:ff874f85ed33 221 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _
simon 0:ff874f85ed33 222 0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60
simon 0:ff874f85ed33 223 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a
simon 0:ff874f85ed33 224 0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b
simon 0:ff874f85ed33 225 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c
simon 0:ff874f85ed33 226 0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d
simon 0:ff874f85ed33 227 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e
simon 0:ff874f85ed33 228 0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f
simon 0:ff874f85ed33 229 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g
simon 0:ff874f85ed33 230 0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h
simon 0:ff874f85ed33 231 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i
simon 0:ff874f85ed33 232 0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j
simon 0:ff874f85ed33 233 0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k
simon 0:ff874f85ed33 234 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l
simon 0:ff874f85ed33 235 0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m
simon 0:ff874f85ed33 236 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n
simon 0:ff874f85ed33 237 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o
simon 0:ff874f85ed33 238 0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p
simon 0:ff874f85ed33 239 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q
simon 0:ff874f85ed33 240 0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r
simon 0:ff874f85ed33 241 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s
simon 0:ff874f85ed33 242 0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t
simon 0:ff874f85ed33 243 0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u
simon 0:ff874f85ed33 244 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v
simon 0:ff874f85ed33 245 0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w
simon 0:ff874f85ed33 246 0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x
simon 0:ff874f85ed33 247 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y
simon 0:ff874f85ed33 248 0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z
simon 0:ff874f85ed33 249 0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // {
simon 0:ff874f85ed33 250 0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // |
simon 0:ff874f85ed33 251 0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // }
simon 0:ff874f85ed33 252 0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~
simon 0:ff874f85ed33 253 0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00
simon 0:ff874f85ed33 254 }; // DEL
simon 0:ff874f85ed33 255
simon 0:ff874f85ed33 256 void NokiaLCD::locate(int column, int row) {
simon 0:ff874f85ed33 257 _column = column;
simon 0:ff874f85ed33 258 _row = row;
simon 0:ff874f85ed33 259 }
simon 0:ff874f85ed33 260
simon 0:ff874f85ed33 261 void NokiaLCD::newline() {
simon 0:ff874f85ed33 262 _column = 0;
simon 0:ff874f85ed33 263 _row++;
simon 0:ff874f85ed33 264 if (_row >= _rows) {
simon 0:ff874f85ed33 265 _row = 0;
simon 0:ff874f85ed33 266 }
simon 0:ff874f85ed33 267 }
simon 0:ff874f85ed33 268
simon 0:ff874f85ed33 269 int NokiaLCD::_putc(int value) {
simon 0:ff874f85ed33 270 int x = _column * 8; // FIXME: Char sizes
simon 0:ff874f85ed33 271 int y = _row * 8;
simon 0:ff874f85ed33 272 bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0]));
simon 0:ff874f85ed33 273
simon 0:ff874f85ed33 274 _column++;
simon 0:ff874f85ed33 275
simon 0:ff874f85ed33 276 if (_column >= NOKIALCD_COLS) {
simon 0:ff874f85ed33 277 _row++;
simon 0:ff874f85ed33 278 _column = 0;
simon 0:ff874f85ed33 279 }
simon 0:ff874f85ed33 280
simon 0:ff874f85ed33 281 if (_row >= NOKIALCD_ROWS) {
simon 0:ff874f85ed33 282 _row = 0;
simon 0:ff874f85ed33 283 }
simon 0:ff874f85ed33 284
simon 0:ff874f85ed33 285 return value;
simon 0:ff874f85ed33 286 }
simon 0:ff874f85ed33 287
simon 0:ff874f85ed33 288 void NokiaLCD::cls() {
simon 0:ff874f85ed33 289 fill(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT, _background);
simon 0:ff874f85ed33 290 _row = 0;
simon 0:ff874f85ed33 291 _column = 0;
simon 0:ff874f85ed33 292 }
simon 0:ff874f85ed33 293
simon 0:ff874f85ed33 294
simon 0:ff874f85ed33 295 void NokiaLCD::window(int x, int y, int width, int height) {
simon 0:ff874f85ed33 296 _cs = 0;
simon 0:ff874f85ed33 297 _window(x, y, width, height);
simon 0:ff874f85ed33 298 _cs = 1;
simon 0:ff874f85ed33 299 }
simon 0:ff874f85ed33 300
simon 0:ff874f85ed33 301 void NokiaLCD::putp(int colour) {
simon 0:ff874f85ed33 302 _cs = 0;
simon 0:ff874f85ed33 303 _putp(colour);
simon 0:ff874f85ed33 304 _cs = 1;
simon 0:ff874f85ed33 305 }
simon 0:ff874f85ed33 306
simon 0:ff874f85ed33 307 void NokiaLCD::pixel(int x, int y, int colour) {
simon 0:ff874f85ed33 308 _cs = 0;
simon 0:ff874f85ed33 309 _window(x, y, 1, 1);
simon 0:ff874f85ed33 310 _putp(colour);
simon 0:ff874f85ed33 311 _cs = 1;
simon 0:ff874f85ed33 312 }
simon 0:ff874f85ed33 313
simon 0:ff874f85ed33 314 void NokiaLCD::fill(int x, int y, int width, int height, int colour) {
simon 0:ff874f85ed33 315 _cs = 0;
simon 0:ff874f85ed33 316 _window(x, y, width, height);
simon 1:8f005b0dcfa7 317 switch (_type) {
simon 1:8f005b0dcfa7 318 case LCD6100:
simon 1:8f005b0dcfa7 319 case PCF8833:
simon 1:8f005b0dcfa7 320 for (int i=0; i<width*height; i++) {
simon 1:8f005b0dcfa7 321 _putp(colour);
simon 1:8f005b0dcfa7 322 }
simon 1:8f005b0dcfa7 323 break;
simon 1:8f005b0dcfa7 324 case LCD6610:
simon 1:8f005b0dcfa7 325 for (int i=0; i<width*height/2; i++) {
simon 1:8f005b0dcfa7 326 int r4 = (colour >> (16 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 327 int g4 = (colour >> (8 + 4)) & 0xF;
simon 1:8f005b0dcfa7 328 int b4 = (colour >> (0 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 329 int d1 = (r4 << 4) | g4;
simon 1:8f005b0dcfa7 330 int d2 = (b4 << 4) | r4;
simon 1:8f005b0dcfa7 331 int d3 = (g4 << 4) | b4;
simon 1:8f005b0dcfa7 332 data(d1);
ichoudhury6 3:ea0c085881f3 333 data(d2);
ichoudhury6 3:ea0c085881f3 334 data(d3);
simon 1:8f005b0dcfa7 335 }
simon 1:8f005b0dcfa7 336 break;
simon 0:ff874f85ed33 337 }
simon 0:ff874f85ed33 338 _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT);
simon 0:ff874f85ed33 339 _cs = 1;
simon 0:ff874f85ed33 340 }
simon 0:ff874f85ed33 341
plskeggs 4:0a17a8a82c4c 342 void NokiaLCD::circle(int x0, int y0, int r, int colour) {
plskeggs 4:0a17a8a82c4c 343 int draw_x0, draw_y0;
plskeggs 4:0a17a8a82c4c 344 int draw_x1, draw_y1;
plskeggs 4:0a17a8a82c4c 345 int draw_x2, draw_y2;
plskeggs 4:0a17a8a82c4c 346 int draw_x3, draw_y3;
plskeggs 4:0a17a8a82c4c 347 int draw_x4, draw_y4;
plskeggs 4:0a17a8a82c4c 348 int draw_x5, draw_y5;
plskeggs 4:0a17a8a82c4c 349 int draw_x6, draw_y6;
plskeggs 4:0a17a8a82c4c 350 int draw_x7, draw_y7;
plskeggs 4:0a17a8a82c4c 351 int xx, yy;
plskeggs 4:0a17a8a82c4c 352 int di;
plskeggs 4:0a17a8a82c4c 353
plskeggs 4:0a17a8a82c4c 354 _cs = 0;
plskeggs 4:0a17a8a82c4c 355 _window(x0, y0, 1, 1);
plskeggs 4:0a17a8a82c4c 356
plskeggs 4:0a17a8a82c4c 357 if(r == 0) /* no radius */
plskeggs 4:0a17a8a82c4c 358 {
plskeggs 4:0a17a8a82c4c 359 return;
plskeggs 4:0a17a8a82c4c 360 }
plskeggs 4:0a17a8a82c4c 361
plskeggs 4:0a17a8a82c4c 362 draw_x0 = draw_x1 = x0;
plskeggs 4:0a17a8a82c4c 363 draw_y0 = draw_y1 = y0 + r;
plskeggs 4:0a17a8a82c4c 364 if(draw_y0 < NOKIALCD_HEIGHT)
plskeggs 4:0a17a8a82c4c 365 {
plskeggs 4:0a17a8a82c4c 366 _window(draw_x0, draw_y0, 1, 1);
plskeggs 4:0a17a8a82c4c 367 _putp(colour); /* 90 degree */
plskeggs 4:0a17a8a82c4c 368 }
plskeggs 4:0a17a8a82c4c 369
plskeggs 4:0a17a8a82c4c 370 draw_x2 = draw_x3 = x0;
plskeggs 4:0a17a8a82c4c 371 draw_y2 = draw_y3 = y0 - r;
plskeggs 4:0a17a8a82c4c 372 if(draw_y2 >= 0)
plskeggs 4:0a17a8a82c4c 373 {
plskeggs 4:0a17a8a82c4c 374 _window(draw_x2, draw_y2, 1, 1);
plskeggs 4:0a17a8a82c4c 375 _putp(colour); /* 270 degree */
plskeggs 4:0a17a8a82c4c 376 }
plskeggs 4:0a17a8a82c4c 377
plskeggs 4:0a17a8a82c4c 378 draw_x4 = draw_x6 = x0 + r;
plskeggs 4:0a17a8a82c4c 379 draw_y4 = draw_y6 = y0;
plskeggs 4:0a17a8a82c4c 380 if(draw_x4 < NOKIALCD_WIDTH)
plskeggs 4:0a17a8a82c4c 381 {
plskeggs 4:0a17a8a82c4c 382 _window(draw_x4, draw_y4, 1, 1);
plskeggs 4:0a17a8a82c4c 383 _putp(colour); /* 0 degree */
plskeggs 4:0a17a8a82c4c 384 }
plskeggs 4:0a17a8a82c4c 385
plskeggs 4:0a17a8a82c4c 386 draw_x5 = draw_x7 = x0 - r;
plskeggs 4:0a17a8a82c4c 387 draw_y5 = draw_y7 = y0;
plskeggs 4:0a17a8a82c4c 388 if(draw_x5>=0)
plskeggs 4:0a17a8a82c4c 389 {
plskeggs 4:0a17a8a82c4c 390 _window(draw_x5, draw_y5, 1, 1);
plskeggs 4:0a17a8a82c4c 391 _putp(colour); /* 90 degree */ /* 180 degree */
plskeggs 4:0a17a8a82c4c 392 }
plskeggs 4:0a17a8a82c4c 393
plskeggs 4:0a17a8a82c4c 394 if(r == 1)
plskeggs 4:0a17a8a82c4c 395 {
plskeggs 4:0a17a8a82c4c 396 return;
plskeggs 4:0a17a8a82c4c 397 }
plskeggs 4:0a17a8a82c4c 398
plskeggs 4:0a17a8a82c4c 399 di = 3 - 2*r;
plskeggs 4:0a17a8a82c4c 400 xx = 0;
plskeggs 4:0a17a8a82c4c 401 yy = r;
plskeggs 4:0a17a8a82c4c 402 while(xx < yy)
plskeggs 4:0a17a8a82c4c 403 {
plskeggs 4:0a17a8a82c4c 404
plskeggs 4:0a17a8a82c4c 405 if(di < 0)
plskeggs 4:0a17a8a82c4c 406 {
plskeggs 4:0a17a8a82c4c 407 di += 4*xx + 6;
plskeggs 4:0a17a8a82c4c 408 }
plskeggs 4:0a17a8a82c4c 409 else
plskeggs 4:0a17a8a82c4c 410 {
plskeggs 4:0a17a8a82c4c 411 di += 4*(xx - yy) + 10;
plskeggs 4:0a17a8a82c4c 412 yy--;
plskeggs 4:0a17a8a82c4c 413 draw_y0--;
plskeggs 4:0a17a8a82c4c 414 draw_y1--;
plskeggs 4:0a17a8a82c4c 415 draw_y2++;
plskeggs 4:0a17a8a82c4c 416 draw_y3++;
plskeggs 4:0a17a8a82c4c 417 draw_x4--;
plskeggs 4:0a17a8a82c4c 418 draw_x5++;
plskeggs 4:0a17a8a82c4c 419 draw_x6--;
plskeggs 4:0a17a8a82c4c 420 draw_x7++;
plskeggs 4:0a17a8a82c4c 421 }
plskeggs 4:0a17a8a82c4c 422 xx++;
plskeggs 4:0a17a8a82c4c 423 draw_x0++;
plskeggs 4:0a17a8a82c4c 424 draw_x1--;
plskeggs 4:0a17a8a82c4c 425 draw_x2++;
plskeggs 4:0a17a8a82c4c 426 draw_x3--;
plskeggs 4:0a17a8a82c4c 427 draw_y4++;
plskeggs 4:0a17a8a82c4c 428 draw_y5++;
plskeggs 4:0a17a8a82c4c 429 draw_y6--;
plskeggs 4:0a17a8a82c4c 430 draw_y7--;
plskeggs 4:0a17a8a82c4c 431
plskeggs 4:0a17a8a82c4c 432 if( (draw_x0 <= NOKIALCD_WIDTH) && (draw_y0>=0) )
plskeggs 4:0a17a8a82c4c 433 {
plskeggs 4:0a17a8a82c4c 434 _window(draw_x0, draw_y0, 1, 1);
plskeggs 4:0a17a8a82c4c 435 _putp(colour);
plskeggs 4:0a17a8a82c4c 436 }
plskeggs 4:0a17a8a82c4c 437
plskeggs 4:0a17a8a82c4c 438 if( (draw_x1 >= 0) && (draw_y1 >= 0) )
plskeggs 4:0a17a8a82c4c 439 {
plskeggs 4:0a17a8a82c4c 440 _window(draw_x1, draw_y1, 1, 1);
plskeggs 4:0a17a8a82c4c 441 _putp(colour);
plskeggs 4:0a17a8a82c4c 442 }
plskeggs 4:0a17a8a82c4c 443
plskeggs 4:0a17a8a82c4c 444 if( (draw_x2 <= NOKIALCD_WIDTH) && (draw_y2 <= NOKIALCD_HEIGHT) )
plskeggs 4:0a17a8a82c4c 445 {
plskeggs 4:0a17a8a82c4c 446 _window(draw_x2, draw_y2, 1, 1);
plskeggs 4:0a17a8a82c4c 447 _putp(colour);
plskeggs 4:0a17a8a82c4c 448 }
plskeggs 4:0a17a8a82c4c 449
plskeggs 4:0a17a8a82c4c 450 if( (draw_x3 >=0 ) && (draw_y3 <= NOKIALCD_HEIGHT) )
plskeggs 4:0a17a8a82c4c 451 {
plskeggs 4:0a17a8a82c4c 452 _window(draw_x3, draw_y3, 1, 1);
plskeggs 4:0a17a8a82c4c 453 _putp(colour);
plskeggs 4:0a17a8a82c4c 454 }
plskeggs 4:0a17a8a82c4c 455
plskeggs 4:0a17a8a82c4c 456 if( (draw_x4 <= /*OLED_DISPLAY_HEIGHT*/NOKIALCD_WIDTH) && (draw_y4 >= 0) )
plskeggs 4:0a17a8a82c4c 457 {
plskeggs 4:0a17a8a82c4c 458 _window(draw_x4, draw_y4, 1, 1);
plskeggs 4:0a17a8a82c4c 459 _putp(colour);
plskeggs 4:0a17a8a82c4c 460 }
plskeggs 4:0a17a8a82c4c 461
plskeggs 4:0a17a8a82c4c 462 if( (draw_x5 >= 0) && (draw_y5 >= 0) )
plskeggs 4:0a17a8a82c4c 463 {
plskeggs 4:0a17a8a82c4c 464 _window(draw_x5, draw_y5, 1, 1);
plskeggs 4:0a17a8a82c4c 465 _putp(colour);
plskeggs 4:0a17a8a82c4c 466 }
plskeggs 4:0a17a8a82c4c 467 if( (draw_x6 <= NOKIALCD_WIDTH) && (draw_y6 <= NOKIALCD_HEIGHT) )
plskeggs 4:0a17a8a82c4c 468 {
plskeggs 4:0a17a8a82c4c 469 _window(draw_x6, draw_y6, 1, 1);
plskeggs 4:0a17a8a82c4c 470 _putp(colour);
plskeggs 4:0a17a8a82c4c 471 }
plskeggs 4:0a17a8a82c4c 472 if( (draw_x7 >= 0) && (draw_y7 <= NOKIALCD_HEIGHT) )
plskeggs 4:0a17a8a82c4c 473 {
plskeggs 4:0a17a8a82c4c 474 _window(draw_x7, draw_y7, 1, 1);
plskeggs 4:0a17a8a82c4c 475 _putp(colour);
plskeggs 4:0a17a8a82c4c 476 }
plskeggs 4:0a17a8a82c4c 477 }
plskeggs 4:0a17a8a82c4c 478 _cs = 1;
plskeggs 4:0a17a8a82c4c 479 return;
plskeggs 4:0a17a8a82c4c 480 }
plskeggs 4:0a17a8a82c4c 481
plskeggs 4:0a17a8a82c4c 482 void NokiaLCD::line(int x0, int y0, int x1, int y1, int colour) {
plskeggs 4:0a17a8a82c4c 483 int dx = 0, dy = 0;
plskeggs 4:0a17a8a82c4c 484 int dx_sym = 0, dy_sym = 0;
plskeggs 4:0a17a8a82c4c 485 int dx_x2 = 0, dy_x2 = 0;
plskeggs 4:0a17a8a82c4c 486 int di = 0;
plskeggs 4:0a17a8a82c4c 487
plskeggs 4:0a17a8a82c4c 488 _cs = 0; // Chipselect the LCD.
plskeggs 4:0a17a8a82c4c 489
plskeggs 4:0a17a8a82c4c 490 dx = x1-x0;
plskeggs 4:0a17a8a82c4c 491 dy = y1-y0;
plskeggs 4:0a17a8a82c4c 492
plskeggs 4:0a17a8a82c4c 493
plskeggs 4:0a17a8a82c4c 494 if(dx == 0) /* vertical line */
plskeggs 4:0a17a8a82c4c 495 {
plskeggs 4:0a17a8a82c4c 496 for(int y=y0; y<y1; y++){
plskeggs 4:0a17a8a82c4c 497 _window(x0, y, 1, 1);
plskeggs 4:0a17a8a82c4c 498 _putp(colour);
plskeggs 4:0a17a8a82c4c 499 }
plskeggs 4:0a17a8a82c4c 500 return;
plskeggs 4:0a17a8a82c4c 501 }
plskeggs 4:0a17a8a82c4c 502
plskeggs 4:0a17a8a82c4c 503 if(dx > 0)
plskeggs 4:0a17a8a82c4c 504 {
plskeggs 4:0a17a8a82c4c 505 dx_sym = 1;
plskeggs 4:0a17a8a82c4c 506 }
plskeggs 4:0a17a8a82c4c 507 else
plskeggs 4:0a17a8a82c4c 508 {
plskeggs 4:0a17a8a82c4c 509 dx_sym = -1;
plskeggs 4:0a17a8a82c4c 510 }
plskeggs 4:0a17a8a82c4c 511
plskeggs 4:0a17a8a82c4c 512
plskeggs 4:0a17a8a82c4c 513 if(dy == 0) /* horizontal line */
plskeggs 4:0a17a8a82c4c 514 {
plskeggs 4:0a17a8a82c4c 515 for(int x=x0; x<x1; x++){
plskeggs 4:0a17a8a82c4c 516 _window(x, y0, 1, 1);
plskeggs 4:0a17a8a82c4c 517 _putp(colour);
plskeggs 4:0a17a8a82c4c 518 }
plskeggs 4:0a17a8a82c4c 519 return;
plskeggs 4:0a17a8a82c4c 520 }
plskeggs 4:0a17a8a82c4c 521
plskeggs 4:0a17a8a82c4c 522
plskeggs 4:0a17a8a82c4c 523 if(dy > 0)
plskeggs 4:0a17a8a82c4c 524 {
plskeggs 4:0a17a8a82c4c 525 dy_sym = 1;
plskeggs 4:0a17a8a82c4c 526 }
plskeggs 4:0a17a8a82c4c 527 else
plskeggs 4:0a17a8a82c4c 528 {
plskeggs 4:0a17a8a82c4c 529 dy_sym = -1;
plskeggs 4:0a17a8a82c4c 530 }
plskeggs 4:0a17a8a82c4c 531
plskeggs 4:0a17a8a82c4c 532 dx = dx_sym*dx;
plskeggs 4:0a17a8a82c4c 533 dy = dy_sym*dy;
plskeggs 4:0a17a8a82c4c 534
plskeggs 4:0a17a8a82c4c 535 dx_x2 = dx*2;
plskeggs 4:0a17a8a82c4c 536 dy_x2 = dy*2;
plskeggs 4:0a17a8a82c4c 537
plskeggs 4:0a17a8a82c4c 538 if(dx >= dy)
plskeggs 4:0a17a8a82c4c 539 {
plskeggs 4:0a17a8a82c4c 540 di = dy_x2 - dx;
plskeggs 4:0a17a8a82c4c 541 while(x0 != x1)
plskeggs 4:0a17a8a82c4c 542 {
plskeggs 4:0a17a8a82c4c 543
plskeggs 4:0a17a8a82c4c 544 _window(x0, y0, 1, 1);
plskeggs 4:0a17a8a82c4c 545 _putp(colour);
plskeggs 4:0a17a8a82c4c 546 x0 += dx_sym;
plskeggs 4:0a17a8a82c4c 547 if(di<0)
plskeggs 4:0a17a8a82c4c 548 {
plskeggs 4:0a17a8a82c4c 549 di += dy_x2;
plskeggs 4:0a17a8a82c4c 550 }
plskeggs 4:0a17a8a82c4c 551 else
plskeggs 4:0a17a8a82c4c 552 {
plskeggs 4:0a17a8a82c4c 553 di += dy_x2 - dx_x2;
plskeggs 4:0a17a8a82c4c 554 y0 += dy_sym;
plskeggs 4:0a17a8a82c4c 555 }
plskeggs 4:0a17a8a82c4c 556 }
plskeggs 4:0a17a8a82c4c 557 _window(x0, y0, 1, 1);
plskeggs 4:0a17a8a82c4c 558 _putp(colour);
plskeggs 4:0a17a8a82c4c 559 }
plskeggs 4:0a17a8a82c4c 560 else
plskeggs 4:0a17a8a82c4c 561 {
plskeggs 4:0a17a8a82c4c 562 di = dx_x2 - dy;
plskeggs 4:0a17a8a82c4c 563 while(y0 != y1)
plskeggs 4:0a17a8a82c4c 564 {
plskeggs 4:0a17a8a82c4c 565 _window(x0, y0, 1, 1);
plskeggs 4:0a17a8a82c4c 566 _putp(colour);
plskeggs 4:0a17a8a82c4c 567 y0 += dy_sym;
plskeggs 4:0a17a8a82c4c 568 if(di < 0)
plskeggs 4:0a17a8a82c4c 569 {
plskeggs 4:0a17a8a82c4c 570 di += dx_x2;
plskeggs 4:0a17a8a82c4c 571 }
plskeggs 4:0a17a8a82c4c 572 else
plskeggs 4:0a17a8a82c4c 573 {
plskeggs 4:0a17a8a82c4c 574 di += dx_x2 - dy_x2;
plskeggs 4:0a17a8a82c4c 575 x0 += dx_sym;
plskeggs 4:0a17a8a82c4c 576 }
plskeggs 4:0a17a8a82c4c 577 }
plskeggs 4:0a17a8a82c4c 578 _window(x0, y0, 1, 1);
plskeggs 4:0a17a8a82c4c 579 _putp(colour);
plskeggs 4:0a17a8a82c4c 580 }
plskeggs 4:0a17a8a82c4c 581 _cs = 1;
plskeggs 4:0a17a8a82c4c 582 return;
plskeggs 4:0a17a8a82c4c 583 }
plskeggs 4:0a17a8a82c4c 584
simon 0:ff874f85ed33 585 void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) {
simon 0:ff874f85ed33 586 _cs = 0;
simon 0:ff874f85ed33 587 _window(x, y, width, height);
simon 1:8f005b0dcfa7 588
simon 1:8f005b0dcfa7 589 switch (_type) {
simon 1:8f005b0dcfa7 590 case LCD6100:
simon 1:8f005b0dcfa7 591 case PCF8833:
simon 1:8f005b0dcfa7 592 for (int i=0; i<width*height; i++) {
simon 1:8f005b0dcfa7 593 _putp(colour[i]);
simon 1:8f005b0dcfa7 594 }
simon 1:8f005b0dcfa7 595 break;
simon 1:8f005b0dcfa7 596 case LCD6610:
simon 1:8f005b0dcfa7 597 for (int i=0; i<width*height/2; i++) {
ichoudhury6 3:ea0c085881f3 598 int r41 = (colour[i*2] >> (16 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 599 int g41 = (colour[i*2] >> (8 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 600 int b41 = (colour[i*2] >> (0 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 601
simon 1:8f005b0dcfa7 602 int r42 = (colour[i*2+1] >> (16 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 603 int g42 = (colour[i*2+1] >> (8 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 604 int b42 = (colour[i*2+1] >> (0 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 605 int d1 = (r41 << 4) | g41;
ichoudhury6 3:ea0c085881f3 606 int d2 = (b41 << 4) | r42;
ichoudhury6 3:ea0c085881f3 607 int d3 = (g42 << 4) | b42;
ichoudhury6 3:ea0c085881f3 608 data(d1);
ichoudhury6 3:ea0c085881f3 609 data(d2);
ichoudhury6 3:ea0c085881f3 610 data(d3);
simon 1:8f005b0dcfa7 611 }
simon 1:8f005b0dcfa7 612 break;
simon 1:8f005b0dcfa7 613 }
simon 0:ff874f85ed33 614 _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT);
simon 0:ff874f85ed33 615 _cs = 1;
simon 0:ff874f85ed33 616 }
simon 0:ff874f85ed33 617
simon 0:ff874f85ed33 618 void NokiaLCD::bitblit(int x, int y, int width, int height, const char* bitstream) {
simon 0:ff874f85ed33 619 _cs = 0;
simon 0:ff874f85ed33 620 _window(x, y, width, height);
simon 1:8f005b0dcfa7 621
simon 1:8f005b0dcfa7 622 switch (_type) {
simon 1:8f005b0dcfa7 623 case LCD6100:
simon 1:8f005b0dcfa7 624 case PCF8833:
simon 1:8f005b0dcfa7 625 for (int i=0; i<height*width; i++) {
simon 1:8f005b0dcfa7 626 int byte = i / 8;
simon 1:8f005b0dcfa7 627 int bit = i % 8;
simon 1:8f005b0dcfa7 628 int colour = ((bitstream[byte] << bit) & 0x80) ? _foreground : _background;
simon 1:8f005b0dcfa7 629 _putp(colour);
simon 1:8f005b0dcfa7 630 }
simon 1:8f005b0dcfa7 631 break;
simon 1:8f005b0dcfa7 632 case LCD6610:
simon 1:8f005b0dcfa7 633 for(int i=0; i<height*width/2; i++) {
simon 1:8f005b0dcfa7 634 int byte1 = (i*2) / 8;
simon 1:8f005b0dcfa7 635 int bit1 = (i*2) % 8;
ichoudhury6 3:ea0c085881f3 636 int colour1 = ((bitstream[byte1] << bit1) & 0x80) ? _foreground : _background;
ichoudhury6 3:ea0c085881f3 637 int byte2 = (i*2+1) / 8;
simon 1:8f005b0dcfa7 638 int bit2 = (i*2+1) % 8;
simon 1:8f005b0dcfa7 639 int colour2 = ((bitstream[byte2] << bit2) & 0x80) ? _foreground : _background;
ichoudhury6 3:ea0c085881f3 640
ichoudhury6 3:ea0c085881f3 641 int r41 = (colour1 >> (16 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 642 int g41 = (colour1 >> (8 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 643 int b41 = (colour1 >> (0 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 644
simon 1:8f005b0dcfa7 645 int r42 = (colour2 >> (16 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 646 int g42 = (colour2 >> (8 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 647 int b42 = (colour2 >> (0 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 648 int d1 = (r41 << 4) | g41;
ichoudhury6 3:ea0c085881f3 649 int d2 = (b41 << 4) | r42;
ichoudhury6 3:ea0c085881f3 650 int d3 = (g42 << 4) | b42;
ichoudhury6 3:ea0c085881f3 651 data(d1);
ichoudhury6 3:ea0c085881f3 652 data(d2);
ichoudhury6 3:ea0c085881f3 653 data(d3);
simon 1:8f005b0dcfa7 654 }
simon 1:8f005b0dcfa7 655 break;
simon 1:8f005b0dcfa7 656 }
simon 0:ff874f85ed33 657 _window(0, 0, _width, _height);
simon 0:ff874f85ed33 658 _cs = 1;
simon 0:ff874f85ed33 659 }
simon 0:ff874f85ed33 660
simon 0:ff874f85ed33 661 void NokiaLCD::foreground(int c) {
simon 0:ff874f85ed33 662 _foreground = c;
simon 0:ff874f85ed33 663 }
simon 0:ff874f85ed33 664
simon 0:ff874f85ed33 665 void NokiaLCD::background(int c) {
simon 0:ff874f85ed33 666 _background = c;
simon 0:ff874f85ed33 667 }
simon 0:ff874f85ed33 668
simon 0:ff874f85ed33 669 int NokiaLCD::width() {
simon 0:ff874f85ed33 670 return NOKIALCD_WIDTH;
simon 0:ff874f85ed33 671 }
simon 0:ff874f85ed33 672
simon 0:ff874f85ed33 673 int NokiaLCD::height() {
simon 0:ff874f85ed33 674 return NOKIALCD_HEIGHT;
simon 0:ff874f85ed33 675 }
simon 0:ff874f85ed33 676
simon 0:ff874f85ed33 677 int NokiaLCD::columns() {
simon 0:ff874f85ed33 678 return NOKIALCD_COLS;
simon 0:ff874f85ed33 679 }
simon 0:ff874f85ed33 680
simon 0:ff874f85ed33 681 int NokiaLCD::rows() {
simon 0:ff874f85ed33 682 return NOKIALCD_ROWS;
simon 0:ff874f85ed33 683 }