Lib for Noritake Itron CU209SCPB VFD Module (1 Line, 20 Chars), Serial interface
Dependents: mbed_CU209SCPB_T20
More info is here.
CU209SCPB.cpp@0:93ae875cbb7a, 2017-12-10 (annotated)
- Committer:
- wim
- Date:
- Sun Dec 10 17:02:32 2017 +0000
- Revision:
- 0:93ae875cbb7a
Lib for Noritake Itron VFD Module (1 Line, 20 Chars), Serial interface
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wim | 0:93ae875cbb7a | 1 | /* mbed Library for Noritake Itron CU209SCPB-T20 VFD module |
wim | 0:93ae875cbb7a | 2 | * |
wim | 0:93ae875cbb7a | 3 | * Copyright (c) 2017, v01: WH, Initial version |
wim | 0:93ae875cbb7a | 4 | * |
wim | 0:93ae875cbb7a | 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
wim | 0:93ae875cbb7a | 6 | * of this software and associated documentation files (the "Software"), to deal |
wim | 0:93ae875cbb7a | 7 | * in the Software without restriction, including without limitation the rights |
wim | 0:93ae875cbb7a | 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
wim | 0:93ae875cbb7a | 9 | * copies of the Software, and to permit persons to whom the Software is |
wim | 0:93ae875cbb7a | 10 | * furnished to do so, subject to the following conditions: |
wim | 0:93ae875cbb7a | 11 | * |
wim | 0:93ae875cbb7a | 12 | * The above copyright notice and this permission notice shall be included in |
wim | 0:93ae875cbb7a | 13 | * all copies or substantial portions of the Software. |
wim | 0:93ae875cbb7a | 14 | * |
wim | 0:93ae875cbb7a | 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
wim | 0:93ae875cbb7a | 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
wim | 0:93ae875cbb7a | 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
wim | 0:93ae875cbb7a | 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
wim | 0:93ae875cbb7a | 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
wim | 0:93ae875cbb7a | 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
wim | 0:93ae875cbb7a | 21 | * THE SOFTWARE. |
wim | 0:93ae875cbb7a | 22 | */ |
wim | 0:93ae875cbb7a | 23 | |
wim | 0:93ae875cbb7a | 24 | #include "mbed.h" |
wim | 0:93ae875cbb7a | 25 | #include "CU209SCPB.h" |
wim | 0:93ae875cbb7a | 26 | #include "CU209SCPB_UDC.inc" |
wim | 0:93ae875cbb7a | 27 | |
wim | 0:93ae875cbb7a | 28 | |
wim | 0:93ae875cbb7a | 29 | /** Constructor for class for driving Noritake Itron CU209SCPB VFD module |
wim | 0:93ae875cbb7a | 30 | * |
wim | 0:93ae875cbb7a | 31 | * @brief Supports 1 line of 20 chars (5x7 matrix segments). |
wim | 0:93ae875cbb7a | 32 | * Serial bus interface device. |
wim | 0:93ae875cbb7a | 33 | * @param PinName TX Serial bus pin |
wim | 0:93ae875cbb7a | 34 | * @param Baud baud selects baudrate (default 19200) |
wim | 0:93ae875cbb7a | 35 | * @param Int Parity selects paritybits (default Even) |
wim | 0:93ae875cbb7a | 36 | */ |
wim | 0:93ae875cbb7a | 37 | CU209SCPB::CU209SCPB(PinName TXD, Baud baud, SerialBase::Parity parity) : _serial(TXD,NC), _baud(baud), _parity(parity) { |
wim | 0:93ae875cbb7a | 38 | |
wim | 0:93ae875cbb7a | 39 | _init(); |
wim | 0:93ae875cbb7a | 40 | |
wim | 0:93ae875cbb7a | 41 | _column = 0; |
wim | 0:93ae875cbb7a | 42 | _columns = CU209SCPB_NR_COLS; |
wim | 0:93ae875cbb7a | 43 | } |
wim | 0:93ae875cbb7a | 44 | |
wim | 0:93ae875cbb7a | 45 | /** Init the CU209SCPB interface and the module |
wim | 0:93ae875cbb7a | 46 | * |
wim | 0:93ae875cbb7a | 47 | * @param none |
wim | 0:93ae875cbb7a | 48 | * @return none |
wim | 0:93ae875cbb7a | 49 | */ |
wim | 0:93ae875cbb7a | 50 | void CU209SCPB::_init(){ |
wim | 0:93ae875cbb7a | 51 | |
wim | 0:93ae875cbb7a | 52 | //init Serial |
wim | 0:93ae875cbb7a | 53 | _serial.baud(_baud); |
wim | 0:93ae875cbb7a | 54 | _serial.format(8, _parity, 1); // CU209SCPB uses 8 databits, parity, 1 stopbit |
wim | 0:93ae875cbb7a | 55 | |
wim | 0:93ae875cbb7a | 56 | //init module |
wim | 0:93ae875cbb7a | 57 | // _serial.putc(D_ESC); |
wim | 0:93ae875cbb7a | 58 | // _serial.putc(int('I')); // Reset all settings |
wim | 0:93ae875cbb7a | 59 | // |
wim | 0:93ae875cbb7a | 60 | // _serial.putc(D_DC1); // Automatic CR mode, Cursor to 0 when reaching right end (Default) |
wim | 0:93ae875cbb7a | 61 | // _serial.putc(D_DC2); // Overputc mode, Overputc when reaching right end, Cursor does not move |
wim | 0:93ae875cbb7a | 62 | // _serial.putc(D_DC3); // Scroll mode, Text shifts left when reaching right end, Cursor does not move |
wim | 0:93ae875cbb7a | 63 | // |
wim | 0:93ae875cbb7a | 64 | // _serial.putc(D_CT0); // International Character Font (Default) |
wim | 0:93ae875cbb7a | 65 | // _serial.putc(D_CT1); // Katakana Character Font |
wim | 0:93ae875cbb7a | 66 | // |
wim | 0:93ae875cbb7a | 67 | // _serial.putc(D_ESC); |
wim | 0:93ae875cbb7a | 68 | // _serial.putc(int('T')); |
wim | 0:93ae875cbb7a | 69 | // _serial.putc(20); // Cursor Blinkspeed = 20 * 14.5ms (Default) |
wim | 0:93ae875cbb7a | 70 | _serial.putc(80); // Cursor Blinkspeed = 80 * 14.5ms |
wim | 0:93ae875cbb7a | 71 | |
wim | 0:93ae875cbb7a | 72 | setBrightness(CU209SCPB_BRT_DEF); // Default Brightness |
wim | 0:93ae875cbb7a | 73 | |
wim | 0:93ae875cbb7a | 74 | // Clear the DCRAM (undefined at Reset) |
wim | 0:93ae875cbb7a | 75 | cls(); |
wim | 0:93ae875cbb7a | 76 | |
wim | 0:93ae875cbb7a | 77 | // Clear the UDC RAM (undefined at Reset) |
wim | 0:93ae875cbb7a | 78 | const char udc_none[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00}; |
wim | 0:93ae875cbb7a | 79 | for (int idx=0; idx < CU209SCPB_NR_UDC; idx++) { |
wim | 0:93ae875cbb7a | 80 | setUDC(idx, (char *)udc_none); |
wim | 0:93ae875cbb7a | 81 | } |
wim | 0:93ae875cbb7a | 82 | } |
wim | 0:93ae875cbb7a | 83 | |
wim | 0:93ae875cbb7a | 84 | |
wim | 0:93ae875cbb7a | 85 | /** Clear the screen and locate to 0 |
wim | 0:93ae875cbb7a | 86 | * |
wim | 0:93ae875cbb7a | 87 | * @param none |
wim | 0:93ae875cbb7a | 88 | * @return none |
wim | 0:93ae875cbb7a | 89 | */ |
wim | 0:93ae875cbb7a | 90 | void CU209SCPB::cls() { |
wim | 0:93ae875cbb7a | 91 | _serial.putc(D_CLR); //Clear |
wim | 0:93ae875cbb7a | 92 | _serial.putc(D_CR); //Cursor left |
wim | 0:93ae875cbb7a | 93 | |
wim | 0:93ae875cbb7a | 94 | _column = 0; |
wim | 0:93ae875cbb7a | 95 | } |
wim | 0:93ae875cbb7a | 96 | |
wim | 0:93ae875cbb7a | 97 | |
wim | 0:93ae875cbb7a | 98 | /** Locate cursor to a screen column |
wim | 0:93ae875cbb7a | 99 | * |
wim | 0:93ae875cbb7a | 100 | * @param column The horizontal position from the left, indexed from 0 |
wim | 0:93ae875cbb7a | 101 | * @return none |
wim | 0:93ae875cbb7a | 102 | */ |
wim | 0:93ae875cbb7a | 103 | void CU209SCPB::locate(int column) { |
wim | 0:93ae875cbb7a | 104 | //sanity check |
wim | 0:93ae875cbb7a | 105 | if (column < 0) {column = 0;} |
wim | 0:93ae875cbb7a | 106 | if (column > (_columns - 1)) {column = _columns - 1;} |
wim | 0:93ae875cbb7a | 107 | |
wim | 0:93ae875cbb7a | 108 | _serial.putc(D_ESC); |
wim | 0:93ae875cbb7a | 109 | _serial.putc(int('H')); |
wim | 0:93ae875cbb7a | 110 | _serial.putc(column); |
wim | 0:93ae875cbb7a | 111 | |
wim | 0:93ae875cbb7a | 112 | _column = column; |
wim | 0:93ae875cbb7a | 113 | } |
wim | 0:93ae875cbb7a | 114 | |
wim | 0:93ae875cbb7a | 115 | |
wim | 0:93ae875cbb7a | 116 | /** Number of screen columns |
wim | 0:93ae875cbb7a | 117 | * |
wim | 0:93ae875cbb7a | 118 | * @param none |
wim | 0:93ae875cbb7a | 119 | * @return columns |
wim | 0:93ae875cbb7a | 120 | */ |
wim | 0:93ae875cbb7a | 121 | int CU209SCPB::columns() { |
wim | 0:93ae875cbb7a | 122 | return _columns; |
wim | 0:93ae875cbb7a | 123 | } |
wim | 0:93ae875cbb7a | 124 | |
wim | 0:93ae875cbb7a | 125 | |
wim | 0:93ae875cbb7a | 126 | /** Set Brightness |
wim | 0:93ae875cbb7a | 127 | * |
wim | 0:93ae875cbb7a | 128 | * @param char brightness (valid range 0..FF) |
wim | 0:93ae875cbb7a | 129 | * @return none |
wim | 0:93ae875cbb7a | 130 | */ |
wim | 0:93ae875cbb7a | 131 | void CU209SCPB::setBrightness(char brightness){ |
wim | 0:93ae875cbb7a | 132 | |
wim | 0:93ae875cbb7a | 133 | //Sanity check |
wim | 0:93ae875cbb7a | 134 | brightness = brightness & CU209SCPB_BRT_MSK; // mask invalid bits |
wim | 0:93ae875cbb7a | 135 | |
wim | 0:93ae875cbb7a | 136 | _serial.putc(D_ESC); |
wim | 0:93ae875cbb7a | 137 | _serial.putc(int('L')); |
wim | 0:93ae875cbb7a | 138 | _serial.putc(brightness); |
wim | 0:93ae875cbb7a | 139 | } |
wim | 0:93ae875cbb7a | 140 | |
wim | 0:93ae875cbb7a | 141 | /** Set the Cursor mode On/off |
wim | 0:93ae875cbb7a | 142 | * |
wim | 0:93ae875cbb7a | 143 | * @param bool cursor mode |
wim | 0:93ae875cbb7a | 144 | * @return none |
wim | 0:93ae875cbb7a | 145 | */ |
wim | 0:93ae875cbb7a | 146 | void CU209SCPB::setCursor(bool on) { |
wim | 0:93ae875cbb7a | 147 | |
wim | 0:93ae875cbb7a | 148 | if (on) { |
wim | 0:93ae875cbb7a | 149 | _serial.putc(D_DC5); // Blinking Cursor |
wim | 0:93ae875cbb7a | 150 | } |
wim | 0:93ae875cbb7a | 151 | else { |
wim | 0:93ae875cbb7a | 152 | _serial.putc(D_DC4); // Invisible |
wim | 0:93ae875cbb7a | 153 | } |
wim | 0:93ae875cbb7a | 154 | } |
wim | 0:93ae875cbb7a | 155 | |
wim | 0:93ae875cbb7a | 156 | /** Set Font |
wim | 0:93ae875cbb7a | 157 | * |
wim | 0:93ae875cbb7a | 158 | * @param int font (valid range: 0 == International, other == Katakana) |
wim | 0:93ae875cbb7a | 159 | * @return none |
wim | 0:93ae875cbb7a | 160 | */ |
wim | 0:93ae875cbb7a | 161 | void CU209SCPB::setFont(int font){ |
wim | 0:93ae875cbb7a | 162 | |
wim | 0:93ae875cbb7a | 163 | if (font == 0) { |
wim | 0:93ae875cbb7a | 164 | _serial.putc(D_CT0); // International (Default) |
wim | 0:93ae875cbb7a | 165 | } |
wim | 0:93ae875cbb7a | 166 | else { |
wim | 0:93ae875cbb7a | 167 | _serial.putc(D_CT1); // Katakana |
wim | 0:93ae875cbb7a | 168 | } |
wim | 0:93ae875cbb7a | 169 | } |
wim | 0:93ae875cbb7a | 170 | |
wim | 0:93ae875cbb7a | 171 | /** Set User Defined Characters (UDC) |
wim | 0:93ae875cbb7a | 172 | * |
wim | 0:93ae875cbb7a | 173 | * @param unsigned char udc_idx The Index of the UDC (0..7) |
wim | 0:93ae875cbb7a | 174 | * @param UDCData_t udc_data The bitpattern for the UDC (7 bytes) |
wim | 0:93ae875cbb7a | 175 | * @return none |
wim | 0:93ae875cbb7a | 176 | */ |
wim | 0:93ae875cbb7a | 177 | void CU209SCPB::setUDC(unsigned char udc_idx, UDCData_t udc_data) { |
wim | 0:93ae875cbb7a | 178 | |
wim | 0:93ae875cbb7a | 179 | //Sanity check |
wim | 0:93ae875cbb7a | 180 | udc_idx = udc_idx & CU209SCPB_UADR_MSK; // mask invalid bits |
wim | 0:93ae875cbb7a | 181 | |
wim | 0:93ae875cbb7a | 182 | _serial.putc(D_ESC); |
wim | 0:93ae875cbb7a | 183 | _serial.putc(int('C')); // UDC command |
wim | 0:93ae875cbb7a | 184 | _serial.putc(udc_idx); |
wim | 0:93ae875cbb7a | 185 | |
wim | 0:93ae875cbb7a | 186 | _serial.putc( ((udc_data[1] & 0x07) << 5) | ((udc_data[0] & 0x1F) << 0) ); // P8 ...... P1 |
wim | 0:93ae875cbb7a | 187 | _serial.putc( ((udc_data[3] & 0x01) << 7) | ((udc_data[2] & 0x1F) << 2) | ((udc_data[1] & 0x18) >> 3) ); // P16 ...... P9 |
wim | 0:93ae875cbb7a | 188 | _serial.putc( ((udc_data[4] & 0x0F) << 4) | ((udc_data[3] & 0x1E) >> 1) ); // P24 ...... P17 |
wim | 0:93ae875cbb7a | 189 | _serial.putc( ((udc_data[6] & 0x03) << 6) | ((udc_data[5] & 0x1F) << 1) | ((udc_data[4] & 0x10) >> 4) ); // P32 ...... P25 |
wim | 0:93ae875cbb7a | 190 | _serial.putc( ((udc_data[6] & 0x1C) >> 2) ); // ... P35 P34 P33 |
wim | 0:93ae875cbb7a | 191 | } |
wim | 0:93ae875cbb7a | 192 | |
wim | 0:93ae875cbb7a | 193 | /** putc a single character (Stream implementation) |
wim | 0:93ae875cbb7a | 194 | * |
wim | 0:93ae875cbb7a | 195 | * @param value char to print |
wim | 0:93ae875cbb7a | 196 | * @return value; |
wim | 0:93ae875cbb7a | 197 | */ |
wim | 0:93ae875cbb7a | 198 | int CU209SCPB::_putc(int value) { |
wim | 0:93ae875cbb7a | 199 | |
wim | 0:93ae875cbb7a | 200 | if ((value == '\n') || (value == '\r')) { |
wim | 0:93ae875cbb7a | 201 | //No character to display |
wim | 0:93ae875cbb7a | 202 | _serial.putc(D_CR); // Cursor to 0, Text remains as is |
wim | 0:93ae875cbb7a | 203 | |
wim | 0:93ae875cbb7a | 204 | //Update Cursor |
wim | 0:93ae875cbb7a | 205 | _column = 0; |
wim | 0:93ae875cbb7a | 206 | } |
wim | 0:93ae875cbb7a | 207 | else if ( ((value >= 0) && (value < CU209SCPB_NR_UDC)) || |
wim | 0:93ae875cbb7a | 208 | ((value >= CU209SCPB_CHR_STRT) && (value < CU209SCPB_CHR_END)) ){ |
wim | 0:93ae875cbb7a | 209 | |
wim | 0:93ae875cbb7a | 210 | //UDCs or Characters to display |
wim | 0:93ae875cbb7a | 211 | _serial.putc(value); |
wim | 0:93ae875cbb7a | 212 | |
wim | 0:93ae875cbb7a | 213 | //Update Cursor |
wim | 0:93ae875cbb7a | 214 | _column++; |
wim | 0:93ae875cbb7a | 215 | if (_column > (CU209SCPB_NR_COLS - 1)) { |
wim | 0:93ae875cbb7a | 216 | _column = 0; |
wim | 0:93ae875cbb7a | 217 | } |
wim | 0:93ae875cbb7a | 218 | } |
wim | 0:93ae875cbb7a | 219 | |
wim | 0:93ae875cbb7a | 220 | return value; |
wim | 0:93ae875cbb7a | 221 | } |
wim | 0:93ae875cbb7a | 222 | |
wim | 0:93ae875cbb7a | 223 | /** Get a single character (Stream implementation) |
wim | 0:93ae875cbb7a | 224 | * |
wim | 0:93ae875cbb7a | 225 | * @param none |
wim | 0:93ae875cbb7a | 226 | * @return -1 |
wim | 0:93ae875cbb7a | 227 | */ |
wim | 0:93ae875cbb7a | 228 | int CU209SCPB::_getc() { |
wim | 0:93ae875cbb7a | 229 | return -1; |
wim | 0:93ae875cbb7a | 230 | } |