This program is for mbed-Geiger counter system. It use OLED module, GPS module (with RTC), TextLCD, SD FileSystem and some Interrupt pin.

Dependencies:   TextLCD mbed

Committer:
y_notsu
Date:
Sat Jul 02 22:05:27 2011 +0000
Revision:
0:97f8ed953c0d
rev.0.0

Who changed what in which revision?

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