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

Dependents:   KL46Z_NokiaLCD

Committer:
jppang
Date:
Wed Feb 19 04:18:43 2014 +0000
Revision:
1:133b9b91ca6b
Parent:
0:34125ddb025e
Child:
2:046bfae72c0c
modified some commands

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