A TextDisplay driver that supports graphical displays using on of the SED133x conrtrolers. Allows stdout and stderr output to be redirected to the display.

Committer:
llagendijk
Date:
Sat Jan 29 20:48:08 2011 +0000
Revision:
6:2f8aed3d2be4
Child:
7:d79600310cfe
Documentation fixes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
llagendijk 6:2f8aed3d2be4 1 // mbed sed1330LCD Library Base Class
llagendijk 6:2f8aed3d2be4 2 // Based on TextLCD (Copyright (c) 2007-2009 sford)
llagendijk 6:2f8aed3d2be4 3 // Released under the MIT License: http://mbed.org/license/mit
llagendijk 6:2f8aed3d2be4 4 // Author: louis Lagendijk
llagendijk 6:2f8aed3d2be4 5 //
llagendijk 6:2f8aed3d2be4 6 // Supports SED1330 (and probably the SED1335 and SED1336).
llagendijk 6:2f8aed3d2be4 7 // Based on datasheet 268-0.4
llagendijk 6:2f8aed3d2be4 8 //
llagendijk 6:2f8aed3d2be4 9 // This code drives the display using the 8080 interface:
llagendijk 6:2f8aed3d2be4 10 // SEL1 = 0
llagendijk 6:2f8aed3d2be4 11 // SEL2 = 0
llagendijk 6:2f8aed3d2be4 12 // These things require a lot of pins:
llagendijk 6:2f8aed3d2be4 13 // 8 bits for the databus +
llagendijk 6:2f8aed3d2be4 14 // *Reset (1)
llagendijk 6:2f8aed3d2be4 15 // *Read
llagendijk 6:2f8aed3d2be4 16 // *Write
llagendijk 6:2f8aed3d2be4 17 // *ChipSelect
llagendijk 6:2f8aed3d2be4 18 // A0
llagendijk 6:2f8aed3d2be4 19 //
llagendijk 6:2f8aed3d2be4 20 // Note(1): Reset is a Schmitt trigger input that can normally not be driven from
llagendijk 6:2f8aed3d2be4 21 // an MBED output pin. We just pull it high with a 5k resistor feeding a 10uF elco
llagendijk 6:2f8aed3d2be4 22 // and the reset pin. This will reset the display once. Right now we do not use
llagendijk 6:2f8aed3d2be4 23 // the reset pin.
llagendijk 6:2f8aed3d2be4 24 //
llagendijk 6:2f8aed3d2be4 25 // Character sizes can be set as desired (default 6*8). The SED seems to use a
llagendijk 6:2f8aed3d2be4 26 // 5*7 font internally other font sizes use additional white space around the
llagendijk 6:2f8aed3d2be4 27 // characters.
llagendijk 6:2f8aed3d2be4 28 // Font widths of more than 8 pixels are not supported.
llagendijk 6:2f8aed3d2be4 29 // The actual size in characters is caluclated from the horizontal/ vertical
llagendijk 6:2f8aed3d2be4 30 // resolution and the specified font size.
llagendijk 6:2f8aed3d2be4 31 // Recommended fontsize = 6*9 or 6*10
llagendijk 6:2f8aed3d2be4 32 //
llagendijk 6:2f8aed3d2be4 33 #include "mbed.h"
llagendijk 6:2f8aed3d2be4 34 #include "Sed133xLCD.h"
llagendijk 6:2f8aed3d2be4 35
llagendijk 6:2f8aed3d2be4 36 //
llagendijk 6:2f8aed3d2be4 37 //memory layout, datasheet shows 64kBit memory, 8 kByte * 8
llagendijk 6:2f8aed3d2be4 38 // text screen, reserve 2k
llagendijk 6:2f8aed3d2be4 39 //
llagendijk 6:2f8aed3d2be4 40 #define TEXT_SCREEN_START (int) 0
llagendijk 6:2f8aed3d2be4 41 // reserve one line of text extra as parts of it may be shown
llagendijk 6:2f8aed3d2be4 42 #define TEXT_SCREEN_SIZE (int) (_columns * (_rows + 1))
llagendijk 6:2f8aed3d2be4 43 #define TEXT_SCREEN_RESERVED (int) (2 * TEXT_SCREEN_SIZE)
llagendijk 6:2f8aed3d2be4 44
llagendijk 6:2f8aed3d2be4 45 // Graphical screen, reserve 4kB, not used
llagendijk 6:2f8aed3d2be4 46
llagendijk 6:2f8aed3d2be4 47 #define GRAPHICAL_SCREEN_START (int) (TEXT_SCREEN_START + TEXT_SCREEN_RESERVED)
llagendijk 6:2f8aed3d2be4 48 #define GRAPHICAL_SCREEN_SIZE (int) (_hor_dots * _vert_dots / 8)
llagendijk 6:2f8aed3d2be4 49 #define GRAPHICAL_SCREEN_RESERVED (int) 0x1000
llagendijk 6:2f8aed3d2be4 50
llagendijk 6:2f8aed3d2be4 51 // char. gen. RAM, take whatever is left, not used
llagendijk 6:2f8aed3d2be4 52
llagendijk 6:2f8aed3d2be4 53 #define CG_RAM_START (int) (GRAPHICAL_SCREEN_START + GRAPHICAL_SCREEN_RESERVED)
llagendijk 6:2f8aed3d2be4 54 // reserve room for 32 chars * 8 lines of 8 dots, only 32 can be squeeed in
llagendijk 6:2f8aed3d2be4 55 #define CG_RAM_SIZE (int) (32 * 8 * 8)
llagendijk 6:2f8aed3d2be4 56 #define CG_RAM_RESERVED (int)(0x8000 - CG_RAM_START)
llagendijk 6:2f8aed3d2be4 57
llagendijk 6:2f8aed3d2be4 58
llagendijk 6:2f8aed3d2be4 59 commandName_t commandNameTab[] = {
llagendijk 6:2f8aed3d2be4 60 { SYSTEM_SET, "System set" },
llagendijk 6:2f8aed3d2be4 61 { SET_MEM, "Set memory" },
llagendijk 6:2f8aed3d2be4 62 { GET_MEM, "Get memory" },
llagendijk 6:2f8aed3d2be4 63 { SCROLL_SET, "Scroll set" },
llagendijk 6:2f8aed3d2be4 64 { SET_CURSOR, "Set cursor" },
llagendijk 6:2f8aed3d2be4 65 { GET_CURSOR, "Get cursor" },
llagendijk 6:2f8aed3d2be4 66 { CURSOR_DIR_RIGHT, "Cursor right" },
llagendijk 6:2f8aed3d2be4 67 { CURSOR_DIR_LEFT, "Cursor left" },
llagendijk 6:2f8aed3d2be4 68 { CURSOR_DIR_UP, "Cursor up" },
llagendijk 6:2f8aed3d2be4 69 { CURSOR_DIR_DOWN, "Cursor down" },
llagendijk 6:2f8aed3d2be4 70 { SLEEP_IN, "Sleep in" },
llagendijk 6:2f8aed3d2be4 71 { DISPLAY_OFF, "Display off" },
llagendijk 6:2f8aed3d2be4 72 { DISPLAY_ON, "Display on" },
llagendijk 6:2f8aed3d2be4 73 { HORIZONTAL_SCROLL_POSITION, "Horizontal scroll pos" },
llagendijk 6:2f8aed3d2be4 74 { OVERLAY_FORMAT, "Display format" },
llagendijk 6:2f8aed3d2be4 75 { CHAR_GEN_RAM_ADDR, "Char gen. ram address" },
llagendijk 6:2f8aed3d2be4 76 { CURSOR_FORM, "Cursor form" },
llagendijk 6:2f8aed3d2be4 77 { NO_COMMAND, ""}
llagendijk 6:2f8aed3d2be4 78 };
llagendijk 6:2f8aed3d2be4 79
llagendijk 6:2f8aed3d2be4 80 char * Sed133xLCD::commandName(command_t command_val) {
llagendijk 6:2f8aed3d2be4 81 int i;
llagendijk 6:2f8aed3d2be4 82 for (i=0; commandNameTab[i].value != NO_COMMAND; i++) {
llagendijk 6:2f8aed3d2be4 83 if (commandNameTab[i].value == command_val) {
llagendijk 6:2f8aed3d2be4 84 return commandNameTab[i].text;
llagendijk 6:2f8aed3d2be4 85 }
llagendijk 6:2f8aed3d2be4 86 }
llagendijk 6:2f8aed3d2be4 87 return NULL;
llagendijk 6:2f8aed3d2be4 88 }
llagendijk 6:2f8aed3d2be4 89
llagendijk 6:2f8aed3d2be4 90 /* low level interface functions
llagendijk 6:2f8aed3d2be4 91 */
llagendijk 6:2f8aed3d2be4 92
llagendijk 6:2f8aed3d2be4 93 void Sed133xLCD::busWait() {
llagendijk 6:2f8aed3d2be4 94 wait_us(0);
llagendijk 6:2f8aed3d2be4 95 }
llagendijk 6:2f8aed3d2be4 96
llagendijk 6:2f8aed3d2be4 97 void Sed133xLCD::resetSed(void) {
llagendijk 6:2f8aed3d2be4 98
llagendijk 6:2f8aed3d2be4 99 /* send reset */
llagendijk 6:2f8aed3d2be4 100 _reset = 1;
llagendijk 6:2f8aed3d2be4 101 wait_ms(50);
llagendijk 6:2f8aed3d2be4 102 _reset = 0;
llagendijk 6:2f8aed3d2be4 103 /* initialize databus */
llagendijk 6:2f8aed3d2be4 104
llagendijk 6:2f8aed3d2be4 105 _dataBus.mode(PullNone);
llagendijk 6:2f8aed3d2be4 106
llagendijk 6:2f8aed3d2be4 107 /* initialize control pins */
llagendijk 6:2f8aed3d2be4 108 _reset = 0;
llagendijk 6:2f8aed3d2be4 109 _nRead = _nWrite = 1;
llagendijk 6:2f8aed3d2be4 110
llagendijk 6:2f8aed3d2be4 111 /* wait for reset to complete */
llagendijk 6:2f8aed3d2be4 112 wait_ms(50);
llagendijk 6:2f8aed3d2be4 113 }
llagendijk 6:2f8aed3d2be4 114
llagendijk 6:2f8aed3d2be4 115 void Sed133xLCD::sendByte(dataType_t type, uint8_t data) {
llagendijk 6:2f8aed3d2be4 116
llagendijk 6:2f8aed3d2be4 117 /* sends one byte to the SED133X. A0 is set depending to the type of data
llagendijk 6:2f8aed3d2be4 118 to be sent (data or command)
llagendijk 6:2f8aed3d2be4 119 */
llagendijk 6:2f8aed3d2be4 120 _addr0 = type;
llagendijk 6:2f8aed3d2be4 121 _dataBus.output();
llagendijk 6:2f8aed3d2be4 122 _dataBus = data;
llagendijk 6:2f8aed3d2be4 123 Sed133xLCD::busWait();
llagendijk 6:2f8aed3d2be4 124 _nSelect = 0;
llagendijk 6:2f8aed3d2be4 125 _nWrite = 0;
llagendijk 6:2f8aed3d2be4 126 Sed133xLCD::busWait();
llagendijk 6:2f8aed3d2be4 127 _nWrite = 1;
llagendijk 6:2f8aed3d2be4 128 _nSelect = 1;
llagendijk 6:2f8aed3d2be4 129 Sed133xLCD::busWait();
llagendijk 6:2f8aed3d2be4 130 }
llagendijk 6:2f8aed3d2be4 131
llagendijk 6:2f8aed3d2be4 132 void Sed133xLCD::sendCommand(uint8_t data) {
llagendijk 6:2f8aed3d2be4 133 sendByte(t_command, data);
llagendijk 6:2f8aed3d2be4 134 }
llagendijk 6:2f8aed3d2be4 135
llagendijk 6:2f8aed3d2be4 136 void Sed133xLCD::sendData(uint8_t data) {
llagendijk 6:2f8aed3d2be4 137 sendByte(t_data, data);
llagendijk 6:2f8aed3d2be4 138 }
llagendijk 6:2f8aed3d2be4 139
llagendijk 6:2f8aed3d2be4 140 uint8_t Sed133xLCD::getByte(dataType_t type) {
llagendijk 6:2f8aed3d2be4 141
llagendijk 6:2f8aed3d2be4 142 /* reads one byte from the SED133X. A0 is set according to the type of data
llagendijk 6:2f8aed3d2be4 143 to be retrieved (data or command)
llagendijk 6:2f8aed3d2be4 144 */
llagendijk 6:2f8aed3d2be4 145
llagendijk 6:2f8aed3d2be4 146 uint8_t data;
llagendijk 6:2f8aed3d2be4 147
llagendijk 6:2f8aed3d2be4 148 _addr0 = type;
llagendijk 6:2f8aed3d2be4 149 _dataBus.input();
llagendijk 6:2f8aed3d2be4 150 busWait();
llagendijk 6:2f8aed3d2be4 151 _nRead = 0;
llagendijk 6:2f8aed3d2be4 152 Sed133xLCD::busWait();
llagendijk 6:2f8aed3d2be4 153 data = _dataBus;
llagendijk 6:2f8aed3d2be4 154 _nRead = 1;
llagendijk 6:2f8aed3d2be4 155 Sed133xLCD::busWait();
llagendijk 6:2f8aed3d2be4 156 return data;
llagendijk 6:2f8aed3d2be4 157 }
llagendijk 6:2f8aed3d2be4 158
llagendijk 6:2f8aed3d2be4 159
llagendijk 6:2f8aed3d2be4 160 /* Send SED133x commands
llagendijk 6:2f8aed3d2be4 161 */
llagendijk 6:2f8aed3d2be4 162
llagendijk 6:2f8aed3d2be4 163 void Sed133xLCD::systemSet(void) {
llagendijk 6:2f8aed3d2be4 164
llagendijk 6:2f8aed3d2be4 165 sendCommand(SYSTEM_SET);
llagendijk 6:2f8aed3d2be4 166
llagendijk 6:2f8aed3d2be4 167 // p1
llagendijk 6:2f8aed3d2be4 168 uint8_t M0 = 0; // Internal char. generator
llagendijk 6:2f8aed3d2be4 169 uint8_t M1 = 0; // CGRAM1, 32 characters
llagendijk 6:2f8aed3d2be4 170 uint8_t M2 = 0; // 8 pixel character height
llagendijk 6:2f8aed3d2be4 171 uint8_t WS = 0; // single panel drive
llagendijk 6:2f8aed3d2be4 172 uint8_t IV = 1; // no top-line correction
llagendijk 6:2f8aed3d2be4 173 uint8_t TL = 0; // LCD mode
llagendijk 6:2f8aed3d2be4 174 uint8_t DR = 0; // normal operation (single panel)
llagendijk 6:2f8aed3d2be4 175 sendData((DR << 7) | (TL << 6) | (IV << 5) | (1 << 4) | (WS << 3) | (M2 << 2) | (M1 << 1) | M0);
llagendijk 6:2f8aed3d2be4 176
llagendijk 6:2f8aed3d2be4 177 // p2
llagendijk 6:2f8aed3d2be4 178 uint8_t WF = 1; // usually 1, 16 line AC drive
llagendijk 6:2f8aed3d2be4 179 uint8_t FX = _char_width;
llagendijk 6:2f8aed3d2be4 180 sendData((WF << 7) | (FX - 1));
llagendijk 6:2f8aed3d2be4 181
llagendijk 6:2f8aed3d2be4 182 // p3 FY: Char height
llagendijk 6:2f8aed3d2be4 183 sendData(_char_height - 1);
llagendijk 6:2f8aed3d2be4 184
llagendijk 6:2f8aed3d2be4 185 // p4 CR: Bytes (not chars!) per line!
llagendijk 6:2f8aed3d2be4 186 uint8_t CR = ((_columns -1) * (_char_width > 8 ? 2 : 1) );
llagendijk 6:2f8aed3d2be4 187 sendData(CR);
llagendijk 6:2f8aed3d2be4 188
llagendijk 6:2f8aed3d2be4 189 // p5 TCR: length of line incl hor. blanking
llagendijk 6:2f8aed3d2be4 190 sendData(CR + 4);
llagendijk 6:2f8aed3d2be4 191
llagendijk 6:2f8aed3d2be4 192 // LF, lines per frame
llagendijk 6:2f8aed3d2be4 193 sendData(_vert_dots - 1);
llagendijk 6:2f8aed3d2be4 194
llagendijk 6:2f8aed3d2be4 195 // AP graphical display: size of a scan line
llagendijk 6:2f8aed3d2be4 196 int AP = ((_char_width > 8 ? 2 : 1) * (_columns));
llagendijk 6:2f8aed3d2be4 197 sendData(AP & 0xff);
llagendijk 6:2f8aed3d2be4 198 sendData(AP >> 8);
llagendijk 6:2f8aed3d2be4 199 }
llagendijk 6:2f8aed3d2be4 200
llagendijk 6:2f8aed3d2be4 201 void Sed133xLCD::scrollSet(void) {
llagendijk 6:2f8aed3d2be4 202
llagendijk 6:2f8aed3d2be4 203 /* allocate Screen 1 at 0 */
llagendijk 6:2f8aed3d2be4 204 int SA1 = TEXT_SCREEN_START;
llagendijk 6:2f8aed3d2be4 205
llagendijk 6:2f8aed3d2be4 206 /* Start of graphical screen */
llagendijk 6:2f8aed3d2be4 207 int SA2 = GRAPHICAL_SCREEN_START;
llagendijk 6:2f8aed3d2be4 208
llagendijk 6:2f8aed3d2be4 209 sendCommand(SCROLL_SET);
llagendijk 6:2f8aed3d2be4 210 /* SAD 1 Low */
llagendijk 6:2f8aed3d2be4 211 sendData(SA1 & 255);
llagendijk 6:2f8aed3d2be4 212 /* SAD 1 high */
llagendijk 6:2f8aed3d2be4 213 sendData(SA1 >> 8);
llagendijk 6:2f8aed3d2be4 214 /* SL 1 */
llagendijk 6:2f8aed3d2be4 215 sendData(_vert_dots -1);
llagendijk 6:2f8aed3d2be4 216 /* SAD 2 low */
llagendijk 6:2f8aed3d2be4 217 sendData( SA2 & 255);
llagendijk 6:2f8aed3d2be4 218 /* SAD 2 high */
llagendijk 6:2f8aed3d2be4 219 sendData( SA2 >> 8);
llagendijk 6:2f8aed3d2be4 220 /* SL 2 */
llagendijk 6:2f8aed3d2be4 221 sendData( _vert_dots -1);
llagendijk 6:2f8aed3d2be4 222 }
llagendijk 6:2f8aed3d2be4 223
llagendijk 6:2f8aed3d2be4 224 void Sed133xLCD::horizontalScrollPosition(void) {
llagendijk 6:2f8aed3d2be4 225
llagendijk 6:2f8aed3d2be4 226 sendCommand(HORIZONTAL_SCROLL_POSITION);
llagendijk 6:2f8aed3d2be4 227 sendData( 0x0); /* no offset */
llagendijk 6:2f8aed3d2be4 228 }
llagendijk 6:2f8aed3d2be4 229
llagendijk 6:2f8aed3d2be4 230 void Sed133xLCD::overlayFormat(void) {
llagendijk 6:2f8aed3d2be4 231
llagendijk 6:2f8aed3d2be4 232 sendCommand(OVERLAY_FORMAT);
llagendijk 6:2f8aed3d2be4 233
llagendijk 6:2f8aed3d2be4 234 int MX = 0; /* 0 = logical OR between layers, 1 is exclusive OR */
llagendijk 6:2f8aed3d2be4 235 int DM1 = 0; /* Screen block 1: text mode */
llagendijk 6:2f8aed3d2be4 236 int DM2 = 0; /* screen block 3: text mode */
llagendijk 6:2f8aed3d2be4 237 int OV = 0; /* 2 layer compositioon */
llagendijk 6:2f8aed3d2be4 238
llagendijk 6:2f8aed3d2be4 239 sendData( (OV << 4) | (DM2 << 3) | (DM1 << 2) |MX);
llagendijk 6:2f8aed3d2be4 240 }
llagendijk 6:2f8aed3d2be4 241
llagendijk 6:2f8aed3d2be4 242 void Sed133xLCD::cursorDirection(void) {
llagendijk 6:2f8aed3d2be4 243 sendCommand(CURSOR_DIR_RIGHT);
llagendijk 6:2f8aed3d2be4 244 }
llagendijk 6:2f8aed3d2be4 245
llagendijk 6:2f8aed3d2be4 246 void Sed133xLCD::cursorForm(void) {
llagendijk 6:2f8aed3d2be4 247
llagendijk 6:2f8aed3d2be4 248 sendCommand(CURSOR_FORM);
llagendijk 6:2f8aed3d2be4 249
llagendijk 6:2f8aed3d2be4 250 /* cursor width is uint8_twidth - 3 pixels */
llagendijk 6:2f8aed3d2be4 251 sendData(_char_width - 3 - 1);
llagendijk 6:2f8aed3d2be4 252
llagendijk 6:2f8aed3d2be4 253 /* set block cursor as we are in graphical mode */
llagendijk 6:2f8aed3d2be4 254 int CM = 1;
llagendijk 6:2f8aed3d2be4 255
llagendijk 6:2f8aed3d2be4 256 /* cursor vertical size 7 pixels */
llagendijk 6:2f8aed3d2be4 257 int CRY = 7 - 1;
llagendijk 6:2f8aed3d2be4 258
llagendijk 6:2f8aed3d2be4 259 sendData( (CM << 7) | CRY);
llagendijk 6:2f8aed3d2be4 260 }
llagendijk 6:2f8aed3d2be4 261
llagendijk 6:2f8aed3d2be4 262 void Sed133xLCD::displayOn(void) {
llagendijk 6:2f8aed3d2be4 263
llagendijk 6:2f8aed3d2be4 264 sendCommand(DISPLAY_ON);
llagendijk 6:2f8aed3d2be4 265
llagendijk 6:2f8aed3d2be4 266 /* flash cursor? */
llagendijk 6:2f8aed3d2be4 267 uint8_t FC = 0; /* cursor off */
llagendijk 6:2f8aed3d2be4 268
llagendijk 6:2f8aed3d2be4 269 uint8_t layer1 = 1; /* on, no flashing */
llagendijk 6:2f8aed3d2be4 270 uint8_t layer2 = 0; /* off */
llagendijk 6:2f8aed3d2be4 271 uint8_t layer3 = 0; /* off */
llagendijk 6:2f8aed3d2be4 272
llagendijk 6:2f8aed3d2be4 273
llagendijk 6:2f8aed3d2be4 274 sendData((layer3 << 6) | (layer2 << 4) | (layer1 << 2) | FC);
llagendijk 6:2f8aed3d2be4 275 }
llagendijk 6:2f8aed3d2be4 276
llagendijk 6:2f8aed3d2be4 277 void Sed133xLCD::displayOff(void) {
llagendijk 6:2f8aed3d2be4 278
llagendijk 6:2f8aed3d2be4 279 sendCommand(DISPLAY_OFF);
llagendijk 6:2f8aed3d2be4 280 }
llagendijk 6:2f8aed3d2be4 281
llagendijk 6:2f8aed3d2be4 282 void Sed133xLCD::charGenRamAddr(void) {
llagendijk 6:2f8aed3d2be4 283 sendCommand(CHAR_GEN_RAM_ADDR);
llagendijk 6:2f8aed3d2be4 284 sendData(CG_RAM_START & 255);
llagendijk 6:2f8aed3d2be4 285 sendData(CG_RAM_START >> 8);
llagendijk 6:2f8aed3d2be4 286 }
llagendijk 6:2f8aed3d2be4 287
llagendijk 6:2f8aed3d2be4 288 void Sed133xLCD::clsText(void) {
llagendijk 6:2f8aed3d2be4 289 /**
llagendijk 6:2f8aed3d2be4 290 * Clear text screen
llagendijk 6:2f8aed3d2be4 291 */
llagendijk 6:2f8aed3d2be4 292
llagendijk 6:2f8aed3d2be4 293 int i;
llagendijk 6:2f8aed3d2be4 294 setCursor(TEXT_SCREEN_START);
llagendijk 6:2f8aed3d2be4 295 sendCommand(SET_MEM);
llagendijk 6:2f8aed3d2be4 296 for (i=0; i < TEXT_SCREEN_RESERVED; i++) {
llagendijk 6:2f8aed3d2be4 297 sendData(' ');
llagendijk 6:2f8aed3d2be4 298 }
llagendijk 6:2f8aed3d2be4 299 setCursor(TEXT_SCREEN_START);
llagendijk 6:2f8aed3d2be4 300 }
llagendijk 6:2f8aed3d2be4 301
llagendijk 6:2f8aed3d2be4 302 void Sed133xLCD::clsGraphics(void) {
llagendijk 6:2f8aed3d2be4 303 /**
llagendijk 6:2f8aed3d2be4 304 * clear graphics screen
llagendijk 6:2f8aed3d2be4 305 */
llagendijk 6:2f8aed3d2be4 306
llagendijk 6:2f8aed3d2be4 307 int i;
llagendijk 6:2f8aed3d2be4 308 setCursor(GRAPHICAL_SCREEN_START);
llagendijk 6:2f8aed3d2be4 309 sendCommand(SET_MEM);
llagendijk 6:2f8aed3d2be4 310 for (i=0; i < GRAPHICAL_SCREEN_RESERVED; i++) {
llagendijk 6:2f8aed3d2be4 311 sendData(0);
llagendijk 6:2f8aed3d2be4 312 }
llagendijk 6:2f8aed3d2be4 313 setCursor(GRAPHICAL_SCREEN_START);
llagendijk 6:2f8aed3d2be4 314 }
llagendijk 6:2f8aed3d2be4 315
llagendijk 6:2f8aed3d2be4 316 void Sed133xLCD::clearCharacterGeneratorRam(void) {
llagendijk 6:2f8aed3d2be4 317 /**
llagendijk 6:2f8aed3d2be4 318 * Clear character generator RAM
llagendijk 6:2f8aed3d2be4 319 */
llagendijk 6:2f8aed3d2be4 320
llagendijk 6:2f8aed3d2be4 321 int i;
llagendijk 6:2f8aed3d2be4 322 setCursor(CG_RAM_START);
llagendijk 6:2f8aed3d2be4 323 sendCommand(SET_MEM);
llagendijk 6:2f8aed3d2be4 324 for (i=0; i < CG_RAM_SIZE; i++) {
llagendijk 6:2f8aed3d2be4 325 sendData(0);
llagendijk 6:2f8aed3d2be4 326 }
llagendijk 6:2f8aed3d2be4 327 setCursor(TEXT_SCREEN_START);
llagendijk 6:2f8aed3d2be4 328 }
llagendijk 6:2f8aed3d2be4 329
llagendijk 6:2f8aed3d2be4 330 void Sed133xLCD::printText(uint8_t *text) {
llagendijk 6:2f8aed3d2be4 331 /*
llagendijk 6:2f8aed3d2be4 332 * write text to screen
llagendijk 6:2f8aed3d2be4 333 */
llagendijk 6:2f8aed3d2be4 334 int len = strlen((char*)text);
llagendijk 6:2f8aed3d2be4 335 sendCommand(SET_MEM);
llagendijk 6:2f8aed3d2be4 336 while (len > 0) {
llagendijk 6:2f8aed3d2be4 337 sendData(text[len--]);
llagendijk 6:2f8aed3d2be4 338 }
llagendijk 6:2f8aed3d2be4 339 }
llagendijk 6:2f8aed3d2be4 340
llagendijk 6:2f8aed3d2be4 341 void Sed133xLCD::printData(int len, uint8_t*data) {
llagendijk 6:2f8aed3d2be4 342 /*
llagendijk 6:2f8aed3d2be4 343 * write (binary) data to screen
llagendijk 6:2f8aed3d2be4 344 */
llagendijk 6:2f8aed3d2be4 345 sendCommand(SET_MEM);
llagendijk 6:2f8aed3d2be4 346 while (len > 0) {
llagendijk 6:2f8aed3d2be4 347 sendData(data[len--]);
llagendijk 6:2f8aed3d2be4 348 }
llagendijk 6:2f8aed3d2be4 349 }
llagendijk 6:2f8aed3d2be4 350
llagendijk 6:2f8aed3d2be4 351 void Sed133xLCD::setCursor(uint8_t column, uint8_t row) {
llagendijk 6:2f8aed3d2be4 352 /**
llagendijk 6:2f8aed3d2be4 353 * set cursor on text screen
llagendijk 6:2f8aed3d2be4 354 */
llagendijk 6:2f8aed3d2be4 355 int pos = row * _columns + column;
llagendijk 6:2f8aed3d2be4 356 sendCommand(SET_CURSOR);
llagendijk 6:2f8aed3d2be4 357 sendData( pos & 255);
llagendijk 6:2f8aed3d2be4 358 sendData( pos >> 8);
llagendijk 6:2f8aed3d2be4 359 }
llagendijk 6:2f8aed3d2be4 360
llagendijk 6:2f8aed3d2be4 361 void Sed133xLCD::setCursor(int pos) {
llagendijk 6:2f8aed3d2be4 362 /**
llagendijk 6:2f8aed3d2be4 363 * set cursor on graphical screen
llagendijk 6:2f8aed3d2be4 364 */
llagendijk 6:2f8aed3d2be4 365 sendCommand(SET_CURSOR);
llagendijk 6:2f8aed3d2be4 366 sendData( pos & 255);
llagendijk 6:2f8aed3d2be4 367 sendData( pos >> 8);
llagendijk 6:2f8aed3d2be4 368 }
llagendijk 6:2f8aed3d2be4 369
llagendijk 6:2f8aed3d2be4 370 /**
llagendijk 6:2f8aed3d2be4 371 * Public functions
llagendijk 6:2f8aed3d2be4 372 */
llagendijk 6:2f8aed3d2be4 373
llagendijk 6:2f8aed3d2be4 374 Sed133xLCD::Sed133xLCD(PinName reset, PinName nRead, PinName nWrite, PinName nSelect, PinName addr0,
llagendijk 6:2f8aed3d2be4 375 PinName d0, PinName d1, PinName d2, PinName d3,
llagendijk 6:2f8aed3d2be4 376 PinName d4, PinName d5, PinName d6, PinName d7,
llagendijk 6:2f8aed3d2be4 377 uint16_t hor_dots, uint16_t vert_dots,
llagendijk 6:2f8aed3d2be4 378 uint8_t char_width, uint8_t char_height,
llagendijk 6:2f8aed3d2be4 379 const char *name) :
llagendijk 6:2f8aed3d2be4 380 TextDisplay(name),
llagendijk 6:2f8aed3d2be4 381 _reset(reset), _nRead(nRead), _nWrite(nWrite), _nSelect(nSelect), _addr0(addr0),
llagendijk 6:2f8aed3d2be4 382 _dataBus(d0, d1, d2, d3, d4, d5, d6, d7),
llagendijk 6:2f8aed3d2be4 383 _hor_dots(hor_dots), _vert_dots(vert_dots),
llagendijk 6:2f8aed3d2be4 384 _char_width(char_width), _char_height(char_height) {
llagendijk 6:2f8aed3d2be4 385
llagendijk 6:2f8aed3d2be4 386 // if we have at least 8 dots left we can squeeze in one more row
llagendijk 6:2f8aed3d2be4 387 _rows = _vert_dots /_char_height + (((_vert_dots % _char_height) > 7) ? 1: 0);
llagendijk 6:2f8aed3d2be4 388 _columns = _hor_dots / char_width;
llagendijk 6:2f8aed3d2be4 389 initializeSed();
llagendijk 6:2f8aed3d2be4 390 }
llagendijk 6:2f8aed3d2be4 391
llagendijk 6:2f8aed3d2be4 392
llagendijk 6:2f8aed3d2be4 393
llagendijk 6:2f8aed3d2be4 394 void Sed133xLCD::initializeSed(void) {
llagendijk 6:2f8aed3d2be4 395 resetSed();
llagendijk 6:2f8aed3d2be4 396 systemSet();
llagendijk 6:2f8aed3d2be4 397 scrollSet();
llagendijk 6:2f8aed3d2be4 398 horizontalScrollPosition();
llagendijk 6:2f8aed3d2be4 399 overlayFormat();
llagendijk 6:2f8aed3d2be4 400 cursorDirection();
llagendijk 6:2f8aed3d2be4 401 clsText();
llagendijk 6:2f8aed3d2be4 402 clsGraphics();
llagendijk 6:2f8aed3d2be4 403 clearCharacterGeneratorRam();
llagendijk 6:2f8aed3d2be4 404 cursorForm();
llagendijk 6:2f8aed3d2be4 405 displayOn();
llagendijk 6:2f8aed3d2be4 406 charGenRamAddr();
llagendijk 6:2f8aed3d2be4 407 }
llagendijk 6:2f8aed3d2be4 408
llagendijk 6:2f8aed3d2be4 409 void Sed133xLCD::character(uint16_t column, uint16_t row, int c) {
llagendijk 6:2f8aed3d2be4 410 /*
llagendijk 6:2f8aed3d2be4 411 * Write character at specified position on screen
llagendijk 6:2f8aed3d2be4 412 */
llagendijk 6:2f8aed3d2be4 413
llagendijk 6:2f8aed3d2be4 414 // check for illegal input
llagendijk 6:2f8aed3d2be4 415 if ( (column >= _columns) || (row >= _rows) )
llagendijk 6:2f8aed3d2be4 416 return;
llagendijk 6:2f8aed3d2be4 417 setCursor((char) column, (char)row);
llagendijk 6:2f8aed3d2be4 418 sendCommand(SET_MEM);
llagendijk 6:2f8aed3d2be4 419 sendData(c);
llagendijk 6:2f8aed3d2be4 420 }
llagendijk 6:2f8aed3d2be4 421
llagendijk 6:2f8aed3d2be4 422 void Sed133xLCD::cls(void) {
llagendijk 6:2f8aed3d2be4 423 clsText();
llagendijk 6:2f8aed3d2be4 424 }