Packed 12bit Raw image file load to display to Nokia LCD. Add function "blit12" to Nokia LCD for native 12bit color buffer.

Dependencies:   mbed

Committer:
sakai
Date:
Thu Feb 10 14:44:49 2011 +0000
Revision:
4:f746ea56e891
Parent:
2:7cf441bf092d

        

Who changed what in which revision?

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