From ae7a761573b3824f67a269fc88002db93b9c22dc Mon Sep 17 00:00:00 2001 From: Avishay Date: Sat, 11 Jan 2014 22:38:09 +0200 Subject: [PATCH] Initial library files The code writes to the display module and shows a predefined constant pattern --- TM1637Display.cpp | 136 ++++++++++++++++++++++++++++++++++++++++++++++ TM1637Display.h | 82 ++++++++++++++++++++++++++++ 2 files changed, 218 insertions(+) create mode 100644 TM1637Display.cpp create mode 100644 TM1637Display.h diff --git a/TM1637Display.cpp b/TM1637Display.cpp new file mode 100644 index 0000000..cbe0107 --- /dev/null +++ b/TM1637Display.cpp @@ -0,0 +1,136 @@ + +// Author: avishorp@gmail.com +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +extern "C" { + #include + #include + #include +} + +#include +#include + +TM1637Display::TM1637Display(uint8_t pinClk, uint8_t pinDIO) +{ + // Copy the pin numbers + m_pinClk = pinClk; + m_pinDIO = pinDIO; + + // Set the pin direction and default value. + // Both pins are set as inputs, allowing the pull-up resistors to pull them up + pinMode(m_pinClk, INPUT); + pinMode(m_pinDIO,INPUT); + digitalWrite(m_pinClk, LOW); + digitalWrite(m_pinDIO, LOW); +} + +void TM1637Display::setBrightness(uint8_t brightness) +{ + m_brightness = brightness; +} + +void TM1637Display::setSegments(uint8_t segments[], uint8_t length, uint8_t pos) +{ + start(); + if (!writeByte(0x40)) + digitalWrite(13,HIGH); + stop(); + start(); + writeByte(0xc0); + writeByte(0xff); + writeByte(0xff); + writeByte(0x00); + writeByte(0xff); + stop(); + start(); + writeByte(0x8f); + stop(); +} + +void TM1637Display::showNumberDec(int num, bool leading_zero, uint8_t length, uint8_t pos) +{ +} + +void TM1637Display::bitDelay() +{ +delay(1); +// int i; +// for(i = 0; i < 250; i++); +} + +void TM1637Display::start() +{ + pinMode(m_pinDIO, OUTPUT); + bitDelay(); +} + +void TM1637Display::stop() +{ + pinMode(m_pinDIO, OUTPUT); + bitDelay(); + pinMode(m_pinClk, INPUT); + bitDelay(); + pinMode(m_pinDIO, INPUT); + bitDelay(); +} + +bool TM1637Display::writeByte(uint8_t b) +{ + uint8_t data = b; + + // 8 Data Bits + for(uint8_t i = 0; i < 8; i++) { + // CLK low + pinMode(m_pinClk, OUTPUT); + bitDelay(); + + // Set data bit + if (data & 0x01) + pinMode(m_pinDIO, INPUT); + else + pinMode(m_pinDIO, OUTPUT); + + bitDelay(); + + // CLK high + pinMode(m_pinClk, INPUT); + bitDelay(); + data = data >> 1; + } + + // Wait for acknowledge + // CLK to zero + pinMode(m_pinClk, OUTPUT); + pinMode(m_pinDIO, INPUT); + bitDelay(); + + // CLK to high + pinMode(m_pinClk, INPUT); + bitDelay(); + uint8_t ack = digitalRead(m_pinDIO); + if (ack == 0) + pinMode(m_pinDIO, OUTPUT); + + + bitDelay(); + pinMode(m_pinClk, OUTPUT); + bitDelay(); + + return ack; +} + + diff --git a/TM1637Display.h b/TM1637Display.h new file mode 100644 index 0000000..9689133 --- /dev/null +++ b/TM1637Display.h @@ -0,0 +1,82 @@ +// Author: avishorp@gmail.com +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +#ifndef __TM1637DISPLAY__ +#define __TM1637DISPLAY__ + +#include + +class TM1637Display { + +public: + //! Initialize a TM1637Display object, setting the clock and + //! data pins. + //! + //! @param pinClk - The number of the digital pin connected to the clock pin of the module + //! @param pinDIO - The number of the digital pin connected to the DIO pin of the module + TM1637Display(uint8_t pinClk, uint8_t pinDIO); + + //! Sets the brightness of the display. + //! + //! The setting takes effect when a command is given to change the data being + //! displayed. + //! + //! @param brightness A number from 0 (lowes brightness) to 7 (highest brightness) + void setBrightness(uint8_t brightness); + + //! Display arbitrary data on the module + //! + //! This function receives raw segment values as input and displays them. The segment data + //! is given as a byte array, each byte corresponding to a single digit. Within each byte, + //! bit 0 is segment A, bit 1 is segment B etc. + //! The function may either set the entire display or any desirable part on its own. The first + //! digit is given by the @ref pos argument with 0 being the leftmost digit. The @ref length + //! argument is the number of digits to be set. Other digits are not affected. + //! + //! @param segments An array of size @ref length containing the raw segment values + //! @param length The number of digits to be modified + //! @param pos The position from which to start the modification (0 - leftmost, 3 - rightmost) + void setSegments(uint8_t segments[], uint8_t length = 4, uint8_t pos = 0); + + //! Displayes a decimal number + //! + //! Dispalyes the given argument as a decimal number + //! + //! @param num The number to be shown + //! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are + //! blank + //! @param length The number of digits to set. The user must ensure that the number to be shown + //! fits to the number of digits requested (for example, if two digits are to be displayed, + //! the number must be between 0 to 99) + //! @param pos The position least significant digit (0 - leftmost, 3 - rightmost) + void showNumberDec(int num, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0); + +protected: + void bitDelay(); + + void start(); + + void stop(); + + bool writeByte(uint8_t b); + +private: + uint8_t m_pinClk; + uint8_t m_pinDIO; + uint8_t m_brightness; +}; + +#endif // __TM1637DISPLAY__