A TextDisplay driver that supports graphical displays using on of the SED133x conrtrolers. Allows stdout and stderr output to be redirected to the display.
Sed133xLCD.cpp@6:2f8aed3d2be4, 2011-01-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |