Library for Princeton PT6301 VFD controller. Used in Futaba CIG VFD tubes.
Embed:
(wiki syntax)
Show/hide line numbers
PT6301.cpp
00001 /* mbed PT6301 Library, for Princeton LC7571X VFD controller 00002 * The controller is used by Futaba 'Chip In Glass' (CIG) VFD tubes. 00003 * 00004 * Copyright (c) 2021, v01: WH, Initial version 00005 * 00006 * Permission is hereby granted, free of charge, to any person obtaining a copy 00007 * of this software and associated documentation files (the "Software"), to deal 00008 * in the Software without restriction, including without limitation the rights 00009 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00010 * copies of the Software, and to permit persons to whom the Software is 00011 * furnished to do so, subject to the following conditions: 00012 * 00013 * The above copyright notice and this permission notice shall be included in 00014 * all copies or substantial portions of the Software. 00015 * 00016 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00019 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00020 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00021 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00022 * THE SOFTWARE. 00023 */ 00024 00025 #include "mbed.h" 00026 #include "PT6301.h" 00027 #include "PT6301_UDC.inc" 00028 00029 00030 /** Constructor for class for driving Princeton PT6301 VFD controller 00031 * 00032 * @brief Supports upto 20 Grids of 5x7 matrix segments for 2 rows of characters (row A and B). 00033 * also supports 2 additional segments for 2 rows of characters (row A and B). 00034 * SPI bus interface device. 00035 * @param PinName mosi, sclk, cs SPI bus pins 00036 * @param Mode selects number of Grids and Rows (default 20 Grids, 2 rows) 00037 * @param bool inverted_rows selects mapping of Data onto Display layout (default false) 00038 * @param Columns selects number of characters per row (default 20, same as Mode Grids) 00039 * @param Rows selects number of rows (default 2, same as Mode Rows) 00040 */ 00041 PT6301::PT6301(PinName mosi, PinName sclk, PinName cs, PinName rst, Mode mode, bool inverted_rows, int columns, int rows) : _spi(mosi,NC,sclk), _cs(cs), _rst(rst), _mode(mode), _inverted_rows(inverted_rows), _columns(columns), _rows(rows) { 00042 00043 _init(); 00044 } 00045 00046 00047 /** Init the PT6301 interface and the controller 00048 * 00049 * @param none 00050 * @return none 00051 */ 00052 void PT6301::_init(){ 00053 00054 //init SPI 00055 _cs=1; 00056 _spi.format(8,3); //PT6301 uses mode 3 (Clock High on Idle, Data latched on second (=rising) edge) 00057 _spi.frequency(100000); 00058 // _spi.frequency(250000); 00059 00060 //init controller 00061 #if(0) 00062 // Reset (3V3 level too low? Add pull-up to 5V) 00063 _rst=1; 00064 wait_ms(PT6301_RST_DLY); 00065 _rst=0; 00066 wait_ms(PT6301_RST_DLY); 00067 _rst=1; 00068 wait_ms(PT6301_RST_DLY); 00069 #endif 00070 00071 // Set number of Grids 00072 _writeCmd((PT6301_GRID_REG | (_mode & PT6301_GRID_MSK))); // Command register & value 00073 00074 setBrightness(PT6301_BRT_DEF); // Default Brightness 00075 00076 // Clear the DCRAM and ADRAM (undefined at Reset) and reset (_row, _column) 00077 cls(true); 00078 00079 // Clear the UDC RAM (undefined at Reset) 00080 const char udc_none[] = {0x00,0x00,0x00,0x00,0x00}; 00081 for (int idx=0; idx < PT6301_NR_UDC; idx++) { 00082 setUDC(idx, (char *)udc_none); 00083 } 00084 00085 // Update the display 00086 refresh(); 00087 00088 setDisplay(true); // Display On 00089 } 00090 00091 00092 /** Clear the screen and locate to (0,0) 00093 * 00094 * @param bool clrAll Clear Icons also (default = false) 00095 * @return none 00096 */ 00097 void PT6301::cls(bool clrAll) { 00098 00099 for (_row = 0; _row < _rows; _row++) { 00100 for (_column = 0; _column < _columns; _column++) { 00101 _displaybuffer[_row][_column] = ' '; // data 00102 00103 if (clrAll) { 00104 _addbuffer[_row][_column] = 0; // icons 00105 } 00106 } 00107 } 00108 00109 _row = 0; 00110 _column = 0; 00111 } 00112 00113 00114 /** Locate cursor to a screen row, column 00115 * 00116 * @param row The vertical position from the top, indexed from 0 00117 * @param column The horizontal position from the left, indexed from 0 00118 * @return none 00119 */ 00120 void PT6301::locate(int row, int column) { 00121 //sanity check 00122 if (row < 0) {row = 0;} 00123 if (row > (_rows - 1)) {row = _rows - 1;} 00124 00125 if (column < 0) {column = 0;} 00126 if (column > (_columns - 1)) {column = _columns - 1;} 00127 00128 _row = row; 00129 _column = column; 00130 } 00131 00132 /** Number of screen columns 00133 * 00134 * @param none 00135 * @return columns 00136 */ 00137 int PT6301::columns(){ 00138 return _columns; 00139 } 00140 00141 00142 /** Number of screen rows 00143 * 00144 * @param none 00145 * @return rows 00146 */ 00147 int PT6301::rows() { 00148 return _rows; 00149 } 00150 00151 00152 /** Refresh screen and show data in local mirrors on the display 00153 * 00154 * @param bool copyAll Copy Icons in Adat local mirror also (default = true) 00155 * @return none 00156 */ 00157 void PT6301::refresh(bool copyAll) { 00158 int row_cnt, col_cnt; 00159 00160 //Copy character data mirror to display 00161 _cs=0; // Send Command for DATA_A_REG 00162 wait_us(1); 00163 _spi.write(_flip(PT6301_DATA_A_REG)); // Command register for DATA_A 00164 wait_us(PT6301_CMD_DLY); // Command Delay 00165 00166 row_cnt = _row_flip(0); // Reorder rows depending on VFD layout 00167 for (col_cnt = 0; col_cnt < _columns; col_cnt++) { 00168 _spi.write(_flip(_displaybuffer[row_cnt][col_cnt])); // DATA_A Row 00169 } 00170 00171 wait_us(PT6301_CS_DLY); // CS Hold Delay 00172 _cs=1; // Latch Command & Params 00173 00174 wait_us(PT6301_CMD_DLY); // Command Delay 00175 00176 _cs=0; // Send Command for DATA_B_REG 00177 wait_us(1); 00178 _spi.write(_flip(PT6301_DATA_B_REG)); // Command register for DATA_B 00179 wait_us(PT6301_CMD_DLY); // Command Delay 00180 00181 row_cnt = _row_flip(1); // Reorder rows depending on VFD layout 00182 for (col_cnt = 0; col_cnt < _columns; col_cnt++) { 00183 _spi.write(_flip(_displaybuffer[row_cnt][col_cnt])); // DATA_B Row 00184 } 00185 00186 wait_us(PT6301_CS_DLY); // CS Hold Delay 00187 _cs=1; // Latch Command & Params 00188 00189 //Copy icon data mirror to display 00190 if (copyAll) { 00191 _cs=0; // Send Command for ADAT_A_REG 00192 wait_us(1); 00193 _spi.write(_flip(PT6301_ADAT_A_REG)); // Command register for ADAT_A 00194 wait_us(PT6301_CMD_DLY); // Command Delay 00195 00196 row_cnt = _row_flip(0); // Reorder rows depending on VFD layout 00197 for (col_cnt = 0; col_cnt < _columns; col_cnt++) { 00198 _spi.write(_flip(_addbuffer[row_cnt][col_cnt])); // ADAT_A Row 00199 } 00200 00201 wait_us(PT6301_CS_DLY); // CS Hold Delay 00202 _cs=1; // Latch Command & Params 00203 00204 wait_us(PT6301_CMD_DLY); // Command Delay 00205 00206 _cs=0; // Send Command for ADAT_B_REG 00207 wait_us(1); 00208 _spi.write(_flip(PT6301_ADAT_B_REG)); // Command register for ADAT_B 00209 wait_us(PT6301_CMD_DLY); // Command Delay 00210 00211 row_cnt = _row_flip(1); // Reorder rows depending on VFD layout 00212 for (col_cnt = 0; col_cnt < _columns; col_cnt++) { 00213 _spi.write(_flip(_addbuffer[row_cnt][col_cnt])); // ADAT_B Row 00214 } 00215 00216 wait_us(PT6301_CS_DLY); // CS Hold Delay 00217 _cs=1; // Latch Command & Params 00218 } 00219 } 00220 00221 00222 /** Set Brightness 00223 * 00224 * @param char brightness (valid range 0..255) 00225 * @return none 00226 */ 00227 void PT6301::setBrightness(char brightness){ 00228 00229 //Sanity check 00230 // 00231 00232 _writeCmd(PT6301_BRT_REG, brightness); // Command register & value 00233 } 00234 00235 00236 /** Set the Display mode On/off 00237 * 00238 * @param bool display mode 00239 * @return none 00240 */ 00241 void PT6301::setDisplay(bool on) { 00242 char display; 00243 00244 if (on) { 00245 display = PT6301_DSPL_NRM; // normal mode, show Display RAM content 00246 } 00247 else { 00248 display = PT6301_DSPL_OFF; // all segments off 00249 } 00250 00251 _writeCmd((PT6301_DSPL_REG | display)); // Command register & value 00252 } 00253 00254 00255 /** Set the Display test mode On/off 00256 * 00257 * @param bool display test mode 00258 * @return none 00259 */ 00260 void PT6301::setDisplayTest(bool on) { 00261 char display; 00262 00263 if (on) { 00264 display = PT6301_DSPL_ON; // test mode, all segments on 00265 } 00266 else { 00267 display = PT6301_DSPL_NRM; // normal mode, show Display RAM content 00268 } 00269 00270 _writeCmd((PT6301_DSPL_REG | display)); // Command register & value 00271 } 00272 00273 00274 /** Set User Defined Characters (UDC) for A and B 00275 * 00276 * @param unsigned char udc_idx The Index of the UDC (0..15) 00277 * @param UDCData_t udc_data The bitpattern for the UDC (5 bytes) 00278 * @return none 00279 */ 00280 void PT6301::setUDC(unsigned char udc_idx, UDCData_t udc_data) { 00281 00282 //Sanity check 00283 udc_idx = udc_idx & PT6301_UADR_MSK; // mask invalid bits 00284 00285 _cs=0; // Send Command & Params for UDC_A 00286 wait_us(1); 00287 _spi.write(_flip(PT6301_UDC_A_REG | udc_idx)); // Command register & address for UDC_A 00288 wait_us(PT6301_CMD_DLY); // Command Delay 00289 00290 _spi.write(_flip(udc_data[0] & PT6301_UDC_MSK)); // CD30 CD25 ...... CD0 00291 _spi.write(_flip(udc_data[1] & PT6301_UDC_MSK)); // CD31 CD26 ...... CD1 00292 _spi.write(_flip(udc_data[2] & PT6301_UDC_MSK)); // CD32 CD27 ...... CD2 00293 _spi.write(_flip(udc_data[3] & PT6301_UDC_MSK)); // CD33 CD28 ...... CD3 00294 _spi.write(_flip(udc_data[4] & PT6301_UDC_MSK)); // CD34 CD29 ...... CD4 00295 00296 wait_us(PT6301_CS_DLY); // CS Hold Delay 00297 _cs=1; // Latch Command & Params 00298 00299 wait_us(PT6301_CMD_DLY); // Command Delay 00300 00301 00302 _cs=0; // Send Command & Params for UDC B 00303 wait_us(1); 00304 _spi.write(_flip(PT6301_UDC_B_REG | udc_idx)); // Command register & address for UDC_B 00305 wait_us(PT6301_CMD_DLY); // Command Delay 00306 00307 _spi.write(_flip(udc_data[0] & PT6301_UDC_MSK)); // CD30 CD25 ...... CD0 00308 _spi.write(_flip(udc_data[1] & PT6301_UDC_MSK)); // CD31 CD26 ...... CD1 00309 _spi.write(_flip(udc_data[2] & PT6301_UDC_MSK)); // CD32 CD27 ...... CD2 00310 _spi.write(_flip(udc_data[3] & PT6301_UDC_MSK)); // CD33 CD28 ...... CD3 00311 _spi.write(_flip(udc_data[4] & PT6301_UDC_MSK)); // CD34 CD29 ...... CD4 00312 00313 wait_us(PT6301_CS_DLY); // CS Hold Delay 00314 _cs=1; // Latch Command & Params 00315 00316 wait_us(PT6301_CMD_DLY); // Command Delay 00317 00318 } 00319 00320 /** Set Icon 00321 * 00322 * @param int row The row of the icon (0..(rows-1)) 00323 * @param int column The column of the icon (0..(cols-1)) 00324 * @return none 00325 */ 00326 void PT6301::setIcon(int row, int column){ 00327 //sanity check 00328 if (row < 0) {row = 0;} 00329 if (row > (_rows - 1)) {row = _rows - 1;} 00330 00331 if (column < 0) {column = 0;} 00332 if (column > (_columns - 1)) {column = _columns - 1;} 00333 00334 _addbuffer[row][column] = PT6301_ADAT_MSK; 00335 } 00336 00337 /** Clr Icon 00338 * 00339 * @param int row The row of the icon (0..(rows-1)) 00340 * @param int column The column of the icon (0..(cols-1)) 00341 * @return none 00342 */ 00343 void PT6301::clrIcon(int row, int column){ 00344 //sanity check 00345 if (row < 0) {row = 0;} 00346 if (row > (_rows - 1)) {row = _rows - 1;} 00347 00348 if (column < 0) {column = 0;} 00349 if (column > (_columns - 1)) {column = _columns - 1;} 00350 00351 _addbuffer[row][column] = 0x00; 00352 } 00353 00354 00355 /** Write command to PT6301 00356 * 00357 * @param char cmd Command byte 00358 * @return none 00359 */ 00360 void PT6301::_writeCmd(char cmd){ 00361 00362 _cs=0; // Prepare to send Command 00363 wait_us(1); 00364 00365 _spi.write(_flip(cmd)); // Command register & value 00366 00367 wait_us(PT6301_CS_DLY); // CS Hold Delay 00368 _cs=1; // Latch Command 00369 00370 wait_us(PT6301_CMD_DLY); // Command Delay 00371 } 00372 00373 00374 /** Write command and data to PT6301 00375 * 00376 * @param char cmd Command byte 00377 * @param char data Parameter for command 00378 * @return none 00379 */ 00380 void PT6301::_writeCmd(char cmd, char data){ 00381 00382 _cs=0; // Prepare to send Command and data 00383 wait_us(1); 00384 00385 _spi.write(_flip(cmd)); // Command register & value 00386 00387 wait_us(PT6301_CMD_DLY); // Command Delay 00388 00389 _spi.write(_flip(data)); // data 00390 00391 wait_us(PT6301_CS_DLY); // CS Hold Delay 00392 _cs=1; // Latch Command and data 00393 00394 wait_us(PT6301_CMD_DLY); // Command Delay 00395 } 00396 00397 /** Write Data to local mirror 00398 * 00399 * @param char data The databyte 00400 * @param row The vertical position from the top, indexed from 0 00401 * @param column The horizontal position from the left, indexed from 0 00402 * @return none 00403 */ 00404 void PT6301::setData(char data, int row, int column){ 00405 00406 //Sanity check, allow access to all of local mirror 00407 if (row < 0) {row = 0;} 00408 if (row > (PT6301_MAX_NR_ROWS - 1)) {row = PT6301_MAX_NR_ROWS - 1;} 00409 00410 if (column < 0) {column = 0;} 00411 if (column > (PT6301_MAX_NR_GRIDS - 1)) {column = PT6301_MAX_NR_GRIDS - 1;} 00412 00413 _displaybuffer[row][column] = data; 00414 } 00415 00416 /** Read Data from local mirror 00417 * 00418 * @param row The vertical position from the top, indexed from 0 00419 * @param column The horizontal position from the left, indexed from 0 00420 * @return char The databyte 00421 */ 00422 char PT6301::getData(int row, int column){ 00423 00424 //Sanity check, allow access to all of local mirror 00425 if (row < 0) {row = 0;} 00426 if (row > (PT6301_MAX_NR_ROWS - 1)) {row = PT6301_MAX_NR_ROWS - 1;} 00427 00428 if (column < 0) {column = 0;} 00429 if (column > (PT6301_MAX_NR_GRIDS - 1)) {column = PT6301_MAX_NR_GRIDS - 1;} 00430 00431 return _displaybuffer[row][column]; 00432 } 00433 00434 /** Write AData to local mirror 00435 * 00436 * @param char data The symbol databyte 00437 * @param row The vertical position from the top, indexed from 0 00438 * @param column The horizontal position from the left, indexed from 0 00439 * @return none 00440 */ 00441 void PT6301::setAData(char data, int row, int column){ 00442 00443 //Sanity check, allow access to all of local mirror 00444 if (row < 0) {row = 0;} 00445 if (row > (PT6301_MAX_NR_ROWS - 1)) {row = PT6301_MAX_NR_ROWS - 1;} 00446 00447 if (column < 0) {column = 0;} 00448 if (column > (PT6301_MAX_NR_GRIDS - 1)) {column = PT6301_MAX_NR_GRIDS - 1;} 00449 00450 _addbuffer[row][column] = data & PT6301_ADAT_MSK; 00451 } 00452 00453 /** Read AData from local mirror 00454 * 00455 * @param row The vertical position from the top, indexed from 0 00456 * @param column The horizontal position from the left, indexed from 0 00457 * @return char The symbol databyte 00458 */ 00459 char PT6301::getAData(int row, int column){ 00460 00461 //Sanity check, allow access to all of local mirror 00462 if (row < 0) {row = 0;} 00463 if (row > (PT6301_MAX_NR_ROWS - 1)) {row = PT6301_MAX_NR_ROWS - 1;} 00464 00465 if (column < 0) {column = 0;} 00466 if (column > (PT6301_MAX_NR_GRIDS - 1)) {column = PT6301_MAX_NR_GRIDS - 1;} 00467 00468 return _addbuffer[row][column]; 00469 } 00470 00471 00472 00473 00474 /** Helper to reverse all command or databits. The PT6301 expects LSB first, whereas SPI is MSB first 00475 * 00476 * @param char data 00477 * @return bitreversed data 00478 */ 00479 char PT6301::_flip(char data) { 00480 char value=0; 00481 00482 if (data & 0x01) {value |= 0x80;} ; 00483 if (data & 0x02) {value |= 0x40;} ; 00484 if (data & 0x04) {value |= 0x20;} ; 00485 if (data & 0x08) {value |= 0x10;} ; 00486 if (data & 0x10) {value |= 0x08;} ; 00487 if (data & 0x20) {value |= 0x04;} ; 00488 if (data & 0x40) {value |= 0x02;} ; 00489 if (data & 0x80) {value |= 0x01;} ; 00490 return value; 00491 } 00492 00493 00494 /** Helper to reverse row idx depending on VFD layout 00495 * 00496 * @param int row_idx 00497 * @return adjusted row_idx 00498 */ 00499 int PT6301::_row_flip(int row_idx) { 00500 if (_inverted_rows) { 00501 return (1 - row_idx); // Reorder row mapping to match VFD layout 00502 // Top line is DATA_B_REG, ADAT_B_REG 00503 // Bottom line is DATA_A_REG, ADAT_A_REG 00504 } 00505 else { 00506 return row_idx; // Maintain row mapping to match VFD layout 00507 // Top line is DATA_A_REG, ADAT_A_REG 00508 // Bottom line is DATA_B_REG, ADAT_B_REG 00509 } 00510 } 00511 00512 00513 /** Write a single character (Stream implementation) 00514 * 00515 * @param value char to print 00516 * @return value; 00517 */ 00518 int PT6301::_putc(int value) { 00519 00520 if (value == '\r') { 00521 //No character to write 00522 00523 //Update Cursor 00524 _column = 0; 00525 } 00526 else if (value == '\n') { 00527 //No character to write 00528 00529 //Update Cursor 00530 _row++; 00531 if (_row > (_rows - 1)) { 00532 _row = 0; 00533 } 00534 } 00535 else if ((value >= 0) && (value < 256)) { 00536 //Valid character to write 00537 00538 //Write displaybuffer entry 00539 _displaybuffer[_row][_column] = value; 00540 00541 //Update Cursor 00542 _column++; 00543 if (_column > (_columns - 1)) { 00544 _column = 0; 00545 _row++; 00546 } 00547 if (_row > (_rows - 1)) { 00548 _row = 0; 00549 } 00550 } // if validChar 00551 00552 return value; 00553 } 00554 00555 /** Get a single character (Stream implementation) 00556 * 00557 * @param none 00558 * @return -1 00559 */ 00560 int PT6301::_getc() { 00561 return -1; 00562 } 00563 00564 00565 00566 #if (SMTG7400_TEST == 1) 00567 00568 /** Constructor for class for Princeton PT6301 VFD controller as used in SMTG7400 00569 * 00570 * @brief Supports 16 Grids of 5x7 Segments with 4 additional Segments in use. 00571 * 00572 * @param PinName mosi, miso, sclk, cs SPI bus pins 00573 * @param PinName rst Reset pin 00574 */ 00575 PT6301_SMTG7400::PT6301_SMTG7400(PinName mosi, PinName sclk, PinName cs, PinName rst) : PT6301(mosi, sclk, cs, rst, Grid16, true, SMTG7400_NR_COLS, SMTG7400_NR_ROWS) { 00576 00577 } 00578 00579 /** Set Icon 00580 * 00581 * @param int icon The icon ID 00582 * @return none 00583 */ 00584 void PT6301_SMTG7400::setIcon(int icon) { 00585 PT6301::setIcon((icon >> SMTG7400_ICON_ROW_SHFT), (icon & SMTG7400_ICON_COL_MSK)); 00586 } 00587 00588 /** Clr Icon 00589 * 00590 * @param int icon The icon ID 00591 * @return none 00592 */ 00593 void PT6301_SMTG7400::clrIcon(int icon) { 00594 PT6301::clrIcon((icon >> SMTG7400_ICON_ROW_SHFT), (icon & SMTG7400_ICON_COL_MSK)); 00595 } 00596 00597 #endif 00598 00599 00600 #if (SMTC7140_TEST == 1) 00601 00602 /** Constructor for class for Princeton PT6301 VFD controller as used in SMTC7140 00603 * 00604 * @brief Supports 12 Grids of 5x7 Segments without additional Icon Segments, for 2 Rows. 00605 * Grid13 is used for icons displayed by a UDC symbol. 00606 * 00607 * @param PinName mosi, miso, sclk, cs SPI bus pins 00608 * @param PinName rst Reset pin 00609 */ 00610 PT6301_SMTC7140::PT6301_SMTC7140(PinName mosi, PinName sclk, PinName cs, PinName rst) : PT6301(mosi, sclk, cs, rst, Grid13, true, SMTC7140_NR_COLS, SMTC7140_NR_ROWS) { 00611 00612 //Enable VGen for VFD Power Supply 00613 //Note this is wrong because we should send the init commands to the PT6301 before the 5V powersupply is enabled ! 00614 // setVGen(true); 00615 00616 } 00617 00618 /** Set VFD VGen 00619 * 00620 * @param bool on 00621 * @return none 00622 */ 00623 void PT6301_SMTC7140::setVGen (bool on) { 00624 00625 } 00626 00627 00628 /** Set IconGrid13 00629 * Icons are shown on Grid13 using the UDC at index=0. The UDC char=0 is stored in _displaybuffer[0][12] at reset. 00630 * This method will set the correct segment in the UDC for each icon. 00631 * 00632 * @param int icon The icon ID 00633 * @return none 00634 */ 00635 void PT6301_SMTC7140::setIconGrid13(int icon) { 00636 00637 #if(0) 00638 //Test version to check all bits 00639 // clear icon 00640 for (int udc_col=0; udc_col<5; udc_col++) { 00641 _icon_data[udc_col] = 0x00; 00642 }; 00643 00644 _icon_data[icon >> 8] = (icon & 0x7F); 00645 setUDC(0, (char *) _icon_data); // Store mirror for UDC_idx=0 00646 00647 #else 00648 //Normal version 00649 for (int udc_col=0; udc_col<5; udc_col++) { 00650 _icon_data[udc_col] = _icon_data[udc_col] | SMTC7140_ICONS[icon][udc_col]; // OR icon bitpattern with UDC mirror for UDC_idx=0 00651 } 00652 00653 setUDC(0, (char *) _icon_data); // Store mirror for UDC_idx=0 00654 #endif 00655 00656 } 00657 00658 /** Clr IconGrid13 00659 * Icons are shown on Grid13 using the UDC at index=0. The UDC char=0 is stored in _displaybuffer[0][12] at reset. 00660 * This method will clr the correct segment in the UDC for each icon. 00661 * 00662 * @param int icon The icon ID 00663 * @return none 00664 */ 00665 void PT6301_SMTC7140::clrIconGrid13(int icon) { 00666 00667 for (int udc_col=0; udc_col<5; udc_col++) { 00668 _icon_data[udc_col] = _icon_data[udc_col] & ~(SMTC7140_ICONS[icon][udc_col]); // AND inverted icon bitpattern with UDC mirror for UDC_idx=0 00669 } 00670 00671 setUDC(0, (char *) _icon_data); // Store mirror for UDC_idx=0 00672 } 00673 00674 #endif
Generated on Thu Jul 14 2022 03:31:40 by
1.7.2