Lib for Noritake Itron CU209SCPB VFD Module (1 Line, 20 Chars), Serial interface

Dependents:   mbed_CU209SCPB_T20

More info is here.

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?

UserRevisionLine numberNew 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 }