Library for TM1650 LED controller (32 LEDs max, 28 keys max)

Dependents:   mbed_TM1650

See here for more info.

Committer:
wim
Date:
Tue Oct 10 18:38:46 2017 +0000
Revision:
0:4430a1559b4f
Library for TM1650 LED controller (32 LEDs max, 27 keys max)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wim 0:4430a1559b4f 1 /* mbed TM1650 Library, for TM1650 LED controller
wim 0:4430a1559b4f 2 * Copyright (c) 2017, v01: WH, Initial version
wim 0:4430a1559b4f 3 *
wim 0:4430a1559b4f 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
wim 0:4430a1559b4f 5 * of this software and associated documentation files (the "Software"), to deal
wim 0:4430a1559b4f 6 * in the Software without restriction, inclumosig without limitation the rights
wim 0:4430a1559b4f 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
wim 0:4430a1559b4f 8 * copies of the Software, and to permit persons to whom the Software is
wim 0:4430a1559b4f 9 * furnished to do so, subject to the following conditions:
wim 0:4430a1559b4f 10 *
wim 0:4430a1559b4f 11 * The above copyright notice and this permission notice shall be included in
wim 0:4430a1559b4f 12 * all copies or substantial portions of the Software.
wim 0:4430a1559b4f 13 *
wim 0:4430a1559b4f 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
wim 0:4430a1559b4f 15 * IMPLIED, INCLUmosiG BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
wim 0:4430a1559b4f 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
wim 0:4430a1559b4f 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
wim 0:4430a1559b4f 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
wim 0:4430a1559b4f 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
wim 0:4430a1559b4f 20 * THE SOFTWARE.
wim 0:4430a1559b4f 21 */
wim 0:4430a1559b4f 22 #include "mbed.h"
wim 0:4430a1559b4f 23 #include "TM1650.h"
wim 0:4430a1559b4f 24
wim 0:4430a1559b4f 25 /** Constructor for class for driving TM1650 LED controller with Serial bus interface device.
wim 0:4430a1559b4f 26 * @brief Supports 4 digits @ 8 segments. Also supports upto 28 Keys.
wim 0:4430a1559b4f 27 *
wim 0:4430a1559b4f 28 * @param PinName dio Serial bus DIO pin
wim 0:4430a1559b4f 29 * @param PinName clk Serial bus CLK pin
wim 0:4430a1559b4f 30 */
wim 0:4430a1559b4f 31 TM1650::TM1650(PinName dio, PinName clk) : _dio(dio), _clk(clk) {
wim 0:4430a1559b4f 32
wim 0:4430a1559b4f 33 _init();
wim 0:4430a1559b4f 34 }
wim 0:4430a1559b4f 35
wim 0:4430a1559b4f 36
wim 0:4430a1559b4f 37 /** Init the Serial interface and the controller
wim 0:4430a1559b4f 38 * @param none
wim 0:4430a1559b4f 39 * @return none
wim 0:4430a1559b4f 40 */
wim 0:4430a1559b4f 41 void TM1650::_init(){
wim 0:4430a1559b4f 42
wim 0:4430a1559b4f 43 //TM1650 uses a Serial bus that looks like I2C, but really is not.
wim 0:4430a1559b4f 44 //It has Start and Stop conditions like I2C and an Ack pulse, but instead of slaveaddresses and a RW bit it just transmits commands and data.
wim 0:4430a1559b4f 45
wim 0:4430a1559b4f 46 //init Serial bus
wim 0:4430a1559b4f 47 _dio.output();
wim 0:4430a1559b4f 48 // _dio.mode(PullUp);
wim 0:4430a1559b4f 49 wait_us(1);
wim 0:4430a1559b4f 50
wim 0:4430a1559b4f 51 _dio=1;
wim 0:4430a1559b4f 52 _clk=1;
wim 0:4430a1559b4f 53
wim 0:4430a1559b4f 54 //init controller
wim 0:4430a1559b4f 55 _bright = TM1650_BRT_DEF;
wim 0:4430a1559b4f 56 _segment = TM1650_DSP_8S;
wim 0:4430a1559b4f 57 _display = TM1650_DSP_ON;
wim 0:4430a1559b4f 58 _writeCmd(TM1650_DSP_CTRL_CMD, _bright | _segment | _display ); // Display control cmd, brightness, 7/8 segments, display on/off
wim 0:4430a1559b4f 59 }
wim 0:4430a1559b4f 60
wim 0:4430a1559b4f 61
wim 0:4430a1559b4f 62 /** Clear the screen and locate to 0
wim 0:4430a1559b4f 63 */
wim 0:4430a1559b4f 64 void TM1650::cls() {
wim 0:4430a1559b4f 65
wim 0:4430a1559b4f 66 for (int cnt=0; cnt<TM1650_DISPLAY_MEM; cnt++) {
wim 0:4430a1559b4f 67 _start();
wim 0:4430a1559b4f 68 _write(TM1650_DATA_WR_CMD | (cnt << 1)); // Set Address cmd (no auto incr supported)
wim 0:4430a1559b4f 69 _write(0x00); // Write data
wim 0:4430a1559b4f 70 _stop();
wim 0:4430a1559b4f 71 }
wim 0:4430a1559b4f 72
wim 0:4430a1559b4f 73 }
wim 0:4430a1559b4f 74
wim 0:4430a1559b4f 75 /** Set Brightness
wim 0:4430a1559b4f 76 *
wim 0:4430a1559b4f 77 * @param char brightness (3 significant bits, valid range 0..7 (1/16 .. 14/14 dutycycle)
wim 0:4430a1559b4f 78 * @return none
wim 0:4430a1559b4f 79 */
wim 0:4430a1559b4f 80 void TM1650::setBrightness(char brightness){
wim 0:4430a1559b4f 81
wim 0:4430a1559b4f 82 _bright = brightness & TM1650_BRT_MSK; // mask invalid bits
wim 0:4430a1559b4f 83
wim 0:4430a1559b4f 84 _writeCmd(TM1650_DSP_CTRL_CMD, _bright | _segment | _display ); // Display control cmd, brightness, 7/8 segments, display on/off
wim 0:4430a1559b4f 85 }
wim 0:4430a1559b4f 86
wim 0:4430a1559b4f 87 /** Set the Display mode On/off
wim 0:4430a1559b4f 88 *
wim 0:4430a1559b4f 89 * @param bool display mode
wim 0:4430a1559b4f 90 */
wim 0:4430a1559b4f 91 void TM1650::setDisplay(bool on) {
wim 0:4430a1559b4f 92
wim 0:4430a1559b4f 93 if (on) {
wim 0:4430a1559b4f 94 _display = TM1650_DSP_ON;
wim 0:4430a1559b4f 95 }
wim 0:4430a1559b4f 96 else {
wim 0:4430a1559b4f 97 _display = TM1650_DSP_OFF;
wim 0:4430a1559b4f 98 }
wim 0:4430a1559b4f 99
wim 0:4430a1559b4f 100 _writeCmd(TM1650_DSP_CTRL_CMD, _bright | _segment | _display ); // Display control cmd, brightness, 7/8 segments, display on/off
wim 0:4430a1559b4f 101 }
wim 0:4430a1559b4f 102
wim 0:4430a1559b4f 103 /** Write databyte to TM1650
wim 0:4430a1559b4f 104 * @param int address display memory location to write byte
wim 0:4430a1559b4f 105 * @param char data byte written at given address
wim 0:4430a1559b4f 106 * @return none
wim 0:4430a1559b4f 107 */
wim 0:4430a1559b4f 108 void TM1650::writeData(char data, int address) {
wim 0:4430a1559b4f 109
wim 0:4430a1559b4f 110 _start();
wim 0:4430a1559b4f 111
wim 0:4430a1559b4f 112 _write(TM1650_DATA_WR_CMD | ((address & TM1650_ADDR_MSK) << 1)); // Set Address cmd
wim 0:4430a1559b4f 113 _write(data); // Write data
wim 0:4430a1559b4f 114
wim 0:4430a1559b4f 115 _stop();
wim 0:4430a1559b4f 116 }
wim 0:4430a1559b4f 117
wim 0:4430a1559b4f 118 /** Write Display datablock to TM1650
wim 0:4430a1559b4f 119 * @param DisplayData_t data Array of TM1650_DISPLAY_MEM (=4) bytes for displaydata
wim 0:4430a1559b4f 120 * @param length number bytes to write (valid range 0..(TM1650_MAX_NR_GRIDS * TM1650_BYTES_PER_GRID) (=4), when starting at address 0)
wim 0:4430a1559b4f 121 * @param int address display memory location to write bytes (default = 0)
wim 0:4430a1559b4f 122 * @return none
wim 0:4430a1559b4f 123 */
wim 0:4430a1559b4f 124 void TM1650::writeData(DisplayData_t data, int length, int address) {
wim 0:4430a1559b4f 125
wim 0:4430a1559b4f 126 // sanity check
wim 0:4430a1559b4f 127 address &= TM1650_ADDR_MSK;
wim 0:4430a1559b4f 128 if (length < 0) {length = 0;}
wim 0:4430a1559b4f 129 if ((length + address) > TM1650_DISPLAY_MEM) {length = (TM1650_DISPLAY_MEM - address);}
wim 0:4430a1559b4f 130
wim 0:4430a1559b4f 131 for (int idx=0; idx<length; idx++) {
wim 0:4430a1559b4f 132 _start();
wim 0:4430a1559b4f 133 _write(TM1650_DATA_WR_CMD | ((address + idx) << 1)); // Set Address cmd (no auto incr supported)
wim 0:4430a1559b4f 134 _write(data[address + idx]); // Write data
wim 0:4430a1559b4f 135 _stop();
wim 0:4430a1559b4f 136 }
wim 0:4430a1559b4f 137 }
wim 0:4430a1559b4f 138
wim 0:4430a1559b4f 139 /** Read keydata block from TM1650
wim 0:4430a1559b4f 140 * @param *keydata Ptr to bytes for keydata
wim 0:4430a1559b4f 141 * @return bool keypress True when at least one key was pressed
wim 0:4430a1559b4f 142 */
wim 0:4430a1559b4f 143 bool TM1650::getKeys(KeyData_t *keydata) {
wim 0:4430a1559b4f 144
wim 0:4430a1559b4f 145 _start();
wim 0:4430a1559b4f 146
wim 0:4430a1559b4f 147 // Enable Key Read mode
wim 0:4430a1559b4f 148 _write(TM1650_KEY_RD_CMD); // Read Key cmd
wim 0:4430a1559b4f 149
wim 0:4430a1559b4f 150 // Read key
wim 0:4430a1559b4f 151 *keydata = _read();
wim 0:4430a1559b4f 152 // printf("Key = 0x%02x\r\n", *keydata); // debug
wim 0:4430a1559b4f 153
wim 0:4430a1559b4f 154 _stop();
wim 0:4430a1559b4f 155
wim 0:4430a1559b4f 156 // Check if valid key bits are set
wim 0:4430a1559b4f 157 return ( (*keydata & TM1650_SW_MSK) == TM1650_SW_MSK );
wim 0:4430a1559b4f 158 }
wim 0:4430a1559b4f 159
wim 0:4430a1559b4f 160
wim 0:4430a1559b4f 161 /** Generate Start condition for TM1650
wim 0:4430a1559b4f 162 * @param none
wim 0:4430a1559b4f 163 * @return none
wim 0:4430a1559b4f 164 */
wim 0:4430a1559b4f 165 void TM1650::_start() {
wim 0:4430a1559b4f 166
wim 0:4430a1559b4f 167 _dio=0;
wim 0:4430a1559b4f 168 wait_us(1);
wim 0:4430a1559b4f 169 _clk=0;
wim 0:4430a1559b4f 170 wait_us(1);
wim 0:4430a1559b4f 171 }
wim 0:4430a1559b4f 172
wim 0:4430a1559b4f 173 /** Generate Stop condition for TM1650
wim 0:4430a1559b4f 174 * @param none
wim 0:4430a1559b4f 175 * @return none
wim 0:4430a1559b4f 176 */
wim 0:4430a1559b4f 177 void TM1650::_stop() {
wim 0:4430a1559b4f 178
wim 0:4430a1559b4f 179 _dio=0;
wim 0:4430a1559b4f 180 wait_us(1);
wim 0:4430a1559b4f 181 _clk=1;
wim 0:4430a1559b4f 182 wait_us(1);
wim 0:4430a1559b4f 183 _dio=1;
wim 0:4430a1559b4f 184 wait_us(1);
wim 0:4430a1559b4f 185 }
wim 0:4430a1559b4f 186
wim 0:4430a1559b4f 187 /** Send byte to TM1650
wim 0:4430a1559b4f 188 * @param int data
wim 0:4430a1559b4f 189 * @return none
wim 0:4430a1559b4f 190 */
wim 0:4430a1559b4f 191 void TM1650::_write(int data) {
wim 0:4430a1559b4f 192
wim 0:4430a1559b4f 193 for (int bit=7; bit >= 0; bit--) {
wim 0:4430a1559b4f 194 //The TM1650 expects MSB first
wim 0:4430a1559b4f 195 if (((data >> bit) & 0x01) == 0x01) {
wim 0:4430a1559b4f 196 _dio=1;
wim 0:4430a1559b4f 197 }
wim 0:4430a1559b4f 198 else {
wim 0:4430a1559b4f 199 _dio=0;
wim 0:4430a1559b4f 200 }
wim 0:4430a1559b4f 201 wait_us(1);
wim 0:4430a1559b4f 202 _clk=1;
wim 0:4430a1559b4f 203 wait_us(1);
wim 0:4430a1559b4f 204 _clk=0;
wim 0:4430a1559b4f 205 wait_us(1);
wim 0:4430a1559b4f 206 }
wim 0:4430a1559b4f 207
wim 0:4430a1559b4f 208 _dio=1;
wim 0:4430a1559b4f 209
wim 0:4430a1559b4f 210 // Prepare DIO to read data
wim 0:4430a1559b4f 211 _dio.input();
wim 0:4430a1559b4f 212 wait_us(3);
wim 0:4430a1559b4f 213
wim 0:4430a1559b4f 214 // dummy Ack
wim 0:4430a1559b4f 215 _clk=1;
wim 0:4430a1559b4f 216 wait_us(1);
wim 0:4430a1559b4f 217 // _ack = _dio;
wim 0:4430a1559b4f 218 _clk=0;
wim 0:4430a1559b4f 219 wait_us(1);
wim 0:4430a1559b4f 220
wim 0:4430a1559b4f 221 // Return DIO to output mode
wim 0:4430a1559b4f 222 _dio.output();
wim 0:4430a1559b4f 223 wait_us(3);
wim 0:4430a1559b4f 224
wim 0:4430a1559b4f 225 _dio=1; //idle
wim 0:4430a1559b4f 226 }
wim 0:4430a1559b4f 227
wim 0:4430a1559b4f 228 /** Read byte from TM1650
wim 0:4430a1559b4f 229 * @param none
wim 0:4430a1559b4f 230 * @return read byte
wim 0:4430a1559b4f 231 */
wim 0:4430a1559b4f 232 char TM1650::_read() {
wim 0:4430a1559b4f 233 char keycode = 0;
wim 0:4430a1559b4f 234
wim 0:4430a1559b4f 235 // Prepare DIO to read data
wim 0:4430a1559b4f 236 _dio.input();
wim 0:4430a1559b4f 237 wait_us(3);
wim 0:4430a1559b4f 238
wim 0:4430a1559b4f 239 for (int bit=0; bit<8; bit++) {
wim 0:4430a1559b4f 240
wim 0:4430a1559b4f 241 //The TM1650 sends bitpattern: D7..D0
wim 0:4430a1559b4f 242 //Data is shifted out by the TM1650 on the falling edge of CLK
wim 0:4430a1559b4f 243 //Observe sufficient delay to allow the Open Drain DIO to rise to H levels
wim 0:4430a1559b4f 244 // Prepare to read next bit, MSB (ie D7) first.
wim 0:4430a1559b4f 245 keycode = keycode << 1;
wim 0:4430a1559b4f 246
wim 0:4430a1559b4f 247 _clk=1;
wim 0:4430a1559b4f 248 wait_us(1);
wim 0:4430a1559b4f 249
wim 0:4430a1559b4f 250 // Read next bit
wim 0:4430a1559b4f 251 if (_dio) { keycode |= 0x01; }
wim 0:4430a1559b4f 252
wim 0:4430a1559b4f 253 _clk=0;
wim 0:4430a1559b4f 254 wait_us(5); // Delay to allow for slow risetime
wim 0:4430a1559b4f 255 }
wim 0:4430a1559b4f 256
wim 0:4430a1559b4f 257 // Return DIO to output mode
wim 0:4430a1559b4f 258 _dio.output();
wim 0:4430a1559b4f 259 wait_us(3);
wim 0:4430a1559b4f 260
wim 0:4430a1559b4f 261 // dummy Ack
wim 0:4430a1559b4f 262 _dio=0; //Ack
wim 0:4430a1559b4f 263 wait_us(1);
wim 0:4430a1559b4f 264
wim 0:4430a1559b4f 265 _clk=1;
wim 0:4430a1559b4f 266 wait_us(1);
wim 0:4430a1559b4f 267 _clk=0;
wim 0:4430a1559b4f 268 wait_us(1);
wim 0:4430a1559b4f 269
wim 0:4430a1559b4f 270 _dio=1; //idle
wim 0:4430a1559b4f 271
wim 0:4430a1559b4f 272 return keycode;
wim 0:4430a1559b4f 273 }
wim 0:4430a1559b4f 274
wim 0:4430a1559b4f 275 /** Write command (and parameters) to TM1650
wim 0:4430a1559b4f 276 * @param int cmd Command byte
wim 0:4430a1559b4f 277 * @Param int data Parameters for command
wim 0:4430a1559b4f 278 * @return none
wim 0:4430a1559b4f 279 */
wim 0:4430a1559b4f 280 void TM1650::_writeCmd(int cmd, int data){
wim 0:4430a1559b4f 281
wim 0:4430a1559b4f 282 _start();
wim 0:4430a1559b4f 283
wim 0:4430a1559b4f 284 _write(cmd);
wim 0:4430a1559b4f 285 _write(data);
wim 0:4430a1559b4f 286
wim 0:4430a1559b4f 287 _stop();
wim 0:4430a1559b4f 288 }
wim 0:4430a1559b4f 289
wim 0:4430a1559b4f 290
wim 0:4430a1559b4f 291 #if (MEIBAI_TEST == 1)
wim 0:4430a1559b4f 292 // Derived class for TM1650 used in MEIBAI display unit
wim 0:4430a1559b4f 293 //
wim 0:4430a1559b4f 294
wim 0:4430a1559b4f 295 /** Constructor for class for driving TM1650 LED controller
wim 0:4430a1559b4f 296 *
wim 0:4430a1559b4f 297 * @brief Supports 4 Digits of 7 Segments + DP.
wim 0:4430a1559b4f 298 * Also supports 3 keys.
wim 0:4430a1559b4f 299 * Serial bus interface device.
wim 0:4430a1559b4f 300 *
wim 0:4430a1559b4f 301 * @param PinName dio Serial bus DIO pin
wim 0:4430a1559b4f 302 * @param PinName sck Serial bus CLK pin
wim 0:4430a1559b4f 303 */
wim 0:4430a1559b4f 304 TM1650_MEIBAI::TM1650_MEIBAI(PinName dio, PinName clk) : TM1650(dio, clk) {
wim 0:4430a1559b4f 305 _column = 0;
wim 0:4430a1559b4f 306 _columns = MEIBAI_NR_DIGITS;
wim 0:4430a1559b4f 307 }
wim 0:4430a1559b4f 308
wim 0:4430a1559b4f 309 #if(0)
wim 0:4430a1559b4f 310 #if DOXYGEN_ONLY
wim 0:4430a1559b4f 311 /** Write a character to the Display
wim 0:4430a1559b4f 312 *
wim 0:4430a1559b4f 313 * @param c The character to write to the display
wim 0:4430a1559b4f 314 * @return c
wim 0:4430a1559b4f 315 */
wim 0:4430a1559b4f 316 int putc(int c);
wim 0:4430a1559b4f 317
wim 0:4430a1559b4f 318 /** Write a formatted string to the Display
wim 0:4430a1559b4f 319 *
wim 0:4430a1559b4f 320 * @param format A printf-style format string, followed by the
wim 0:4430a1559b4f 321 * variables to use in formatting the string.
wim 0:4430a1559b4f 322 */
wim 0:4430a1559b4f 323 int printf(const char* format, ...);
wim 0:4430a1559b4f 324 #endif
wim 0:4430a1559b4f 325 #endif
wim 0:4430a1559b4f 326
wim 0:4430a1559b4f 327 /** Locate cursor to a screen column
wim 0:4430a1559b4f 328 *
wim 0:4430a1559b4f 329 * @param column The horizontal position from the left, indexed from 0
wim 0:4430a1559b4f 330 * @return none
wim 0:4430a1559b4f 331 */
wim 0:4430a1559b4f 332 void TM1650_MEIBAI::locate(int column) {
wim 0:4430a1559b4f 333 //sanity check
wim 0:4430a1559b4f 334 if (column < 0) {column = 0;}
wim 0:4430a1559b4f 335 if (column > (_columns - 1)) {column = _columns - 1;}
wim 0:4430a1559b4f 336
wim 0:4430a1559b4f 337 _column = column;
wim 0:4430a1559b4f 338 }
wim 0:4430a1559b4f 339
wim 0:4430a1559b4f 340
wim 0:4430a1559b4f 341 /** Number of screen columns
wim 0:4430a1559b4f 342 *
wim 0:4430a1559b4f 343 * @param none
wim 0:4430a1559b4f 344 * @return columns
wim 0:4430a1559b4f 345 */
wim 0:4430a1559b4f 346 int TM1650_MEIBAI::columns() {
wim 0:4430a1559b4f 347 return _columns;
wim 0:4430a1559b4f 348 }
wim 0:4430a1559b4f 349
wim 0:4430a1559b4f 350
wim 0:4430a1559b4f 351 /** Clear the screen and locate to 0
wim 0:4430a1559b4f 352 *
wim 0:4430a1559b4f 353 * @param bool clrAll Clear Icons also (default = false)
wim 0:4430a1559b4f 354 * @return none
wim 0:4430a1559b4f 355 */
wim 0:4430a1559b4f 356 void TM1650_MEIBAI::cls(bool clrAll) {
wim 0:4430a1559b4f 357
wim 0:4430a1559b4f 358 if (clrAll) {
wim 0:4430a1559b4f 359 //clear local buffer (inclumosig Icons)
wim 0:4430a1559b4f 360 for (int idx=0; idx < MEIBAI_NR_GRIDS; idx++) {
wim 0:4430a1559b4f 361 _displaybuffer[idx] = 0x00;
wim 0:4430a1559b4f 362 }
wim 0:4430a1559b4f 363 }
wim 0:4430a1559b4f 364 else {
wim 0:4430a1559b4f 365 //clear local buffer (preserving Icons)
wim 0:4430a1559b4f 366 for (int idx=0; idx < MEIBAI_NR_GRIDS; idx++) {
wim 0:4430a1559b4f 367 _displaybuffer[idx] = _displaybuffer[idx] & MASK_ICON_GRID[idx];
wim 0:4430a1559b4f 368 }
wim 0:4430a1559b4f 369 }
wim 0:4430a1559b4f 370
wim 0:4430a1559b4f 371 writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), 0);
wim 0:4430a1559b4f 372
wim 0:4430a1559b4f 373 _column = 0;
wim 0:4430a1559b4f 374 }
wim 0:4430a1559b4f 375
wim 0:4430a1559b4f 376 /** Set Icon
wim 0:4430a1559b4f 377 *
wim 0:4430a1559b4f 378 * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs
wim 0:4430a1559b4f 379 * @return none
wim 0:4430a1559b4f 380 */
wim 0:4430a1559b4f 381 void TM1650_MEIBAI::setIcon(Icon icon) {
wim 0:4430a1559b4f 382 int addr, icn;
wim 0:4430a1559b4f 383
wim 0:4430a1559b4f 384 icn = icon & 0xFFFF;
wim 0:4430a1559b4f 385 addr = (icon >> 24) & 0xFF;
wim 0:4430a1559b4f 386 addr = (addr - 1);
wim 0:4430a1559b4f 387
wim 0:4430a1559b4f 388 //Save char...and set bits for icon to write
wim 0:4430a1559b4f 389 _displaybuffer[addr] = _displaybuffer[addr] | LO(icn);
wim 0:4430a1559b4f 390 // writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), 0);
wim 0:4430a1559b4f 391 writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr);
wim 0:4430a1559b4f 392 }
wim 0:4430a1559b4f 393
wim 0:4430a1559b4f 394 /** Clr Icon
wim 0:4430a1559b4f 395 *
wim 0:4430a1559b4f 396 * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs
wim 0:4430a1559b4f 397 * @return none
wim 0:4430a1559b4f 398 */
wim 0:4430a1559b4f 399 void TM1650_MEIBAI::clrIcon(Icon icon) {
wim 0:4430a1559b4f 400 int addr, icn;
wim 0:4430a1559b4f 401
wim 0:4430a1559b4f 402 icn = icon & 0xFFFF;
wim 0:4430a1559b4f 403 addr = (icon >> 24) & 0xFF;
wim 0:4430a1559b4f 404 addr = (addr - 1);
wim 0:4430a1559b4f 405
wim 0:4430a1559b4f 406 //Save char...and clr bits for icon to write
wim 0:4430a1559b4f 407 _displaybuffer[addr] = _displaybuffer[addr] & ~LO(icn);
wim 0:4430a1559b4f 408 // writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), 0);
wim 0:4430a1559b4f 409 writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr);
wim 0:4430a1559b4f 410 }
wim 0:4430a1559b4f 411
wim 0:4430a1559b4f 412
wim 0:4430a1559b4f 413 /** Set User Defined Characters (UDC)
wim 0:4430a1559b4f 414 *
wim 0:4430a1559b4f 415 * @param unsigned char udc_idx The Index of the UDC (0..7)
wim 0:4430a1559b4f 416 * @param int udc_data The bitpattern for the UDC (8 bits)
wim 0:4430a1559b4f 417 * @return none
wim 0:4430a1559b4f 418 */
wim 0:4430a1559b4f 419 void TM1650_MEIBAI::setUDC(unsigned char udc_idx, int udc_data) {
wim 0:4430a1559b4f 420
wim 0:4430a1559b4f 421 //Sanity check
wim 0:4430a1559b4f 422 if (udc_idx > (MEIBAI_NR_UDC-1)) {
wim 0:4430a1559b4f 423 return;
wim 0:4430a1559b4f 424 }
wim 0:4430a1559b4f 425 // Mask out Icon bits?
wim 0:4430a1559b4f 426
wim 0:4430a1559b4f 427 _UDC_7S[udc_idx] = LO(udc_data);
wim 0:4430a1559b4f 428 }
wim 0:4430a1559b4f 429
wim 0:4430a1559b4f 430
wim 0:4430a1559b4f 431 /** Write a single character (Stream implementation)
wim 0:4430a1559b4f 432 *
wim 0:4430a1559b4f 433 * @param c The character to write to the display
wim 0:4430a1559b4f 434 * @return c
wim 0:4430a1559b4f 435 */
wim 0:4430a1559b4f 436 int TM1650_MEIBAI::_putc(int value) {
wim 0:4430a1559b4f 437 //The MEIBAI mapping between Digit positions (Left to Right) and Grids is:
wim 0:4430a1559b4f 438 // GR1 GR2 GR3 GR4
wim 0:4430a1559b4f 439 //The memory addresses or column numbers are:
wim 0:4430a1559b4f 440 // 0 1 2 3
wim 0:4430a1559b4f 441
wim 0:4430a1559b4f 442 int addr;
wim 0:4430a1559b4f 443 bool validChar = false;
wim 0:4430a1559b4f 444 char pattern = 0x00;
wim 0:4430a1559b4f 445
wim 0:4430a1559b4f 446 if ((value == '\n') || (value == '\r')) {
wim 0:4430a1559b4f 447 //No character to write
wim 0:4430a1559b4f 448 validChar = false;
wim 0:4430a1559b4f 449
wim 0:4430a1559b4f 450 //Update Cursor
wim 0:4430a1559b4f 451 _column = 0;
wim 0:4430a1559b4f 452 }
wim 0:4430a1559b4f 453 else if ((value == '.') || (value == ',')) {
wim 0:4430a1559b4f 454 //No character to write
wim 0:4430a1559b4f 455 validChar = false;
wim 0:4430a1559b4f 456 pattern = S7_DP; // placeholder for all DPs
wim 0:4430a1559b4f 457
wim 0:4430a1559b4f 458 // Check to see that DP can be shown for current column
wim 0:4430a1559b4f 459 if (_column > 0) {
wim 0:4430a1559b4f 460 //Translate between _column and displaybuffer entries
wim 0:4430a1559b4f 461 //Add DP to bitpattern of digit left of current column.
wim 0:4430a1559b4f 462 addr = (_column - 1);
wim 0:4430a1559b4f 463
wim 0:4430a1559b4f 464 //Save icons...and set bits for decimal point to write
wim 0:4430a1559b4f 465 _displaybuffer[addr] = _displaybuffer[addr] | pattern;
wim 0:4430a1559b4f 466 // writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID));
wim 0:4430a1559b4f 467 writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr);
wim 0:4430a1559b4f 468
wim 0:4430a1559b4f 469 //No Cursor Update
wim 0:4430a1559b4f 470 }
wim 0:4430a1559b4f 471 }
wim 0:4430a1559b4f 472 else if ((value >= 0) && (value < MEIBAI_NR_UDC)) {
wim 0:4430a1559b4f 473 //Character to write
wim 0:4430a1559b4f 474 validChar = true;
wim 0:4430a1559b4f 475 pattern = _UDC_7S[value];
wim 0:4430a1559b4f 476 }
wim 0:4430a1559b4f 477
wim 0:4430a1559b4f 478 #if (SHOW_ASCII == 1)
wim 0:4430a1559b4f 479 //display all ASCII characters
wim 0:4430a1559b4f 480 else if ((value >= FONT_7S_START) && (value <= FONT_7S_END)) {
wim 0:4430a1559b4f 481 //Character to write
wim 0:4430a1559b4f 482 validChar = true;
wim 0:4430a1559b4f 483 pattern = FONT_7S[value - FONT_7S_START];
wim 0:4430a1559b4f 484 } // else
wim 0:4430a1559b4f 485 #else
wim 0:4430a1559b4f 486 //display only digits and hex characters
wim 0:4430a1559b4f 487 else if (value == '-') {
wim 0:4430a1559b4f 488 //Character to write
wim 0:4430a1559b4f 489 validChar = true;
wim 0:4430a1559b4f 490 pattern = C7_MIN;
wim 0:4430a1559b4f 491 }
wim 0:4430a1559b4f 492 else if ((value >= (int)'0') && (value <= (int) '9')) {
wim 0:4430a1559b4f 493 //Character to write
wim 0:4430a1559b4f 494 validChar = true;
wim 0:4430a1559b4f 495 pattern = FONT_7S[value - (int) '0'];
wim 0:4430a1559b4f 496 }
wim 0:4430a1559b4f 497 else if ((value >= (int) 'A') && (value <= (int) 'F')) {
wim 0:4430a1559b4f 498 //Character to write
wim 0:4430a1559b4f 499 validChar = true;
wim 0:4430a1559b4f 500 pattern = FONT_7S[10 + value - (int) 'A'];
wim 0:4430a1559b4f 501 }
wim 0:4430a1559b4f 502 else if ((value >= (int) 'a') && (value <= (int) 'f')) {
wim 0:4430a1559b4f 503 //Character to write
wim 0:4430a1559b4f 504 validChar = true;
wim 0:4430a1559b4f 505 pattern = FONT_7S[10 + value - (int) 'a'];
wim 0:4430a1559b4f 506 } //else
wim 0:4430a1559b4f 507 #endif
wim 0:4430a1559b4f 508
wim 0:4430a1559b4f 509 if (validChar) {
wim 0:4430a1559b4f 510 //Character to write
wim 0:4430a1559b4f 511
wim 0:4430a1559b4f 512 //Translate between _column and displaybuffer entries
wim 0:4430a1559b4f 513 addr = _column;
wim 0:4430a1559b4f 514
wim 0:4430a1559b4f 515 //Save icons...and set bits for character to write
wim 0:4430a1559b4f 516 _displaybuffer[addr] = (_displaybuffer[addr] & MASK_ICON_GRID[_column]) | pattern;
wim 0:4430a1559b4f 517
wim 0:4430a1559b4f 518 // writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID));
wim 0:4430a1559b4f 519 writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr);
wim 0:4430a1559b4f 520
wim 0:4430a1559b4f 521 //Update Cursor
wim 0:4430a1559b4f 522 _column++;
wim 0:4430a1559b4f 523 if (_column > (MEIBAI_NR_DIGITS - 1)) {
wim 0:4430a1559b4f 524 _column = 0;
wim 0:4430a1559b4f 525 }
wim 0:4430a1559b4f 526
wim 0:4430a1559b4f 527 } // if validChar
wim 0:4430a1559b4f 528
wim 0:4430a1559b4f 529 return value;
wim 0:4430a1559b4f 530 }
wim 0:4430a1559b4f 531
wim 0:4430a1559b4f 532
wim 0:4430a1559b4f 533 /** Get a single character (Stream implementation)
wim 0:4430a1559b4f 534 *
wim 0:4430a1559b4f 535 * @param none
wim 0:4430a1559b4f 536 * @return -1
wim 0:4430a1559b4f 537 */
wim 0:4430a1559b4f 538 int TM1650_MEIBAI::_getc() {
wim 0:4430a1559b4f 539 return -1;
wim 0:4430a1559b4f 540 }
wim 0:4430a1559b4f 541
wim 0:4430a1559b4f 542 #endif