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:
ichoudhury6
Date:
Tue Mar 05 18:52:17 2013 +0000
Revision:
3:ea0c085881f3
Parent:
1:8f005b0dcfa7
Child:
4:0a17a8a82c4c
Publish

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
simon 0:ff874f85ed33 13 #define NOKIALCD_FREQUENCY 5000000
simon 0:ff874f85ed33 14
simon 0:ff874f85ed33 15 NokiaLCD::NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type)
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;
simon 0:ff874f85ed33 26
simon 0:ff874f85ed33 27 reset();
simon 0:ff874f85ed33 28 }
simon 0:ff874f85ed33 29
simon 0:ff874f85ed33 30 void NokiaLCD::reset() {
simon 0:ff874f85ed33 31
simon 0:ff874f85ed33 32 // setup the SPI interface and bring display out of reset
simon 0:ff874f85ed33 33 _cs = 1;
simon 0:ff874f85ed33 34 _rst = 0;
simon 0:ff874f85ed33 35 _spi.format(9);
simon 0:ff874f85ed33 36 _spi.frequency(NOKIALCD_FREQUENCY);
simon 0:ff874f85ed33 37 wait_ms(1);
simon 0:ff874f85ed33 38 _rst = 1;
simon 0:ff874f85ed33 39 wait_ms(1);
simon 0:ff874f85ed33 40
simon 0:ff874f85ed33 41 _cs = 0;
simon 0:ff874f85ed33 42
simon 0:ff874f85ed33 43 switch (_type) {
simon 0:ff874f85ed33 44 case LCD6100:
simon 0:ff874f85ed33 45 command(0xCA); // display control
simon 0:ff874f85ed33 46 data(0);
simon 0:ff874f85ed33 47 data(32);
simon 0:ff874f85ed33 48 data(0);
simon 0:ff874f85ed33 49 command(0xBB);
simon 0:ff874f85ed33 50 data(1);
simon 0:ff874f85ed33 51 command(0xD1); // oscillator on
simon 0:ff874f85ed33 52 command(0x94); // sleep out
simon 0:ff874f85ed33 53 command(0x20); // power control
simon 0:ff874f85ed33 54 data(0x0F);
simon 0:ff874f85ed33 55 command(0xA7); // invert display
simon 0:ff874f85ed33 56 command(0x81); // Voltage control
simon 0:ff874f85ed33 57 data(39); // contrast setting: 0..63
simon 0:ff874f85ed33 58 data(3); // resistance ratio
simon 0:ff874f85ed33 59 wait_ms(1);
simon 0:ff874f85ed33 60 command(0xBC);
simon 0:ff874f85ed33 61 data(0);
simon 0:ff874f85ed33 62 data(1);
simon 0:ff874f85ed33 63 data(4);
simon 0:ff874f85ed33 64 command(0xAF); // turn on the display
simon 0:ff874f85ed33 65 break;
simon 0:ff874f85ed33 66
simon 0:ff874f85ed33 67 case LCD6610:
simon 0:ff874f85ed33 68 command(0xCA); // display control
simon 0:ff874f85ed33 69 data(0);
ichoudhury6 3:ea0c085881f3 70 data(32);
simon 0:ff874f85ed33 71 data(0);
simon 0:ff874f85ed33 72 command(0xBB);
simon 0:ff874f85ed33 73 data(1);
simon 0:ff874f85ed33 74 command(0xD1); // oscillator on
simon 0:ff874f85ed33 75 command(0x94); // sleep out
simon 0:ff874f85ed33 76 command(0x20); // power control
simon 0:ff874f85ed33 77 data(0x0F);
simon 0:ff874f85ed33 78 command(0xA7); // invert display
simon 0:ff874f85ed33 79 command(0x81); // Voltage control
simon 0:ff874f85ed33 80 data(39); // contrast setting: 0..63
simon 0:ff874f85ed33 81 data(3); // resistance ratio
simon 0:ff874f85ed33 82 wait_ms(1);
simon 0:ff874f85ed33 83 command(0xBC);
simon 0:ff874f85ed33 84 data(0);
simon 0:ff874f85ed33 85 data(0);
simon 0:ff874f85ed33 86 data(2);
simon 0:ff874f85ed33 87 command(0xAF); // turn on the display
simon 0:ff874f85ed33 88 break;
simon 0:ff874f85ed33 89
simon 0:ff874f85ed33 90 case PCF8833:
simon 0:ff874f85ed33 91 command(0x11); // sleep out
simon 0:ff874f85ed33 92 command(0x3A); // column mode
simon 0:ff874f85ed33 93 data(0x05);
simon 0:ff874f85ed33 94 command(0x36); // madctl
simon 0:ff874f85ed33 95 data(0x60); // vertical RAM, flip x
simon 0:ff874f85ed33 96 command(0x25); // setcon
simon 0:ff874f85ed33 97 data(0x30);// contrast 0x30
simon 0:ff874f85ed33 98 wait_ms(2);
simon 0:ff874f85ed33 99 command(0x29);//DISPON
simon 0:ff874f85ed33 100 command(0x03);//BSTRON
simon 0:ff874f85ed33 101 break;
simon 0:ff874f85ed33 102 }
simon 0:ff874f85ed33 103
simon 0:ff874f85ed33 104 _cs = 1;
simon 0:ff874f85ed33 105
simon 0:ff874f85ed33 106 cls();
simon 0:ff874f85ed33 107 }
simon 0:ff874f85ed33 108
simon 0:ff874f85ed33 109 void NokiaLCD::command(int value) {
simon 0:ff874f85ed33 110 _spi.write(value & 0xFF);
simon 0:ff874f85ed33 111 }
simon 0:ff874f85ed33 112
simon 0:ff874f85ed33 113 void NokiaLCD::data(int value) {
simon 0:ff874f85ed33 114 _spi.write(value | 0x100);
simon 0:ff874f85ed33 115 }
simon 0:ff874f85ed33 116
simon 0:ff874f85ed33 117 void NokiaLCD::_window(int x, int y, int width, int height) {
ichoudhury6 3:ea0c085881f3 118 int x1 = x + 0;
simon 0:ff874f85ed33 119 int y1 = y + 0;
simon 0:ff874f85ed33 120 int x2 = x1 + width - 1;
simon 0:ff874f85ed33 121 int y2 = y1 + height - 1;
simon 0:ff874f85ed33 122
simon 0:ff874f85ed33 123 switch (_type) {
simon 0:ff874f85ed33 124 case LCD6100:
simon 0:ff874f85ed33 125 case LCD6610:
simon 0:ff874f85ed33 126 command(0x15); // column
simon 0:ff874f85ed33 127 data(x1);
simon 0:ff874f85ed33 128 data(x2);
simon 0:ff874f85ed33 129 command(0x75); // row
simon 0:ff874f85ed33 130 data(y1);
simon 0:ff874f85ed33 131 data(y2);
simon 0:ff874f85ed33 132 command(0x5C); // start write to ram
simon 0:ff874f85ed33 133 break;
simon 0:ff874f85ed33 134 case PCF8833:
simon 0:ff874f85ed33 135 command(0x2A); // column
simon 0:ff874f85ed33 136 data(x1);
simon 0:ff874f85ed33 137 data(x2);
simon 0:ff874f85ed33 138 command(0x2B); // row
simon 0:ff874f85ed33 139 data(y1);
simon 0:ff874f85ed33 140 data(y2);
simon 0:ff874f85ed33 141 command(0x2C); // start write to ram
simon 0:ff874f85ed33 142 break;
simon 0:ff874f85ed33 143 }
simon 0:ff874f85ed33 144 }
simon 0:ff874f85ed33 145
simon 0:ff874f85ed33 146 void NokiaLCD::_putp(int colour) {
simon 0:ff874f85ed33 147 int gr = ((colour >> 20) & 0x0F)
simon 0:ff874f85ed33 148 | ((colour >> 8 ) & 0xF0);
simon 0:ff874f85ed33 149 int nb = ((colour >> 4 ) & 0x0F);
simon 0:ff874f85ed33 150 data(nb);
simon 0:ff874f85ed33 151 data(gr);
simon 0:ff874f85ed33 152 }
simon 0:ff874f85ed33 153
simon 0:ff874f85ed33 154 const unsigned char FONT8x8[97][8] = {
simon 0:ff874f85ed33 155 0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char
simon 0:ff874f85ed33 156 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
simon 0:ff874f85ed33 157 0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // !
simon 0:ff874f85ed33 158 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // "
simon 0:ff874f85ed33 159 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // #
simon 0:ff874f85ed33 160 0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $
simon 0:ff874f85ed33 161 0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // %
simon 0:ff874f85ed33 162 0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // &
simon 0:ff874f85ed33 163 0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // '
simon 0:ff874f85ed33 164 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // (
simon 0:ff874f85ed33 165 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // )
simon 0:ff874f85ed33 166 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // *
simon 0:ff874f85ed33 167 0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // +
simon 0:ff874f85ed33 168 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // ,
simon 0:ff874f85ed33 169 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // -
simon 0:ff874f85ed33 170 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // .
simon 0:ff874f85ed33 171 0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash)
simon 0:ff874f85ed33 172 0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30
simon 0:ff874f85ed33 173 0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1
simon 0:ff874f85ed33 174 0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2
simon 0:ff874f85ed33 175 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3
simon 0:ff874f85ed33 176 0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4
simon 0:ff874f85ed33 177 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5
simon 0:ff874f85ed33 178 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6
simon 0:ff874f85ed33 179 0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7
simon 0:ff874f85ed33 180 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8
simon 0:ff874f85ed33 181 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9
simon 0:ff874f85ed33 182 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // :
simon 0:ff874f85ed33 183 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ;
simon 0:ff874f85ed33 184 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // <
simon 0:ff874f85ed33 185 0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // =
simon 0:ff874f85ed33 186 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // >
simon 0:ff874f85ed33 187 0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ?
simon 0:ff874f85ed33 188 0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40
simon 0:ff874f85ed33 189 0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A
simon 0:ff874f85ed33 190 0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B
simon 0:ff874f85ed33 191 0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C
simon 0:ff874f85ed33 192 0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D
simon 0:ff874f85ed33 193 0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E
simon 0:ff874f85ed33 194 0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F
simon 0:ff874f85ed33 195 0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G
simon 0:ff874f85ed33 196 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H
simon 0:ff874f85ed33 197 0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I
simon 0:ff874f85ed33 198 0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J
simon 0:ff874f85ed33 199 0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K
simon 0:ff874f85ed33 200 0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L
simon 0:ff874f85ed33 201 0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M
simon 0:ff874f85ed33 202 0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N
simon 0:ff874f85ed33 203 0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O
simon 0:ff874f85ed33 204 0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50
simon 0:ff874f85ed33 205 0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q
simon 0:ff874f85ed33 206 0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R
simon 0:ff874f85ed33 207 0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S
simon 0:ff874f85ed33 208 0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T
simon 0:ff874f85ed33 209 0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U
simon 0:ff874f85ed33 210 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V
simon 0:ff874f85ed33 211 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W
simon 0:ff874f85ed33 212 0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X
simon 0:ff874f85ed33 213 0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y
simon 0:ff874f85ed33 214 0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z
simon 0:ff874f85ed33 215 0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [
simon 0:ff874f85ed33 216 0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash)
simon 0:ff874f85ed33 217 0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ]
simon 0:ff874f85ed33 218 0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^
simon 0:ff874f85ed33 219 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _
simon 0:ff874f85ed33 220 0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60
simon 0:ff874f85ed33 221 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a
simon 0:ff874f85ed33 222 0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b
simon 0:ff874f85ed33 223 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c
simon 0:ff874f85ed33 224 0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d
simon 0:ff874f85ed33 225 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e
simon 0:ff874f85ed33 226 0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f
simon 0:ff874f85ed33 227 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g
simon 0:ff874f85ed33 228 0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h
simon 0:ff874f85ed33 229 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i
simon 0:ff874f85ed33 230 0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j
simon 0:ff874f85ed33 231 0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k
simon 0:ff874f85ed33 232 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l
simon 0:ff874f85ed33 233 0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m
simon 0:ff874f85ed33 234 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n
simon 0:ff874f85ed33 235 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o
simon 0:ff874f85ed33 236 0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p
simon 0:ff874f85ed33 237 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q
simon 0:ff874f85ed33 238 0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r
simon 0:ff874f85ed33 239 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s
simon 0:ff874f85ed33 240 0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t
simon 0:ff874f85ed33 241 0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u
simon 0:ff874f85ed33 242 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v
simon 0:ff874f85ed33 243 0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w
simon 0:ff874f85ed33 244 0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x
simon 0:ff874f85ed33 245 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y
simon 0:ff874f85ed33 246 0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z
simon 0:ff874f85ed33 247 0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // {
simon 0:ff874f85ed33 248 0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // |
simon 0:ff874f85ed33 249 0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // }
simon 0:ff874f85ed33 250 0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~
simon 0:ff874f85ed33 251 0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00
simon 0:ff874f85ed33 252 }; // DEL
simon 0:ff874f85ed33 253
simon 0:ff874f85ed33 254 void NokiaLCD::locate(int column, int row) {
simon 0:ff874f85ed33 255 _column = column;
simon 0:ff874f85ed33 256 _row = row;
simon 0:ff874f85ed33 257 }
simon 0:ff874f85ed33 258
simon 0:ff874f85ed33 259 void NokiaLCD::newline() {
simon 0:ff874f85ed33 260 _column = 0;
simon 0:ff874f85ed33 261 _row++;
simon 0:ff874f85ed33 262 if (_row >= _rows) {
simon 0:ff874f85ed33 263 _row = 0;
simon 0:ff874f85ed33 264 }
simon 0:ff874f85ed33 265 }
simon 0:ff874f85ed33 266
simon 0:ff874f85ed33 267 int NokiaLCD::_putc(int value) {
simon 0:ff874f85ed33 268 int x = _column * 8; // FIXME: Char sizes
simon 0:ff874f85ed33 269 int y = _row * 8;
simon 0:ff874f85ed33 270 bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0]));
simon 0:ff874f85ed33 271
simon 0:ff874f85ed33 272 _column++;
simon 0:ff874f85ed33 273
simon 0:ff874f85ed33 274 if (_column >= NOKIALCD_COLS) {
simon 0:ff874f85ed33 275 _row++;
simon 0:ff874f85ed33 276 _column = 0;
simon 0:ff874f85ed33 277 }
simon 0:ff874f85ed33 278
simon 0:ff874f85ed33 279 if (_row >= NOKIALCD_ROWS) {
simon 0:ff874f85ed33 280 _row = 0;
simon 0:ff874f85ed33 281 }
simon 0:ff874f85ed33 282
simon 0:ff874f85ed33 283 return value;
simon 0:ff874f85ed33 284 }
simon 0:ff874f85ed33 285
simon 0:ff874f85ed33 286 void NokiaLCD::cls() {
simon 0:ff874f85ed33 287 fill(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT, _background);
simon 0:ff874f85ed33 288 _row = 0;
simon 0:ff874f85ed33 289 _column = 0;
simon 0:ff874f85ed33 290 }
simon 0:ff874f85ed33 291
simon 0:ff874f85ed33 292
simon 0:ff874f85ed33 293 void NokiaLCD::window(int x, int y, int width, int height) {
simon 0:ff874f85ed33 294 _cs = 0;
simon 0:ff874f85ed33 295 _window(x, y, width, height);
simon 0:ff874f85ed33 296 _cs = 1;
simon 0:ff874f85ed33 297 }
simon 0:ff874f85ed33 298
simon 0:ff874f85ed33 299 void NokiaLCD::putp(int colour) {
simon 0:ff874f85ed33 300 _cs = 0;
simon 0:ff874f85ed33 301 _putp(colour);
simon 0:ff874f85ed33 302 _cs = 1;
simon 0:ff874f85ed33 303 }
simon 0:ff874f85ed33 304
simon 0:ff874f85ed33 305 void NokiaLCD::pixel(int x, int y, int colour) {
simon 0:ff874f85ed33 306 _cs = 0;
simon 0:ff874f85ed33 307 _window(x, y, 1, 1);
simon 0:ff874f85ed33 308 _putp(colour);
simon 0:ff874f85ed33 309 _cs = 1;
simon 0:ff874f85ed33 310 }
simon 0:ff874f85ed33 311
simon 0:ff874f85ed33 312 void NokiaLCD::fill(int x, int y, int width, int height, int colour) {
simon 0:ff874f85ed33 313 _cs = 0;
simon 0:ff874f85ed33 314 _window(x, y, width, height);
simon 1:8f005b0dcfa7 315 switch (_type) {
simon 1:8f005b0dcfa7 316 case LCD6100:
simon 1:8f005b0dcfa7 317 case PCF8833:
simon 1:8f005b0dcfa7 318 for (int i=0; i<width*height; i++) {
simon 1:8f005b0dcfa7 319 _putp(colour);
simon 1:8f005b0dcfa7 320 }
simon 1:8f005b0dcfa7 321 break;
simon 1:8f005b0dcfa7 322 case LCD6610:
simon 1:8f005b0dcfa7 323 for (int i=0; i<width*height/2; i++) {
simon 1:8f005b0dcfa7 324 int r4 = (colour >> (16 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 325 int g4 = (colour >> (8 + 4)) & 0xF;
simon 1:8f005b0dcfa7 326 int b4 = (colour >> (0 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 327 int d1 = (r4 << 4) | g4;
simon 1:8f005b0dcfa7 328 int d2 = (b4 << 4) | r4;
simon 1:8f005b0dcfa7 329 int d3 = (g4 << 4) | b4;
simon 1:8f005b0dcfa7 330 data(d1);
ichoudhury6 3:ea0c085881f3 331 data(d2);
ichoudhury6 3:ea0c085881f3 332 data(d3);
simon 1:8f005b0dcfa7 333 }
simon 1:8f005b0dcfa7 334 break;
simon 0:ff874f85ed33 335 }
simon 0:ff874f85ed33 336 _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT);
simon 0:ff874f85ed33 337 _cs = 1;
simon 0:ff874f85ed33 338 }
simon 0:ff874f85ed33 339
simon 0:ff874f85ed33 340 void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) {
simon 0:ff874f85ed33 341 _cs = 0;
simon 0:ff874f85ed33 342 _window(x, y, width, height);
simon 1:8f005b0dcfa7 343
simon 1:8f005b0dcfa7 344 switch (_type) {
simon 1:8f005b0dcfa7 345 case LCD6100:
simon 1:8f005b0dcfa7 346 case PCF8833:
simon 1:8f005b0dcfa7 347 for (int i=0; i<width*height; i++) {
simon 1:8f005b0dcfa7 348 _putp(colour[i]);
simon 1:8f005b0dcfa7 349 }
simon 1:8f005b0dcfa7 350 break;
simon 1:8f005b0dcfa7 351 case LCD6610:
simon 1:8f005b0dcfa7 352 for (int i=0; i<width*height/2; i++) {
ichoudhury6 3:ea0c085881f3 353 int r41 = (colour[i*2] >> (16 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 354 int g41 = (colour[i*2] >> (8 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 355 int b41 = (colour[i*2] >> (0 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 356
simon 1:8f005b0dcfa7 357 int r42 = (colour[i*2+1] >> (16 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 358 int g42 = (colour[i*2+1] >> (8 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 359 int b42 = (colour[i*2+1] >> (0 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 360 int d1 = (r41 << 4) | g41;
ichoudhury6 3:ea0c085881f3 361 int d2 = (b41 << 4) | r42;
ichoudhury6 3:ea0c085881f3 362 int d3 = (g42 << 4) | b42;
ichoudhury6 3:ea0c085881f3 363 data(d1);
ichoudhury6 3:ea0c085881f3 364 data(d2);
ichoudhury6 3:ea0c085881f3 365 data(d3);
simon 1:8f005b0dcfa7 366 }
simon 1:8f005b0dcfa7 367 break;
simon 1:8f005b0dcfa7 368 }
simon 0:ff874f85ed33 369 _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT);
simon 0:ff874f85ed33 370 _cs = 1;
simon 0:ff874f85ed33 371 }
simon 0:ff874f85ed33 372
simon 0:ff874f85ed33 373 void NokiaLCD::bitblit(int x, int y, int width, int height, const char* bitstream) {
simon 0:ff874f85ed33 374 _cs = 0;
simon 0:ff874f85ed33 375 _window(x, y, width, height);
simon 1:8f005b0dcfa7 376
simon 1:8f005b0dcfa7 377 switch (_type) {
simon 1:8f005b0dcfa7 378 case LCD6100:
simon 1:8f005b0dcfa7 379 case PCF8833:
simon 1:8f005b0dcfa7 380 for (int i=0; i<height*width; i++) {
simon 1:8f005b0dcfa7 381 int byte = i / 8;
simon 1:8f005b0dcfa7 382 int bit = i % 8;
simon 1:8f005b0dcfa7 383 int colour = ((bitstream[byte] << bit) & 0x80) ? _foreground : _background;
simon 1:8f005b0dcfa7 384 _putp(colour);
simon 1:8f005b0dcfa7 385 }
simon 1:8f005b0dcfa7 386 break;
simon 1:8f005b0dcfa7 387 case LCD6610:
simon 1:8f005b0dcfa7 388 for(int i=0; i<height*width/2; i++) {
simon 1:8f005b0dcfa7 389 int byte1 = (i*2) / 8;
simon 1:8f005b0dcfa7 390 int bit1 = (i*2) % 8;
ichoudhury6 3:ea0c085881f3 391 int colour1 = ((bitstream[byte1] << bit1) & 0x80) ? _foreground : _background;
ichoudhury6 3:ea0c085881f3 392 int byte2 = (i*2+1) / 8;
simon 1:8f005b0dcfa7 393 int bit2 = (i*2+1) % 8;
simon 1:8f005b0dcfa7 394 int colour2 = ((bitstream[byte2] << bit2) & 0x80) ? _foreground : _background;
ichoudhury6 3:ea0c085881f3 395
ichoudhury6 3:ea0c085881f3 396 int r41 = (colour1 >> (16 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 397 int g41 = (colour1 >> (8 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 398 int b41 = (colour1 >> (0 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 399
simon 1:8f005b0dcfa7 400 int r42 = (colour2 >> (16 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 401 int g42 = (colour2 >> (8 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 402 int b42 = (colour2 >> (0 + 4)) & 0xF;
ichoudhury6 3:ea0c085881f3 403 int d1 = (r41 << 4) | g41;
ichoudhury6 3:ea0c085881f3 404 int d2 = (b41 << 4) | r42;
ichoudhury6 3:ea0c085881f3 405 int d3 = (g42 << 4) | b42;
ichoudhury6 3:ea0c085881f3 406 data(d1);
ichoudhury6 3:ea0c085881f3 407 data(d2);
ichoudhury6 3:ea0c085881f3 408 data(d3);
simon 1:8f005b0dcfa7 409 }
simon 1:8f005b0dcfa7 410 break;
simon 1:8f005b0dcfa7 411 }
simon 0:ff874f85ed33 412 _window(0, 0, _width, _height);
simon 0:ff874f85ed33 413 _cs = 1;
simon 0:ff874f85ed33 414 }
simon 0:ff874f85ed33 415
simon 0:ff874f85ed33 416 void NokiaLCD::foreground(int c) {
simon 0:ff874f85ed33 417 _foreground = c;
simon 0:ff874f85ed33 418 }
simon 0:ff874f85ed33 419
simon 0:ff874f85ed33 420 void NokiaLCD::background(int c) {
simon 0:ff874f85ed33 421 _background = c;
simon 0:ff874f85ed33 422 }
simon 0:ff874f85ed33 423
simon 0:ff874f85ed33 424 int NokiaLCD::width() {
simon 0:ff874f85ed33 425 return NOKIALCD_WIDTH;
simon 0:ff874f85ed33 426 }
simon 0:ff874f85ed33 427
simon 0:ff874f85ed33 428 int NokiaLCD::height() {
simon 0:ff874f85ed33 429 return NOKIALCD_HEIGHT;
simon 0:ff874f85ed33 430 }
simon 0:ff874f85ed33 431
simon 0:ff874f85ed33 432 int NokiaLCD::columns() {
simon 0:ff874f85ed33 433 return NOKIALCD_COLS;
simon 0:ff874f85ed33 434 }
simon 0:ff874f85ed33 435
simon 0:ff874f85ed33 436 int NokiaLCD::rows() {
simon 0:ff874f85ed33 437 return NOKIALCD_ROWS;
simon 0:ff874f85ed33 438 }