Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
STLED316S.cpp
00001 /* mbed STLED316S Library, for STLED316S LED controller 00002 * Copyright (c) 2016, v01: WH, Initial version 00003 * 00004 * Permission is hereby granted, free of charge, to any person obtaining a copy 00005 * of this software and associated documentation files (the "Software"), to deal 00006 * in the Software without restriction, including without limitation the rights 00007 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00008 * copies of the Software, and to permit persons to whom the Software is 00009 * furnished to do so, subject to the following conditions: 00010 * 00011 * The above copyright notice and this permission notice shall be included in 00012 * all copies or substantial portions of the Software. 00013 * 00014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00017 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00019 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00020 * THE SOFTWARE. 00021 */ 00022 #include "mbed.h" 00023 #include "STLED316S.h" 00024 #include "Font_7Seg.h" 00025 00026 /** Constructor for class for driving STLED316S LED controller with SPI bus interface device. 00027 * @brief Supports 1..6 digits @ 8 segments and 8 LEDs. 00028 * Also supports a scanned keyboard of upto 16 keys. 00029 * 00030 * @param PinName mosi, miso, sclk, cs SPI bus pins 00031 * @param Mode selects 1..6 Digits of 8 Segments (default 6 Digits of 8 Segments) 00032 */ 00033 STLED316S::STLED316S(PinName mosi, PinName miso, PinName sclk, PinName cs, Mode mode) : _spi(mosi,miso,sclk), _cs(cs), _mode(mode) { 00034 00035 _init(); 00036 } 00037 00038 /** Init the SPI interface and the controller 00039 * @param none 00040 * @return none 00041 */ 00042 void STLED316S::_init(){ 00043 char config; 00044 00045 //init SPI 00046 _cs=1; 00047 _spi.format(8,3); //STLED316S uses mode 3 (Clock High on Idle, Data latched on second (=rising) edge) 00048 _spi.frequency(500000); 00049 00050 //init controller 00051 _brt_mode = GlobalBright; //STLED316S_BRT_GLOB; 00052 // _brt_mode = IndivBright; //STLED316S_BRT_INDIV; 00053 _bright = STLED316S_BRT_DEF; 00054 00055 config = ((_mode << STLED316S_CONF_GRID_SHFT) & STLED316S_CONF_GRID_MSK) | 00056 ((_brt_mode << STLED316S_CONF_BRT_MODE_SHFT) & STLED316S_CONF_BRT_MODE_MSK) | 00057 ((_bright << STLED316S_CONF_BRT_GLOB_SHFT) & STLED316S_CONF_BRT_GLOB_MSK); 00058 00059 _writeReg(STLED316S_IDX(STLED316S_CONF_PAGE,STLED316S_CONF_ADDR), config); // Config set command 00060 // printf("Cmd= 0x%02X, Conf= 0x%02X\r\n", STLED316S_ADDR_WR_CMD | STLED316S_IDX(STLED316S_CONF_PAGE,STLED316S_CONF_ADDR), config); // Debug 00061 00062 _writeReg(STLED316S_IDX(STLED316S_DSP_PAGE,STLED316S_DSP_ON_ADDR)); // Display On command 00063 } 00064 00065 00066 /** Clear the screen and locate to 0 00067 */ 00068 void STLED316S::cls() { 00069 00070 _cs=0; 00071 wait_us(1); 00072 _spi.write(_flip(STLED316S_ADDR_WR_CMD | STLED316S_IDX(STLED316S_DIG_PAGE,STLED316S_DIG2_ADDR))); // Address set cmd, 0 00073 00074 for (int cnt=0; cnt<STLED316S_DISPLAY_MEM; cnt++) { 00075 _spi.write(0x00); // data 00076 } 00077 00078 wait_us(1); 00079 _cs=1; 00080 } 00081 00082 /** Set Brightness for all Digits and LEDs (value is used in GlobalBright mode) 00083 * 00084 * @param char brightness (3 significant bits, valid range 0..7 (1/16 .. 14/14 dutycycle) 00085 * @return none 00086 */ 00087 void STLED316S::setBrightness(char brightness){ 00088 char config; 00089 00090 _bright = brightness & STLED316S_BRT_MSK; // mask invalid bits 00091 00092 config = ((_mode << STLED316S_CONF_GRID_SHFT) & STLED316S_CONF_GRID_MSK) | 00093 ((_brt_mode << STLED316S_CONF_BRT_MODE_SHFT) & STLED316S_CONF_BRT_MODE_MSK) | 00094 ((_bright << STLED316S_CONF_BRT_GLOB_SHFT) & STLED316S_CONF_BRT_GLOB_MSK); 00095 00096 _writeReg(STLED316S_IDX(STLED316S_CONF_PAGE,STLED316S_CONF_ADDR), config); // Config set command 00097 // printf("Cmd= 0x%02X, Conf= 0x%02X\r\n", STLED316S_ADDR_WR_CMD | STLED316S_IDX(STLED316S_CONF_PAGE,STLED316S_CONF_ADDR), config); // Debug 00098 } 00099 00100 00101 /** Set Individual LED Brightness (value is used in IndivBright mode) 00102 * 00103 * @param LedData_t leds pattern of LED data 00104 * @param char led_brt (3 significant bits, valid range 0..7 (1/16 .. 14/14 dutycycle) 00105 * @return none 00106 */ 00107 void STLED316S::setLedBrightness(LedData_t leds, char led_brt) { 00108 char brt_old; 00109 00110 //Sanity check 00111 led_brt &= STLED316S_BRT_MSK; 00112 00113 if (leds & STLED316S_LED_L1) { // LED_1 00114 brt_old = _readReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED1_2_BRT_ADDR)); // LED Brt read command 00115 _writeReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED1_2_BRT_ADDR), (brt_old & 0xF0) | led_brt); // LED Brt set command 00116 } 00117 00118 if (leds & STLED316S_LED_L2) { // LED_2 00119 brt_old = _readReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED1_2_BRT_ADDR)); // LED Brt read command 00120 _writeReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED1_2_BRT_ADDR), (brt_old & 0x0F) | (led_brt << 4)); // LED Brt set command 00121 } 00122 00123 if (leds & STLED316S_LED_L3) { // LED_3 00124 brt_old = _readReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED3_4_BRT_ADDR)); // LED Brt read command 00125 _writeReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED3_4_BRT_ADDR), (brt_old & 0xF0) | led_brt); // LED Brt set command 00126 } 00127 00128 if (leds & STLED316S_LED_L4) { // LED_4 00129 brt_old = _readReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED3_4_BRT_ADDR)); // LED Brt read command 00130 _writeReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED3_4_BRT_ADDR), (brt_old & 0x0F) | (led_brt << 4)); // LED Brt set command 00131 } 00132 00133 if (leds & STLED316S_LED_L5) { // LED_5 00134 brt_old = _readReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED5_6_BRT_ADDR)); // LED Brt read command 00135 _writeReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED5_6_BRT_ADDR), (brt_old & 0xF0) | led_brt); // LED Brt set command 00136 } 00137 00138 if (leds & STLED316S_LED_L6) { // LED_6 00139 brt_old = _readReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED5_6_BRT_ADDR)); // LED Brt read command 00140 _writeReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED5_6_BRT_ADDR), (brt_old & 0x0F) | (led_brt << 4)); // LED Brt set command 00141 } 00142 00143 if (leds & STLED316S_LED_L7) { // LED_7 00144 brt_old = _readReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED7_8_BRT_ADDR)); // LED Brt read command 00145 _writeReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED7_8_BRT_ADDR), (brt_old & 0xF0) | led_brt); // LED Brt set command 00146 } 00147 00148 if (leds & STLED316S_LED_L8) { // LED_8 00149 brt_old = _readReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED7_8_BRT_ADDR)); // LED Brt read command 00150 _writeReg(STLED316S_IDX(STLED316S_LED_BRT_PAGE,STLED316S_LED7_8_BRT_ADDR), (brt_old & 0x0F) | (led_brt << 4)); // LED Brt set command 00151 } 00152 } 00153 00154 00155 /** Set Individual Digit Brightness (value is used in IndivBright mode) 00156 * 00157 * @param LedData_t digits pattern of Digit data 00158 * @param char dig_brt (3 significant bits, valid range 0..7 (1/16 .. 14/14 dutycycle) 00159 * @return none 00160 */ 00161 void STLED316S::setDigitBrightness(LedData_t digits, char dig_brt) { 00162 char brt_old; 00163 00164 //Sanity check 00165 dig_brt &= STLED316S_BRT_MSK; 00166 00167 if (digits & STLED316S_DIG_D2) { // DIGIT_2 00168 brt_old = _readReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG2_3_BRT_ADDR)); // Digit Brt read command 00169 _writeReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG2_3_BRT_ADDR), (brt_old & 0xF0) | dig_brt); // Digit Brt set command 00170 } 00171 00172 if (digits & STLED316S_DIG_D3) { // DIGIT_3 00173 brt_old = _readReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG2_3_BRT_ADDR)); // Digit Brt read command 00174 _writeReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG2_3_BRT_ADDR), (brt_old & 0x0F) | (dig_brt << 4)); // Digit Brt set command 00175 } 00176 00177 if (digits & STLED316S_DIG_D4) { // DIGIT_4 00178 brt_old = _readReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG4_5_BRT_ADDR)); // Digit Brt read command 00179 _writeReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG4_5_BRT_ADDR), (brt_old & 0xF0) | dig_brt); // Digit Brt set command 00180 } 00181 00182 if (digits & STLED316S_DIG_D5) { // DIGIT_5 00183 brt_old = _readReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG4_5_BRT_ADDR)); // Digit Brt read command 00184 _writeReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG4_5_BRT_ADDR), (brt_old & 0x0F) | (dig_brt << 4)); // Digit Brt set command 00185 } 00186 00187 if (digits & STLED316S_DIG_D6) { // DIGIT_6 00188 brt_old = _readReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG6_7_BRT_ADDR)); // Digit Brt read command 00189 _writeReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG6_7_BRT_ADDR), (brt_old & 0xF0) | dig_brt); // Digit Brt set command 00190 } 00191 00192 if (digits & STLED316S_DIG_D7) { // DIGIT_7 00193 brt_old = _readReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG6_7_BRT_ADDR)); // Digit Brt read command 00194 _writeReg(STLED316S_IDX(STLED316S_DIG_BRT_PAGE,STLED316S_DIG6_7_BRT_ADDR), (brt_old & 0x0F) | (dig_brt << 4)); // Digit Brt set command 00195 } 00196 } 00197 00198 00199 /** Set the Display mode On/off 00200 * 00201 * @param bool display mode 00202 */ 00203 void STLED316S::setDisplay(bool on) { 00204 00205 if (on) { 00206 _writeReg(STLED316S_IDX(STLED316S_DSP_PAGE,STLED316S_DSP_ON_ADDR)); // Display On command 00207 } 00208 else { 00209 _writeReg(STLED316S_IDX(STLED316S_DSP_PAGE,STLED316S_DSP_OFF_ADDR)); // Display Off command 00210 } 00211 } 00212 00213 /** Set Brightness mode 00214 * 00215 * @param BrightMode brt_mode (value is IndivBright or GlobalBright) 00216 * @return none 00217 */ 00218 void STLED316S::setBrightMode(BrightMode brt_mode) { 00219 char config; 00220 00221 _brt_mode = brt_mode; // mask invalid bits 00222 00223 config = ((_mode << STLED316S_CONF_GRID_SHFT) & STLED316S_CONF_GRID_MSK) | 00224 ((_brt_mode << STLED316S_CONF_BRT_MODE_SHFT) & STLED316S_CONF_BRT_MODE_MSK) | 00225 ((_bright << STLED316S_CONF_BRT_GLOB_SHFT) & STLED316S_CONF_BRT_GLOB_MSK); 00226 00227 _writeReg(STLED316S_IDX(STLED316S_CONF_PAGE,STLED316S_CONF_ADDR), config); // Config set command 00228 // printf("Cmd= 0x%02X, Conf= 0x%02X\r\n", STLED316S_ADDR_WR_CMD | STLED316S_IDX(STLED316S_CONF_PAGE,STLED316S_CONF_ADDR), config); // Debug 00229 } 00230 00231 00232 /** Write databyte to STLED316S 00233 * @param int address display memory location to write byte 00234 * @param char data byte written at given address 00235 * @return none 00236 */ 00237 void STLED316S::writeData(int address, char data) { 00238 _cs=0; 00239 wait_us(1); 00240 00241 _spi.write(_flip(STLED316S_ADDR_WR_CMD | STLED316S_IDX(STLED316S_DIG_PAGE, address))); // Address set cmd 00242 _spi.write(_flip(data)); // data 00243 00244 wait_us(1); 00245 _cs=1; 00246 } 00247 00248 /** Write Display datablock to STLED316S 00249 * @param DisplayData_t data Array of STLED316S_DISPLAY_MEM (=6) bytes for displaydata (starting at address 0) 00250 * @param length number bytes to write (valide range 0..STLED316S_DISPLAY_MEM (=6), starting at address 0) 00251 * @return none 00252 */ 00253 void STLED316S::writeData(DisplayData_t data, int length) { 00254 _cs=0; 00255 wait_us(1); 00256 00257 _spi.write(_flip(STLED316S_ADDR_WR_CMD | STLED316S_IDX(STLED316S_DIG_PAGE, 0x00))); // Set Address at 0 00258 00259 // printf("Cmd= 0x%02X\r\n", STLED316S_ADDR_WR_CMD | STLED316S_IDX(STLED316S_DIG_PAGE, 0x00)); // Debug 00260 00261 // sanity check 00262 if (length < 0) {length = 0;} 00263 if (length > STLED316S_DISPLAY_MEM) {length = STLED316S_DISPLAY_MEM;} 00264 00265 // for (int idx=0; idx<STLED316S_DISPLAY_MEM; idx++) { 00266 for (int idx=0; idx<length; idx++) { 00267 _spi.write(_flip(data[idx])); // data 00268 00269 // printf("Data= 0x%02X\r\n", data[idx]); // Debug 00270 } 00271 00272 wait_us(1); 00273 _cs=1; 00274 } 00275 00276 00277 /** Write LED data to STLED316S 00278 * @param LedData_t leds LED data 00279 * @return none 00280 */ 00281 void STLED316S::writeLedData(LedData_t leds) { 00282 _cs=0; 00283 wait_us(1); 00284 00285 _leds = leds; 00286 00287 _spi.write(_flip(STLED316S_ADDR_WR_CMD | STLED316S_IDX(STLED316S_DIG1_LED_PAGE, STLED316S_DIG1_LED_ADDR))); // Set Address 00288 // printf("Cmd= 0x%02Xr\n", STLED316S_ADDR_WR_CMD | STLED316S_IDX(STLED316S_DIG1_LED_PAGE, STLED316S_DIG1_LED_ADDR)); // Debug 00289 00290 _spi.write(_flip(leds)); // data 00291 // printf("Data 0x%02X\r\n", leds); // Debug 00292 00293 wait_us(1); 00294 _cs=1; 00295 } 00296 00297 00298 /** Set LED 00299 * 00300 * @param LedData_t leds pattern of LED data 00301 * @return none 00302 */ 00303 void STLED316S::setLed(LedData_t leds){ 00304 00305 _leds |= leds; 00306 writeLedData(_leds); 00307 } 00308 00309 /** Clr LED 00310 * 00311 * @param LedData_t leds pattern of LED data 00312 * @return none 00313 */ 00314 void STLED316S::clrLed(LedData_t leds){ 00315 _leds &= ~leds; 00316 writeLedData(_leds); 00317 } 00318 00319 /** Read keydata block from STLED316S 00320 * @param *keydata Ptr to Array of STLED316S_KEY_MEM (=5) bytes for keydata 00321 * @return bool keypress True when at least one key was pressed 00322 * 00323 * Note: Due to the hardware configuration the STLED316S key matrix scanner will detect multiple keys pressed at same time, 00324 * but this may also result in some spurious keys being set in keypress data array. 00325 * It may be best to ignore all keys in those situations. That option is implemented in this method depending on #define setting. 00326 */ 00327 bool STLED316S::getKeys(KeyData_t *keydata) { 00328 int keypress = 0; 00329 char data; 00330 00331 // Read keys 00332 _cs=0; 00333 wait_us(1); 00334 00335 // Enable Key Read mode 00336 _spi.write(_flip(STLED316S_ADDR_RD_CMD | STLED316S_IDX(STLED316S_KEY_PAGE, STLED316S_KEY1_ADDR))); // Set Address 00337 // printf("Cmd= 0x%02Xr\n", STLED316S_ADDR_RD_CMD | STLED316S_IDX(STLED316S_KEY_PAGE, STLED316S_KEY1_ADDR)); // Debug 00338 00339 for (int idx=0; idx < STLED316S_KEY_MEM; idx++) { 00340 data = _flip(_spi.write(0xFF)); // read keys and correct bitorder 00341 // printf("KeyData 0x%02X\r\n", data); // Debug 00342 00343 data = data & STLED316S_KEY_MSK; // Mask valid bits 00344 if (data != 0) { // Check for any pressed key 00345 for (int bit=0; bit < 8; bit++) { 00346 if (data & (1 << bit)) {keypress++;} // Test all significant bits 00347 } 00348 } 00349 00350 (*keydata)[idx] = data; // Store keydata after correcting bitorder 00351 } 00352 00353 wait_us(1); 00354 _cs=1; 00355 00356 #if(1) 00357 // Dismiss multiple keypresses at same time 00358 return (keypress == 1); 00359 #else 00360 // Allow multiple keypress and accept possible spurious keys 00361 return (keypress > 0); 00362 #endif 00363 } 00364 00365 00366 /** Helper to reverse all command or databits. The STLED316S expects LSB first, whereas SPI is MSB first 00367 * @param char data 00368 * @return bitreversed data 00369 */ 00370 char STLED316S::_flip(char data) { 00371 char value=0; 00372 00373 if (data & 0x01) {value |= 0x80;} ; 00374 if (data & 0x02) {value |= 0x40;} ; 00375 if (data & 0x04) {value |= 0x20;} ; 00376 if (data & 0x08) {value |= 0x10;} ; 00377 if (data & 0x10) {value |= 0x08;} ; 00378 if (data & 0x20) {value |= 0x04;} ; 00379 if (data & 0x40) {value |= 0x02;} ; 00380 if (data & 0x80) {value |= 0x01;} ; 00381 return value; 00382 } 00383 00384 00385 /** Write parameter to STLED316S Register 00386 * @param int idx Register address 00387 * @Param int data Parameter for Register 00388 * @return none 00389 */ 00390 void STLED316S::_writeReg(int idx, int data){ 00391 00392 _cs=0; 00393 wait_us(1); 00394 00395 _spi.write(_flip(STLED316S_ADDR_WR_CMD | (idx & STLED316S_IDX_MSK))); 00396 _spi.write(_flip(data) ); 00397 00398 // printf("Cmd= 0x%02X, Write= 0x%02X\r\n", STLED316S_ADDR_WR_CMD | (idx & STLED316S_IDX_MSK), data); // Debug 00399 00400 wait_us(1); 00401 _cs=1; 00402 } 00403 00404 00405 /** Write merged command and parameter to STLED316S 00406 * @param int cmd Command & Parameter byte 00407 * @return none 00408 */ 00409 void STLED316S::_writeReg(int cmd){ 00410 00411 _cs=0; 00412 wait_us(1); 00413 _spi.write(_flip(STLED316S_ADDR_WR_CMD | (cmd & STLED316S_IDX_MSK))); 00414 00415 // printf("Cmd= 0x%02X\r\n", STLED316S_ADDR_WR_CMD | (cmd & STLED316S_IDX_MSK)); // Debug 00416 00417 wait_us(1); 00418 _cs=1; 00419 } 00420 00421 00422 /** Read parameter from STLED316S Register 00423 * @param int idx Register address 00424 * @return char data from Register 00425 */ 00426 char STLED316S::_readReg(int idx){ 00427 char data; 00428 00429 _cs=0; 00430 wait_us(1); 00431 _spi.write(_flip(STLED316S_ADDR_RD_CMD | (idx & STLED316S_IDX_MSK))); 00432 00433 data = _flip(_spi.write(0xFF)); // read data and correct bitorder 00434 00435 // printf("Cmd= 0x%02X, Read= 0x%02X\r\n", STLED316S_ADDR_RD_CMD | (idx & STLED316S_IDX_MSK), data); // Debug 00436 00437 wait_us(1); 00438 _cs=1; 00439 00440 return data; 00441 } 00442 00443 00444 00445 #if(ST316BOARD_TEST == 1) 00446 // Derived class for STLED316S used in test display module 00447 // 00448 //#include "Font_7Seg.h" 00449 00450 /** Constructor for class for driving STM STLED316S controller as used in ST316S test display 00451 * 00452 * @brief Supports 6 Digits of 7 Segments and 3 LEDs. Also supports a scanned keyboard of 3. 00453 * 00454 * @param PinName mosi, miso, sclk, cs SPI bus pins 00455 */ 00456 STLED316S_BOARD::STLED316S_BOARD(PinName mosi, PinName miso, PinName sclk, PinName cs) : STLED316S(mosi, miso, sclk, cs, Grid6_Seg8) { 00457 _column = 0; 00458 _columns = ST316BOARD_NR_DIGITS; 00459 } 00460 00461 #if(0) 00462 #if DOXYGEN_ONLY 00463 /** Write a character to the Display 00464 * 00465 * @param c The character to write to the display 00466 */ 00467 int putc(int c); 00468 00469 /** Write a formatted string to the Display 00470 * 00471 * @param format A printf-style format string, followed by the 00472 * variables to use in formatting the string. 00473 */ 00474 int printf(const char* format, ...); 00475 #endif 00476 #endif 00477 00478 /** Locate cursor to a screen column 00479 * 00480 * @param column The horizontal position from the left, indexed from 0 00481 */ 00482 void STLED316S_BOARD::locate(int column) { 00483 //sanity check 00484 if (column < 0) {column = 0;} 00485 if (column > (_columns - 1)) {column = _columns - 1;} 00486 00487 _column = column; 00488 } 00489 00490 00491 /** Number of screen columns 00492 * 00493 * @param none 00494 * @return columns 00495 */ 00496 int STLED316S_BOARD::columns() { 00497 return _columns; 00498 } 00499 00500 00501 /** Clear the screen and locate to 0 00502 * @param bool clrAll Clear Icons also (default = false) 00503 */ 00504 void STLED316S_BOARD::cls(bool clrAll) { 00505 00506 if (clrAll) { 00507 //clear local buffer for LEDs/Icons 00508 setLed(0x00); 00509 } 00510 00511 //clear local buffer for digits 00512 for (int idx=0; idx < (ST316BOARD_NR_GRIDS * STLED316S_BYTES_PER_GRID); idx++) { 00513 _displaybuffer[idx] = 0x00; 00514 } 00515 writeData(_displaybuffer, (ST316BOARD_NR_GRIDS * STLED316S_BYTES_PER_GRID)); 00516 00517 _column = 0; 00518 } 00519 00520 00521 /** Set Icon 00522 * 00523 * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs 00524 * @return none 00525 */ 00526 void STLED316S_BOARD::setIcon(Icon icon) { 00527 // int addr; 00528 int icn; 00529 00530 icn = icon & 0xFF; 00531 // addr = (icon >> 24) & 0xFF; 00532 00533 setLed(icn); 00534 } 00535 00536 /** Clr Icon 00537 * 00538 * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs 00539 * @return none 00540 */ 00541 void STLED316S_BOARD::clrIcon(Icon icon) { 00542 // int addr; 00543 int icn; 00544 00545 icn = icon & 0xFF; 00546 // addr = (icon >> 24) & 0xFF; 00547 00548 clrLed(icn); 00549 } 00550 00551 00552 /** Set User Defined Characters (UDC) 00553 * 00554 * @param unsigned char udc_idx The Index of the UDC (0..7) 00555 * @param int udc_data The bitpattern for the UDC (16 bits) 00556 */ 00557 void STLED316S_BOARD::setUDC(unsigned char udc_idx, int udc_data) { 00558 00559 //Sanity check 00560 if (udc_idx > (ST316BOARD_NR_UDC-1)) { 00561 return; 00562 } 00563 // Mask out Icon bits? 00564 00565 _UDC_7S[udc_idx] = udc_data; 00566 } 00567 00568 00569 /** Write a single character (Stream implementation) 00570 */ 00571 int STLED316S_BOARD::_putc(int value) { 00572 00573 int addr; 00574 bool validChar = false; 00575 char pattern = 0x00; 00576 00577 if ((value == '\n') || (value == '\r')) { 00578 //No character to write 00579 validChar = false; 00580 00581 //Update Cursor 00582 _column = 0; 00583 } 00584 else if ((value == '.') || (value == ',')) { 00585 //No character to write 00586 validChar = false; 00587 pattern = S7_DP; // placeholder for all DPs 00588 00589 // Check to see that DP can be shown for current column 00590 if (_column > 0) { 00591 //Translate between _column and displaybuffer entries 00592 //Add DP to bitpattern of digit left of current column. 00593 addr = (_column - 1); 00594 00595 //Set bits for decimal point to write 00596 _displaybuffer[addr] = _displaybuffer[addr] | pattern; 00597 writeData(_displaybuffer, (ST316BOARD_NR_GRIDS * STLED316S_BYTES_PER_GRID)); 00598 00599 //No Cursor Update 00600 } 00601 } 00602 else if ((value >= 0) && (value < ST316BOARD_NR_UDC)) { 00603 //Character to write 00604 validChar = true; 00605 pattern = _UDC_7S[value]; 00606 } 00607 00608 #if (SHOW_ASCII == 1) 00609 //display all ASCII characters 00610 else if ((value >= FONT_7S_START) && (value <= FONT_7S_END)) { 00611 //Character to write 00612 validChar = true; 00613 pattern = FONT_7S[value - FONT_7S_START]; 00614 } // else 00615 #else 00616 //display only digits and hex characters 00617 else if (value == '-') { 00618 //Character to write 00619 validChar = true; 00620 pattern = C7_MIN; 00621 } 00622 else if ((value >= (int)'0') && (value <= (int) '9')) { 00623 //Character to write 00624 validChar = true; 00625 pattern = FONT_7S[value - (int) '0']; 00626 } 00627 else if ((value >= (int) 'A') && (value <= (int) 'F')) { 00628 //Character to write 00629 validChar = true; 00630 pattern = FONT_7S[10 + value - (int) 'A']; 00631 } 00632 else if ((value >= (int) 'a') && (value <= (int) 'f')) { 00633 //Character to write 00634 validChar = true; 00635 pattern = FONT_7S[10 + value - (int) 'a']; 00636 } //else 00637 #endif 00638 00639 if (validChar) { 00640 //Character to write 00641 00642 //Translate between _column and displaybuffer entries 00643 //_column == 0 => Grid0 => addr = 0 00644 // 00645 //_column == 5 => Grid5 => addr = 5 00646 addr = _column; 00647 _displaybuffer[addr] = pattern; 00648 00649 writeData(_displaybuffer, (ST316BOARD_NR_GRIDS * STLED316S_BYTES_PER_GRID)); 00650 00651 //Update Cursor 00652 _column++; 00653 if (_column > (ST316BOARD_NR_DIGITS - 1)) { 00654 _column = 0; 00655 } 00656 00657 } // if validChar 00658 00659 return value; 00660 } 00661 00662 // get a single character (Stream implementation) 00663 int STLED316S_BOARD::_getc() { 00664 return -1; 00665 } 00666 #endif
Generated on Sat Jul 16 2022 20:44:27 by
1.7.2
STLED316S (56 LEDs max), Keyboard scan (16 keys max)