Rewrite the NokiaLCD lib with SWSPI lib in order to fit in with 9 bits SPI mode

Dependents:   KL46Z_NokiaLCD

Committer:
jppang
Date:
Tue Feb 18 04:19:55 2014 +0000
Revision:
0:34125ddb025e
Child:
1:133b9b91ca6b
Rewrite the NokiaLCD lib by using the SWSPI lib in order to fit in with 9 bits SPI mode.

Who changed what in which revision?

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