Library for TM1650 LED controller (32 LEDs max, 28 keys max)
See here for more info.
Revision 0:4430a1559b4f, committed 2017-10-10
- Comitter:
- wim
- Date:
- Tue Oct 10 18:38:46 2017 +0000
- Commit message:
- Library for TM1650 LED controller (32 LEDs max, 27 keys max)
Changed in this revision
diff -r 000000000000 -r 4430a1559b4f Font_7Seg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Font_7Seg.cpp Tue Oct 10 18:38:46 2017 +0000 @@ -0,0 +1,166 @@ +/* mbed LED Font Library, for TM1650 LED controller + * Copyright (c) 2017, v01: WH, Initial version, Test in MEIBAI + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "Font_7Seg.h" + +// Select one of the testboards for TM1650 LED controller +#if ((MEIBAI_TEST == 1) || (TM1650_TEST == 1)) + +//Mask for blending out and restoring Icons +const char MASK_ICON_GRID[] = { + LO(S7_ICON_GR1), + LO(S7_ICON_GR2), + LO(S7_ICON_GR3), + LO(S7_ICON_GR4), + LO(S7_ICON_GR5), + LO(S7_ICON_GR6) + }; + +// ASCII Font definition table for transmission to TM1650 +// +//#define FONT_7S_START 0x20 +//#define FONT_7S_END 0x7F +//#define FONT_7S_NR_CHARS (FONT_7_END - FONT_7S_START + 1) + +#if (SHOW_ASCII == 1) +//display all ASCII characters +const short FONT_7S[] = { + C7_SPC, //32 0x20, Space + C7_EXC, + C7_QTE, + C7_HSH, + C7_DLR, + C7_PCT, + C7_AMP, + C7_ACC, + C7_LBR, + C7_RBR, + C7_MLT, + C7_PLS, + C7_CMA, + C7_MIN, + C7_DPT, + C7_RS, + C7_0, //48 0x30 + C7_1, + C7_2, + C7_3, + C7_4, + C7_5, + C7_6, + C7_7, + C7_8, + C7_9, + C7_COL, //58 0x3A + C7_SCL, + C7_LT, + C7_EQ, + C7_GT, + C7_QM, + C7_AT, //64 0x40 + C7_A, //65 0x41, A + C7_B, + C7_C, + C7_D, + C7_E, + C7_F, + C7_G, + C7_H, + C7_I, + C7_J, + C7_K, + C7_L, + C7_M, + C7_N, + C7_O, + C7_P, + C7_Q, + C7_R, + C7_S, + C7_T, + C7_U, + C7_V, + C7_W, + C7_X, + C7_Y, + C7_Z, //90 0x5A, Z + C7_SBL, //91 0x5B + C7_LS, + C7_SBR, + C7_PWR, + C7_UDS, + C7_ACC, + C7_A, //97 0x61, A replacing a + C7_B, + C7_C, + C7_D, + C7_E, + C7_F, + C7_G, + C7_H, + C7_I, + C7_J, + C7_K, + C7_L, + C7_M, + C7_N, + C7_O, + C7_P, + C7_Q, + C7_R, + C7_S, + C7_T, + C7_U, + C7_V, + C7_W, + C7_X, + C7_Y, + C7_Z, // 122 0x7A, Z replacing z + C7_CBL, // 123 0x7B + C7_OR, + C7_CBR, + C7_TLD, + C7_DEL // 127 + }; + +#else +//display only digits and hex characters +const short FONT_7S[] = { + C7_0, //48 0x30 + C7_1, + C7_2, + C7_3, + C7_4, + C7_5, + C7_6, + C7_7, + C7_8, + C7_9, + C7_A, //65 0x41, A + C7_B, + C7_C, + C7_D, + C7_E, + C7_F + };// 127 +#endif + +#endif \ No newline at end of file
diff -r 000000000000 -r 4430a1559b4f Font_7Seg.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Font_7Seg.h Tue Oct 10 18:38:46 2017 +0000 @@ -0,0 +1,255 @@ +/* mbed LED Font Library, for TM1650 LED Controller + * Copyright (c) 2017, v01: WH, Initial version, Test in MEIBAI + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MBED_FONT_7SEG_H +#define MBED_FONT_7SEG_H + +// Select one of the testboards for TM1650 controller +#include "TM1650_Config.h" + +#if ((MEIBAI_TEST == 1) || (TM1650_TEST == 1)) +// Segment bit positions for 7 Segment display using the MEIBAI and ROBOTDYN mapping for TM1650 +// Modify this table for different 'bit-to-segment' mappings. The ASCII character defines and the FONT_7S const table below +// will be adapted automatically according to the bit-to-segment mapping. Obviously this will only work when the segment +// mapping is identical for every digit position. This will be the case unless the hardware designer really hates software developers. +// +// A +// ----- +// | | +// F | | B +// | G | +// ----- +// | | +// E | | C +// | | +// ----- * DP +// D +// +#define S7_A 0x0001 +#define S7_B 0x0002 +#define S7_C 0x0004 +#define S7_D 0x0008 +#define S7_E 0x0010 +#define S7_F 0x0020 +#define S7_G 0x0040 +#define S7_DP 0x0080 + +//Mask for blending out and setting 7 segments digits +#define MASK_7S_ALL = (S7_A | S7_B | S7_C | S7_D | S7_E | S7_F | S7_G} + +//The CATALAX mapping between Digit positions or Columns (Left to Right) and Grids (ie memory address) are: +//The column numbers are: +// 0 1 2 3 +//The Grids are: +// GR1 GR2 GR3 GR4 +//The memory addresses are: +// 0 1 2 3 + + +//The ROBOTDYN mapping between Digit positions or columns (Left to Right) and Grids (ie memory address) are: +//The column numbers are: +// 0 1 2 3 4 5 +//The Grids are: +// GR3 GR2 GR1 GR6 GR5 GR4 +//The memory addresses are: +// 2 1 0 5 4 3 + + +//The EYEWINK mapping between Digit positions or columns (Left to Right) and Grids (ie memory address) are: +//The column numbers are: +// 0 1 2 3 4 5 +//The Grids are: +// GR1 GR2 GR3 GR4 GR5 GR6 +//The memory addresses are: +// 0 1 2 3 4 5 + + +//Icons Grid 1 +#define S7_DP1 0x0080 +#define S7_ICON_GR1 (0x0000) +//#define S7_ICON_GR1 (S7_DP1) + +//Icons Grid 2 +#define S7_DP2 0x0080 +#define S7_COL2 0x0080 +#define S7_ICON_GR2 (0x0000) +//#define S7_ICON_GR2 (S7_DP2) + +//Icons Grid 3 +#define S7_DP3 0x0080 +#define S7_ICON_GR3 (0x0000) +//#define S7_ICON_GR3 (S7_DP3) + +//Icons Grid 4 +#define S7_DP4 0x0080 +#define S7_ICON_GR4 (0x0000) +//#define S7_ICON_GR4 (S7_DP4) + +//Icons Grid 5 +#define S7_DP5 0x0080 +#define S7_ICON_GR5 (0x0000) +//#define S7_ICON_GR5 (S7_DP5) + +//Icons Grid 6 +#define S7_DP6 0x0080 +#define S7_ICON_GR6 (0x0000) +//#define S7_ICON_GR6 (S7_DP6) + + +//Mask for blending out and restoring Icons +extern const char MASK_ICON_GRID[]; +#endif + + +// ASCII Font definitions for segments in each character +// +//32 0x20 Symbols +#define C7_SPC (0x0000) +#define C7_EXC (S7_B | S7_C) //! +#define C7_QTE (S7_B | S7_F) //" +#define C7_HSH (S7_C | S7_D | S7_E | S7_G) //# +#define C7_DLR (S7_A | S7_C | S7_D | S7_F | S7_G) //$ +#define C7_PCT (S7_C | S7_F) //% +#define C7_AMP (S7_A | S7_C | S7_D | S7_E | S7_F | S7_G) //& +#define C7_ACC (S7_B) //' +#define C7_LBR (S7_A | S7_D | S7_E | S7_F) //( +#define C7_RBR (S7_A | S7_B | S7_C | S7_D) //) +#define C7_MLT (S7_B | S7_C | S7_E | S7_F | S7_G) //* +#define C7_PLS (S7_B | S7_C | S7_G) //+ +#define C7_CMA (S7_DP) +#define C7_MIN (S7_G) +#define C7_DPT (S7_DP) +#define C7_RS (S7_B | S7_E | S7_G) // / + +//48 0x30 Digits +#define C7_0 (S7_A | S7_B | S7_C | S7_D | S7_E | S7_F) +#define C7_1 (S7_B | S7_C) +#define C7_2 (S7_A | S7_B | S7_D | S7_E | S7_G) +#define C7_3 (S7_A | S7_B | S7_C | S7_D | S7_G) +#define C7_4 (S7_B | S7_C | S7_F | S7_G) +#define C7_5 (S7_A | S7_C | S7_D | S7_F | S7_G) +#define C7_6 (S7_A | S7_C | S7_D | S7_E | S7_F | S7_G) +#define C7_7 (S7_A | S7_B | S7_C) +#define C7_8 (S7_A | S7_B | S7_C | S7_D | S7_E | S7_F | S7_G) +#define C7_9 (S7_A | S7_B | S7_C | S7_D | S7_F | S7_G) + +//58 0x3A +#define C7_COL (S7_D | S7_G) // : +#define C7_SCL (S7_D | S7_G) // ; +#define C7_LT (S7_D | S7_E | S7_G) // < +#define C7_EQ (S7_D | S7_G) // = +#define C7_GT (S7_C | S7_D | S7_G) // > +#define C7_QM (S7_A | S7_B | S7_E | S7_G) // ? +#define C7_AT (S7_A | S7_B | S7_C | S7_D | S7_E | S7_G) // @ + +//65 0x41 Upper case alphabet +#define C7_A (S7_A | S7_B | S7_C | S7_E | S7_F | S7_G ) +#define C7_B (S7_C | S7_D | S7_E | S7_F | S7_G) +#define C7_C (S7_A | S7_D | S7_E | S7_F) +#define C7_D (S7_B | S7_C | S7_D | S7_E | S7_G) +#define C7_E (S7_A | S7_D | S7_E | S7_F | S7_G) +#define C7_F (S7_A | S7_E | S7_F | S7_G) + +#define C7_G (S7_A | S7_C | S7_D | S7_E | S7_F) +#define C7_H (S7_B | S7_C | S7_E | S7_F | S7_G) +#define C7_I (S7_B | S7_C) +#define C7_J (S7_B | S7_C | S7_D | S7_E) +#define C7_K (S7_B | S7_C | S7_E | S7_F | S7_G) +#define C7_L (S7_D | S7_E | S7_F) +#define C7_M (S7_A | S7_C | S7_E) +#define C7_N (S7_A | S7_B | S7_C | S7_E | S7_F) +#define C7_O (S7_A | S7_B | S7_C | S7_D | S7_E | S7_F) +#define C7_P (S7_A | S7_B | S7_E | S7_F | S7_G) +#define C7_Q (S7_A | S7_B | S7_C | S7_F | S7_G) +#define C7_R (S7_E | S7_G ) +#define C7_S (S7_A | S7_C | S7_D | S7_F | S7_G) +#define C7_T (S7_D | S7_E | S7_F | S7_G) +#define C7_U (S7_B | S7_C | S7_D | S7_E | S7_F) +#define C7_V (S7_B | S7_C | S7_D | S7_E | S7_F) +#define C7_W (S7_B | S7_D | S7_F) +#define C7_X (S7_B | S7_C | S7_E | S7_F | S7_G) +#define C7_Y (S7_B | S7_C | S7_D | S7_F | S7_G) +#define C7_Z (S7_A | S7_B | S7_D | S7_E | S7_G) + +//91 0x5B +#define C7_SBL (S7_A | S7_D | S7_E | S7_F) // [ +#define C7_LS (S7_C | S7_F | S7_G) // left slash +#define C7_SBR (S7_A | S7_B | S7_C | S7_D) // ] +#define C7_PWR (S7_A | S7_B | S7_F) // ^ +#define C7_UDS (S7_D) // _ +#define C7_DSH (S7_F) // ` + +//97 0x61 Lower case alphabet +#define C7_a C7_A +#define C7_b C7_B +#define C7_c C7_C +#define C7_d C7_D +#define C7_e C7_E +#define C7_f C7_H + +#define C7_g C7_G +#define C7_h C7_H +#define C7_i C7_I +#define C7_j C7_J +#define C7_k C7_K +#define C7_l C7_L +#define C7_m C7_M +//#define C7_n C7_N +#define C7_n (S7_C | S7_E | S7_G) +//#define C7_o C7_O +#define C7_o (S7_C | S7_D | S7_E | S7_G) +#define C7_p C7_P +#define C7_q C7_Q +//#define C7_r C7_R +#define C7_r (S7_E | S7_G) +#define C7_s C7_S +#define C7_t C7_T +#define C7_u C7_U +#define C7_v C7_V +#define C7_w C7_W +#define C7_x C7_X +#define C7_y C7_Y +#define C7_z C7_Z + +//123 0x7B +#define C7_CBL (S7_A | S7_D | S7_E | S7_F) // { +#define C7_OR (S7_B | S7_C) // | +#define C7_CBR (S7_A | S7_B | S7_C | S7_D) // } +#define C7_TLD (S7_B | S7_E | S7_G ) // ~ +#define C7_DEL (0x0000) + + +//User Defined Characters (some examples) +#define C7_DGR (S7_A | S7_B | S7_F | S7_G) //Degrees + +// Font data selection for transmission to TM1650 memory +#define LO(x) ( x & 0xFF) +#define HI(x) ((x >> 8) & 0xFF) + + +// ASCII Font definition table +// +#define FONT_7S_START 0x20 +#define FONT_7S_END 0x7F +//#define FONT_7S_NR_CHARS (FONT_7S_END - FONT_7S_START + 1) +extern const short FONT_7S[]; + +#endif \ No newline at end of file
diff -r 000000000000 -r 4430a1559b4f TM1650.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TM1650.cpp Tue Oct 10 18:38:46 2017 +0000 @@ -0,0 +1,542 @@ +/* mbed TM1650 Library, for TM1650 LED controller + * Copyright (c) 2017, v01: WH, Initial version + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, inclumosig without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUmosiG BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "mbed.h" +#include "TM1650.h" + +/** Constructor for class for driving TM1650 LED controller with Serial bus interface device. + * @brief Supports 4 digits @ 8 segments. Also supports upto 28 Keys. + * + * @param PinName dio Serial bus DIO pin + * @param PinName clk Serial bus CLK pin +*/ +TM1650::TM1650(PinName dio, PinName clk) : _dio(dio), _clk(clk) { + + _init(); +} + + +/** Init the Serial interface and the controller + * @param none + * @return none + */ +void TM1650::_init(){ + +//TM1650 uses a Serial bus that looks like I2C, but really is not. +//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. + +//init Serial bus + _dio.output(); +// _dio.mode(PullUp); + wait_us(1); + + _dio=1; + _clk=1; + +//init controller + _bright = TM1650_BRT_DEF; + _segment = TM1650_DSP_8S; + _display = TM1650_DSP_ON; + _writeCmd(TM1650_DSP_CTRL_CMD, _bright | _segment | _display ); // Display control cmd, brightness, 7/8 segments, display on/off +} + + +/** Clear the screen and locate to 0 + */ +void TM1650::cls() { + + for (int cnt=0; cnt<TM1650_DISPLAY_MEM; cnt++) { + _start(); + _write(TM1650_DATA_WR_CMD | (cnt << 1)); // Set Address cmd (no auto incr supported) + _write(0x00); // Write data + _stop(); + } + +} + +/** Set Brightness + * + * @param char brightness (3 significant bits, valid range 0..7 (1/16 .. 14/14 dutycycle) + * @return none + */ +void TM1650::setBrightness(char brightness){ + + _bright = brightness & TM1650_BRT_MSK; // mask invalid bits + + _writeCmd(TM1650_DSP_CTRL_CMD, _bright | _segment | _display ); // Display control cmd, brightness, 7/8 segments, display on/off +} + +/** Set the Display mode On/off + * + * @param bool display mode + */ +void TM1650::setDisplay(bool on) { + + if (on) { + _display = TM1650_DSP_ON; + } + else { + _display = TM1650_DSP_OFF; + } + + _writeCmd(TM1650_DSP_CTRL_CMD, _bright | _segment | _display ); // Display control cmd, brightness, 7/8 segments, display on/off +} + +/** Write databyte to TM1650 + * @param int address display memory location to write byte + * @param char data byte written at given address + * @return none + */ +void TM1650::writeData(char data, int address) { + + _start(); + + _write(TM1650_DATA_WR_CMD | ((address & TM1650_ADDR_MSK) << 1)); // Set Address cmd + _write(data); // Write data + + _stop(); +} + +/** Write Display datablock to TM1650 + * @param DisplayData_t data Array of TM1650_DISPLAY_MEM (=4) bytes for displaydata + * @param length number bytes to write (valid range 0..(TM1650_MAX_NR_GRIDS * TM1650_BYTES_PER_GRID) (=4), when starting at address 0) + * @param int address display memory location to write bytes (default = 0) + * @return none + */ +void TM1650::writeData(DisplayData_t data, int length, int address) { + +// sanity check + address &= TM1650_ADDR_MSK; + if (length < 0) {length = 0;} + if ((length + address) > TM1650_DISPLAY_MEM) {length = (TM1650_DISPLAY_MEM - address);} + + for (int idx=0; idx<length; idx++) { + _start(); + _write(TM1650_DATA_WR_CMD | ((address + idx) << 1)); // Set Address cmd (no auto incr supported) + _write(data[address + idx]); // Write data + _stop(); + } +} + +/** Read keydata block from TM1650 + * @param *keydata Ptr to bytes for keydata + * @return bool keypress True when at least one key was pressed + */ +bool TM1650::getKeys(KeyData_t *keydata) { + + _start(); + + // Enable Key Read mode + _write(TM1650_KEY_RD_CMD); // Read Key cmd + + // Read key + *keydata = _read(); +// printf("Key = 0x%02x\r\n", *keydata); // debug + + _stop(); + + // Check if valid key bits are set + return ( (*keydata & TM1650_SW_MSK) == TM1650_SW_MSK ); +} + + +/** Generate Start condition for TM1650 + * @param none + * @return none + */ +void TM1650::_start() { + + _dio=0; + wait_us(1); + _clk=0; + wait_us(1); +} + +/** Generate Stop condition for TM1650 + * @param none + * @return none + */ +void TM1650::_stop() { + + _dio=0; + wait_us(1); + _clk=1; + wait_us(1); + _dio=1; + wait_us(1); +} + +/** Send byte to TM1650 + * @param int data + * @return none + */ +void TM1650::_write(int data) { + + for (int bit=7; bit >= 0; bit--) { + //The TM1650 expects MSB first + if (((data >> bit) & 0x01) == 0x01) { + _dio=1; + } + else { + _dio=0; + } + wait_us(1); + _clk=1; + wait_us(1); + _clk=0; + wait_us(1); + } + + _dio=1; + + // Prepare DIO to read data + _dio.input(); + wait_us(3); + + // dummy Ack + _clk=1; + wait_us(1); +// _ack = _dio; + _clk=0; + wait_us(1); + + // Return DIO to output mode + _dio.output(); + wait_us(3); + + _dio=1; //idle +} + +/** Read byte from TM1650 + * @param none + * @return read byte + */ +char TM1650::_read() { + char keycode = 0; + + // Prepare DIO to read data + _dio.input(); + wait_us(3); + + for (int bit=0; bit<8; bit++) { + + //The TM1650 sends bitpattern: D7..D0 + //Data is shifted out by the TM1650 on the falling edge of CLK + //Observe sufficient delay to allow the Open Drain DIO to rise to H levels + // Prepare to read next bit, MSB (ie D7) first. + keycode = keycode << 1; + + _clk=1; + wait_us(1); + + // Read next bit + if (_dio) { keycode |= 0x01; } + + _clk=0; + wait_us(5); // Delay to allow for slow risetime + } + + // Return DIO to output mode + _dio.output(); + wait_us(3); + + // dummy Ack + _dio=0; //Ack + wait_us(1); + + _clk=1; + wait_us(1); + _clk=0; + wait_us(1); + + _dio=1; //idle + + return keycode; +} + +/** Write command (and parameters) to TM1650 + * @param int cmd Command byte + * @Param int data Parameters for command + * @return none + */ +void TM1650::_writeCmd(int cmd, int data){ + + _start(); + + _write(cmd); + _write(data); + + _stop(); +} + + +#if (MEIBAI_TEST == 1) +// Derived class for TM1650 used in MEIBAI display unit +// + +/** Constructor for class for driving TM1650 LED controller + * + * @brief Supports 4 Digits of 7 Segments + DP. + * Also supports 3 keys. + * Serial bus interface device. + * + * @param PinName dio Serial bus DIO pin + * @param PinName sck Serial bus CLK pin + */ +TM1650_MEIBAI::TM1650_MEIBAI(PinName dio, PinName clk) : TM1650(dio, clk) { + _column = 0; + _columns = MEIBAI_NR_DIGITS; +} + +#if(0) +#if DOXYGEN_ONLY + /** Write a character to the Display + * + * @param c The character to write to the display + * @return c + */ + int putc(int c); + + /** Write a formatted string to the Display + * + * @param format A printf-style format string, followed by the + * variables to use in formatting the string. + */ + int printf(const char* format, ...); +#endif +#endif + +/** Locate cursor to a screen column + * + * @param column The horizontal position from the left, indexed from 0 + * @return none + */ +void TM1650_MEIBAI::locate(int column) { + //sanity check + if (column < 0) {column = 0;} + if (column > (_columns - 1)) {column = _columns - 1;} + + _column = column; +} + + +/** Number of screen columns + * + * @param none + * @return columns + */ +int TM1650_MEIBAI::columns() { + return _columns; +} + + +/** Clear the screen and locate to 0 + * + * @param bool clrAll Clear Icons also (default = false) + * @return none + */ +void TM1650_MEIBAI::cls(bool clrAll) { + + if (clrAll) { + //clear local buffer (inclumosig Icons) + for (int idx=0; idx < MEIBAI_NR_GRIDS; idx++) { + _displaybuffer[idx] = 0x00; + } + } + else { + //clear local buffer (preserving Icons) + for (int idx=0; idx < MEIBAI_NR_GRIDS; idx++) { + _displaybuffer[idx] = _displaybuffer[idx] & MASK_ICON_GRID[idx]; + } + } + + writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), 0); + + _column = 0; +} + +/** Set Icon + * + * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs + * @return none + */ +void TM1650_MEIBAI::setIcon(Icon icon) { + int addr, icn; + + icn = icon & 0xFFFF; + addr = (icon >> 24) & 0xFF; + addr = (addr - 1); + + //Save char...and set bits for icon to write + _displaybuffer[addr] = _displaybuffer[addr] | LO(icn); +// writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), 0); + writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr); +} + +/** Clr Icon + * + * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs + * @return none + */ +void TM1650_MEIBAI::clrIcon(Icon icon) { + int addr, icn; + + icn = icon & 0xFFFF; + addr = (icon >> 24) & 0xFF; + addr = (addr - 1); + + //Save char...and clr bits for icon to write + _displaybuffer[addr] = _displaybuffer[addr] & ~LO(icn); +// writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), 0); + writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr); +} + + +/** Set User Defined Characters (UDC) + * + * @param unsigned char udc_idx The Index of the UDC (0..7) + * @param int udc_data The bitpattern for the UDC (8 bits) + * @return none + */ +void TM1650_MEIBAI::setUDC(unsigned char udc_idx, int udc_data) { + + //Sanity check + if (udc_idx > (MEIBAI_NR_UDC-1)) { + return; + } + // Mask out Icon bits? + + _UDC_7S[udc_idx] = LO(udc_data); +} + + +/** Write a single character (Stream implementation) + * + * @param c The character to write to the display + * @return c + */ +int TM1650_MEIBAI::_putc(int value) { +//The MEIBAI mapping between Digit positions (Left to Right) and Grids is: +// GR1 GR2 GR3 GR4 +//The memory addresses or column numbers are: +// 0 1 2 3 + + int addr; + bool validChar = false; + char pattern = 0x00; + + if ((value == '\n') || (value == '\r')) { + //No character to write + validChar = false; + + //Update Cursor + _column = 0; + } + else if ((value == '.') || (value == ',')) { + //No character to write + validChar = false; + pattern = S7_DP; // placeholder for all DPs + + // Check to see that DP can be shown for current column + if (_column > 0) { + //Translate between _column and displaybuffer entries + //Add DP to bitpattern of digit left of current column. + addr = (_column - 1); + + //Save icons...and set bits for decimal point to write + _displaybuffer[addr] = _displaybuffer[addr] | pattern; +// writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID)); + writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr); + + //No Cursor Update + } + } + else if ((value >= 0) && (value < MEIBAI_NR_UDC)) { + //Character to write + validChar = true; + pattern = _UDC_7S[value]; + } + +#if (SHOW_ASCII == 1) + //display all ASCII characters + else if ((value >= FONT_7S_START) && (value <= FONT_7S_END)) { + //Character to write + validChar = true; + pattern = FONT_7S[value - FONT_7S_START]; + } // else +#else + //display only digits and hex characters + else if (value == '-') { + //Character to write + validChar = true; + pattern = C7_MIN; + } + else if ((value >= (int)'0') && (value <= (int) '9')) { + //Character to write + validChar = true; + pattern = FONT_7S[value - (int) '0']; + } + else if ((value >= (int) 'A') && (value <= (int) 'F')) { + //Character to write + validChar = true; + pattern = FONT_7S[10 + value - (int) 'A']; + } + else if ((value >= (int) 'a') && (value <= (int) 'f')) { + //Character to write + validChar = true; + pattern = FONT_7S[10 + value - (int) 'a']; + } //else +#endif + + if (validChar) { + //Character to write + + //Translate between _column and displaybuffer entries + addr = _column; + + //Save icons...and set bits for character to write + _displaybuffer[addr] = (_displaybuffer[addr] & MASK_ICON_GRID[_column]) | pattern; + +// writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID)); + writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr); + + //Update Cursor + _column++; + if (_column > (MEIBAI_NR_DIGITS - 1)) { + _column = 0; + } + + } // if validChar + + return value; +} + + +/** Get a single character (Stream implementation) + * + * @param none + * @return -1 + */ +int TM1650_MEIBAI::_getc() { + return -1; +} + +#endif
diff -r 000000000000 -r 4430a1559b4f TM1650.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TM1650.h Tue Oct 10 18:38:46 2017 +0000 @@ -0,0 +1,413 @@ +/* mbed TM1650 Library, for TM1650 LED controller + * Copyright (c) 2017, v01: WH, Initial version + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, inclumosig without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUmosiG BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef TM1650_H +#define TM1650_H + +// Select one of the testboards for TM1650 LED controller +#include "TM1650_Config.h" + +/** An interface for driving TM1650 LED controller + * + * @code + * #include "mbed.h" + * #include "TM1650.h" + * + * Serial pc(USBTX, USBRX); + * + * //DisplayData_t size is 4 bytes (4 grids @ 8 segments) + * TM1650::DisplayData_t all_str = {0xFF, 0xFF, 0xFF, 0xFF}; + * + * // KeyData_t size is 1 bytes + * TM1650::KeyData_t keydata; + * + * // TM1650 declaration, Select the desired type in TM1650_Config.h + * TM1650_MEIBAI MEIBAI(p6, p7); //LPC1768 + * //TM1650_MEIBAI MEIBAI(D9, D10); //F401 + * + * int main() { + * MEIBAI.cls(); + * MEIBAI.writeData(all_str); + * wait(1); + * MEIBAI.setBrightness(TM1650_BRT0); + * wait(1); + * MEIBAI.setBrightness(TM1650_BRT3); + * + * while (1) { + * MEIBAI.cls(); + * wait(0.5); + * MEIBAI.writeData(all_str); + * wait(1.0); + * MEIBAI.cls(); + * MEIBAI.printf(" HI "); + * wait(1.0); + * + * // Check and read keydata + * if (MEIBAI.getKeys(&keydata)) { + * pc.printf("Keydata = 0x%02x\r\n", keydata); + * + * if (keydata == TM1650_SW1_BIT) { //sw1 + * MEIBAI.cls(); + * MEIBAI.printf("--01"); + * } + * } // Check keydata + * } // while + * } + * @endcode + */ + + +//TM1650 Display data +#define TM1650_MAX_NR_GRIDS 4 +#define TM1650_BYTES_PER_GRID 1 + +//Significant bits Keymatrix data +//#define TM1638_KEY_MSK 0xFF + +//Memory size in bytes for Display and Keymatrix +#define TM1650_DISPLAY_MEM (TM1650_MAX_NR_GRIDS * TM1650_BYTES_PER_GRID) +#define TM1650_KEY_MEM 1 + +//Data write command +//Valid data addresses are 0x68, 0x6A, 0x6C, 0x6E +#define TM1650_DATA_WR_CMD 0x68 +#define TM1650_ADDR_MSK 0x03 //0..3 + +//Display control command +#define TM1650_DSP_CTRL_CMD 0x48 + +#define TM1650_BRT_MSK 0x70 +//#define TM1650_BRT_SHFT 4 +#define TM1650_BRT0 0x10 //Pulsewidth 1/16 +#define TM1650_BRT1 0x20 +#define TM1650_BRT2 0x30 +#define TM1650_BRT3 0x40 +#define TM1650_BRT4 0x50 +#define TM1650_BRT5 0x60 +#define TM1650_BRT6 0x70 +#define TM1650_BRT7 0x00 //Pulsewidth 15/16 + +#define TM1650_BRT_DEF TM1650_BRT3 + +#define TM1650_DSP_8S 0x00 +#define TM1650_DSP_7S 0x08 + +#define TM1650_DSP_OFF 0x00 +#define TM1650_DSP_ON 0x01 + + +//Keydata read command +#define TM1650_KEY_RD_CMD 0x49 + +//Access to 28 Switches +//d7 d6 d5 d4 d3 d2 d1 d0 +// . 1 . . . 1 . . = Valid Key +#define TM1650_SW_MSK 0x44 + +//A -> Dig1 .. Dig4 +#define TM1650_SW1_BIT 0x44 +#define TM1650_SW2_BIT 0x45 +#define TM1650_SW3_BIT 0x46 +#define TM1650_SW4_BIT 0x47 +//B -> Dig1 .. Dig4 +#define TM1650_SW5_BIT 0x4C +#define TM1650_SW6_BIT 0x4D +#define TM1650_SW7_BIT 0x4E +#define TM1650_SW8_BIT 0x4F +//C -> Dig1 .. Dig4 +#define TM1650_SW9_BIT 0x54 +#define TM1650_SW10_BIT 0x55 +#define TM1650_SW11_BIT 0x56 +#define TM1650_SW12_BIT 0x57 +//D -> Dig1 .. Dig4 +#define TM1650_SW13_BIT 0x5C +#define TM1650_SW14_BIT 0x5D +#define TM1650_SW15_BIT 0x5E +#define TM1650_SW16_BIT 0x5F +//E -> Dig1 .. Dig4 +#define TM1650_SW17_BIT 0x64 +#define TM1650_SW18_BIT 0x65 +#define TM1650_SW19_BIT 0x66 +#define TM1650_SW20_BIT 0x67 +//F -> Dig1 .. Dig4 +#define TM1650_SW21_BIT 0x6C +#define TM1650_SW22_BIT 0x6D +#define TM1650_SW23_BIT 0x6E +#define TM1650_SW24_BIT 0x6F +//G -> Dig1 .. Dig4 +#define TM1650_SW25_BIT 0x74 +#define TM1650_SW26_BIT 0x75 +#define TM1650_SW27_BIT 0x76 +#define TM1650_SW28_BIT 0x77 + + + +/** A class for driving TM1650 LED controller + * + * @brief Supports 4 Grids @ 8 Segments and upto 28 Keys. + * Serial bus interface device. + */ +class TM1650 { + public: + + /** Datatype for displaydata */ + typedef char DisplayData_t[TM1650_DISPLAY_MEM]; + + /** Datatypes for keymatrix data */ + typedef char KeyData_t; + + /** Constructor for class for driving TM1650 LED controller + * + * @brief Supports 4 Grids @ 8 segments and 28 Keys. + * Serial bus interface device. + * + * @param PinName dio Serial bus DIO pin + * @param PinName sck Serial bus CLK pin + */ + TM1650(PinName dio, PinName clk); + + + /** Clear the screen and locate to 0 + */ + void cls(); + + /** Write databyte to TM1650 + * @param char data byte written at given address + * @param int address display memory location to write byte + * @return none + */ + void writeData(char data, int address); + + /** Write Display datablock to TM1650 + * @param DisplayData_t data Array of TM1650_DISPLAY_MEM (=4) bytes for displaydata + * @param length number bytes to write (valid range 0..(TM1650_MAX_NR_GRIDS * TM1650_BYTES_PER_GRID) (=4), when starting at address 0) + * @param int address display memory location to write bytes (default = 0) + * @return none + */ + void writeData(DisplayData_t data, int length = (TM1650_MAX_NR_GRIDS * TM1650_BYTES_PER_GRID), int address = 0); + + /** Read keydata block from TM1650 + * + * @param *keydata Ptr to bytes for keydata + * @return bool keypress True when at least one key was pressed + */ + bool getKeys(KeyData_t *keydata); + + /** Set Brightness + * + * @param char brightness (3 significant bits, valid range 0..7 (1/16 .. 14/16 dutycycle) + * @return none + */ + void setBrightness(char brightness = TM1650_BRT_DEF); + + /** Set the Display mode On/off + * + * @param bool display mode + * @return none + */ + void setDisplay(bool on); + + private: + DigitalInOut _dio; + DigitalOut _clk; + + char _bright; + char _segment; + char _display; + + /** Init the Serial interface and the controller + * @param none + * @return none + */ + void _init(); + + /** Generate Start condition for TM1650 + * @param none + * @return none + */ + void _start(); + + /** Generate Stop condition for TM1650 + * @param none + * @return none + */ + void _stop(); + + /** Send byte to TM1650 + * @param int data + * @return none + */ + void _write(int data); + + /** Read byte from TM1650 + * @param none + * @return read byte + */ + char _read(); + + /** Write command and parameter to TM1650 + * @param int cmd Command byte + * @Param int data Parameters for command + * @return none + */ + void _writeCmd(int cmd, int data); +}; + +#if (MEIBAI_TEST == 1) +// Derived class for TM1650 used in MEIBAI display unit with 4 Digits and 3 keys +// + +#include "Font_7Seg.h" + +#define MEIBAI_NR_GRIDS 4 +#define MEIBAI_NR_DIGITS 4 +#define MEIBAI_NR_UDC 8 + + +/** Constructor for class for driving TM1650 controller as used in MEIBAI + * + * @brief Supports 4 Digits of 7 Segments + DP. + * Also Supports 3 Keys. Serial bus interface device. + * + * @param PinName dio Serial bus DIO pin + * @param PinName sck Serial bus CLK pin + */ +class TM1650_MEIBAI : public TM1650, public Stream { + public: + + /** Enums for Icons */ + // Grid encoded in 8 MSBs, Icon pattern encoded in 16 LSBs + enum Icon { + DP1 = ( 1<<24) | S7_DP1, /**< Digit 1 */ + DP2 = ( 2<<24) | S7_DP2, /**< Digit 2 */ + DP3 = ( 3<<24) | S7_DP3, /**< Digit 3 */ + DP4 = ( 4<<24) | S7_DP4, /**< Digit 4 */ + }; + + typedef char UDCData_t[MEIBAI_NR_UDC]; + + + /** Constructor for class for driving TM1650 LED controller + * + * @brief Supports 4 Digits of 7 Segments + DP. + * Also Supports 3 Keys. Serial bus interface device. + * + * @param PinName dio Serial bus DIO pin + * @param PinName sck Serial bus CLK pin + */ + TM1650_MEIBAI(PinName dio, PinName clk); + + +#if DOXYGEN_ONLY + /** Write a character to the Display + * + * @param c The character to write to the display + * @return c + */ + int putc(int c); + + /** Write a formatted string to the Display + * + * @param format A printf-style format string, followed by the + * variables to use in formatting the string. + * @return chars written + */ + int printf(const char* format, ...); +#endif + + /** Locate cursor to a screen column + * + * @param column The horizontal position from the left, indexed from 0 + * @return none + */ + void locate(int column); + + /** Clear the screen and locate to 0 + * @param bool clrAll Clear Icons also (default = false) + * @return none + */ + void cls(bool clrAll = false); + + /** Set Icon + * + * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs + * @return none + */ + void setIcon(Icon icon); + + /** Clr Icon + * + * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs + * @return none + */ + void clrIcon(Icon icon); + + /** Set User Defined Characters (UDC) + * + * @param unsigned char udc_idx The Index of the UDC (0..7) + * @param int udc_data The bitpattern for the UDC (16 bits) + * @return none + */ + void setUDC(unsigned char udc_idx, int udc_data); + + + /** Number of screen columns + * + * @param none + * @return columns + */ + int columns(); + + /** Write databyte to TM1650 + * @param char data byte written at given address + * @param int address display memory location to write byte + * @return none + */ + void writeData(char data, int address){ + TM1650::writeData(data, address); + } + + /** Write Display datablock to TM1650 + * @param DisplayData_t data Array of TM1650_DISPLAY_MEM (=4) bytes for displaydata + * @param length number bytes to write (valid range 0..(MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID) (=4), when starting at address 0) + * @param int address display memory location to write bytes (default = 0) + * @return none + */ + void writeData(DisplayData_t data, int length = (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), int address = 0) { + TM1650::writeData(data, length, address); + } + +protected: + // Stream implementation functions + virtual int _putc(int value); + virtual int _getc(); + +private: + int _column; + int _columns; + + DisplayData_t _displaybuffer; + UDCData_t _UDC_7S; +}; +#endif + +#endif \ No newline at end of file
diff -r 000000000000 -r 4430a1559b4f TM1650_Config.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TM1650_Config.h Tue Oct 10 18:38:46 2017 +0000 @@ -0,0 +1,33 @@ +/* mbed TM1650 Library, for TM1650 LEDcontroller + * Copyright (c) 2017, v01: WH, Initial version + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef TM1650_CONFIG_H +#define TM1650_CONFIG_H + +// Select one of the testboards for TM1650 LED controller +#define TM1650_TEST 0 +#define MEIBAI_TEST 1 + +// Select the display mode: only digits and hex or ASCII +#define SHOW_ASCII 1 + +#endif \ No newline at end of file