Poker code for primary Mbed

Dependencies:   NokiaLCD mbed

Committer:
wjenkins7
Date:
Wed Dec 11 07:04:52 2013 +0000
Revision:
0:b9eebf731cbe
Mbed Poker Primary

Who changed what in which revision?

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