Tedd OKANO / Mbed 2 deprecated MARY_CAMERA_Hello

Dependencies:   MARY_CAMERA NokiaLCD mbed

Committer:
okano
Date:
Mon Mar 24 04:32:18 2014 +0000
Revision:
32:bf038420f809
Parent:
0:1062142e5718
test code

Who changed what in which revision?

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