From c96c080177db6a137670af815e2f3a8cb8deb472 Mon Sep 17 00:00:00 2001 From: Jimmy Allen Date: Mon, 26 Oct 2020 13:47:13 +1300 Subject: [PATCH] Initial commit --- .vscode/c_cpp_properties.json | 19 +++ bin/main.bin | Bin 0 -> 29976 bytes bin/main.elf | Bin 0 -> 29976 bytes bin/main.hex | 291 +++++++++++++++++++++++++++++++++ makefile | 29 ++++ src/TM1637Display.cpp | 296 ++++++++++++++++++++++++++++++++++ src/TM1637Display.h | 176 ++++++++++++++++++++ src/main.cpp | 29 ++++ 8 files changed, 840 insertions(+) create mode 100644 .vscode/c_cpp_properties.json create mode 100755 bin/main.bin create mode 100755 bin/main.elf create mode 100644 bin/main.hex create mode 100644 makefile create mode 100644 src/TM1637Display.cpp create mode 100644 src/TM1637Display.h create mode 100644 src/main.cpp diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..3aecb35 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,19 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "/usr/lib/avr/include/" + ], + "defines": [ + "__AVR_ATmega16__" + ], + "compilerPath": "/usr/bin/gcc", + "cStandard": "gnu18", + "cppStandard": "gnu++14", + "intelliSenseMode": "gcc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/bin/main.bin b/bin/main.bin new file mode 100755 index 0000000000000000000000000000000000000000..6df48432fbe5283fb62264aaa94867578bf8667e GIT binary patch literal 29976 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 QsQP}r5&LW + #include + #include +} + +#include "TM1637Display.h" +#include +#include + +#define TM1637_I2C_COMM1 0x40 +#define TM1637_I2C_COMM2 0xC0 +#define TM1637_I2C_COMM3 0x80 + +// +// A +// --- +// F | | B +// -G- +// E | | C +// --- +// D +const uint8_t digitToSegment[] = { + // XGFEDCBA + 0b00111111, // 0 + 0b00000110, // 1 + 0b01011011, // 2 + 0b01001111, // 3 + 0b01100110, // 4 + 0b01101101, // 5 + 0b01111101, // 6 + 0b00000111, // 7 + 0b01111111, // 8 + 0b01101111, // 9 + 0b01110111, // A + 0b01111100, // b + 0b00111001, // C + 0b01011110, // d + 0b01111001, // E + 0b01110001 // F + }; + +static const uint8_t minusSegments = 0b01000000; + + + + +TM1637Display::TM1637Display(uint8_t pinClk, uint8_t pinDIO, volatile uint8_t *port, int bitDelay) +{ + // Copy the pin numbers + m_pinClk = pinClk; + m_pinDIO = pinDIO; + m_bitDelay = bitDelay; + m_port = port; + m_ddr = port-1; + m_pin = port-2; + + // Set the pin direction and default value. + // Both pins are set as inputs, allowing the pull-up resistors to pull them up + //CLK_Input(); + //pinMode(m_pinDIO,INPUT); + DIO_Input(); + CLK_Input(); + //digitalWrite(m_pinClk, LOW); + //digitalWrite(m_pinDIO, LOW); + DIO_Low(); + CLK_Low(); +} + +void TM1637Display::setBrightness(uint8_t brightness, bool on) +{ + m_brightness = (brightness & 0x7) | (on? 0x08 : 0x00); +} + +void TM1637Display::setSegments(const uint8_t segments[], uint8_t length, uint8_t pos) +{ + // Write COMM1 + start(); + writeByte(TM1637_I2C_COMM1); + stop(); + + // Write COMM2 + first digit address + start(); + writeByte(TM1637_I2C_COMM2 + (pos & 0x03)); + + // Write the data bytes + for (uint8_t k=0; k < length; k++) + writeByte(segments[k]); + + stop(); + + // Write COMM3 + brightness + start(); + writeByte(TM1637_I2C_COMM3 + (m_brightness & 0x0f)); + stop(); +} + +void TM1637Display::clear() +{ + uint8_t data[] = { 0, 0, 0, 0 }; + setSegments(data); +} + +void TM1637Display::showNumberDec(int num, bool leading_zero, uint8_t length, uint8_t pos) +{ + showNumberDecEx(num, 0, leading_zero, length, pos); +} + +void TM1637Display::showNumberDecEx(int num, uint8_t dots, bool leading_zero, + uint8_t length, uint8_t pos) +{ + showNumberBaseEx(num < 0? -10 : 10, num < 0? -num : num, dots, leading_zero, length, pos); +} + +void TM1637Display::showNumberHexEx(uint16_t num, uint8_t dots, bool leading_zero, + uint8_t length, uint8_t pos) +{ + showNumberBaseEx(16, num, dots, leading_zero, length, pos); +} + +void TM1637Display::showNumberBaseEx(int8_t base, uint16_t num, uint8_t dots, bool leading_zero, + uint8_t length, uint8_t pos) +{ + bool negative = false; + if (base < 0) { + base = -base; + negative = true; + } + + + uint8_t digits[4]; + + if (num == 0 && !leading_zero) { + // Singular case - take care separately + for(uint8_t i = 0; i < (length-1); i++) + digits[i] = 0; + digits[length-1] = encodeDigit(0); + } + else { + //uint8_t i = length-1; + //if (negative) { + // // Negative number, show the minus sign + // digits[i] = minusSegments; + // i--; + //} + + for(int i = length-1; i >= 0; --i) + { + uint8_t digit = num % base; + + if (digit == 0 && num == 0 && leading_zero == false) + // Leading zero is blank + digits[i] = 0; + else + digits[i] = encodeDigit(digit); + + if (digit == 0 && num == 0 && negative) { + digits[i] = minusSegments; + negative = false; + } + + num /= base; + } + + if(dots != 0) + { + showDots(dots, digits); + } + } + setSegments(digits, length, pos); +} + +void TM1637Display::bitDelay() +{ + _delay_us(m_bitDelay); +} + +void TM1637Display::start() +{ + DIO_Output(); + bitDelay(); +} + +void TM1637Display::stop() +{ + DIO_Output(); + bitDelay(); + CLK_Input(); + bitDelay(); + DIO_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 + CLK_Output(); + bitDelay(); + + // Set data bit + if (data & 0x01) + DIO_Input(); + else + DIO_Output(); + + bitDelay(); + + // CLK high + CLK_Input(); + bitDelay(); + data = data >> 1; + } + + // Wait for acknowledge + // CLK to zero + CLK_Output(); + DIO_Input(); + bitDelay(); + + // CLK to high + CLK_Input(); + bitDelay(); + uint8_t ack = DIO_Read(); + if (ack == 0) + DIO_Output(); + + + bitDelay(); + CLK_Output(); + bitDelay(); + + return ack; +} + +void TM1637Display::showDots(uint8_t dots, uint8_t* digits) +{ + for(int i = 0; i < 4; ++i) + { + digits[i] |= (dots & 0x80); + dots <<= 1; + } +} + +uint8_t TM1637Display::encodeDigit(uint8_t digit) +{ + return digitToSegment[digit & 0x0f]; +} + +inline void TM1637Display::DIO_Output() { + *(m_ddr) |= (1<> m_pinDIO; + } + + inline void TM1637Display::CLK_Output() { + *(m_ddr) |= (1< +#include + +#define SEG_A 0b00000001 +#define SEG_B 0b00000010 +#define SEG_C 0b00000100 +#define SEG_D 0b00001000 +#define SEG_E 0b00010000 +#define SEG_F 0b00100000 +#define SEG_G 0b01000000 + +#define DEFAULT_BIT_DELAY 100 + +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 + //! @param bitDelay - The delay, in microseconds, between bit transition on the serial + //! bus connected to the display + TM1637Display(uint8_t pinClk, uint8_t pinDIO, volatile uint8_t *port, int bitDelay = DEFAULT_BIT_DELAY); + + //! 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) + //! @param on Turn display on or off + void setBrightness(uint8_t brightness, bool on = true); + + //! 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(const uint8_t segments[], uint8_t length = 4, uint8_t pos = 0); + + //! Clear the display + void clear(); + + //! Display a decimal number + //! + //! Dispaly 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. NOTE: leading zero is not supported with negative numbers. + //! @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 of the most significant digit (0 - leftmost, 3 - rightmost) + void showNumberDec(int num, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0); + + //! Display a decimal number, with dot control + //! + //! Dispaly the given argument as a decimal number. The dots between the digits (or colon) + //! can be individually controlled. + //! + //! @param num The number to be shown + //! @param dots Dot/Colon enable. The argument is a bitmask, with each bit corresponding to a dot + //! between the digits (or colon mark, as implemented by each module). i.e. + //! For displays with dots between each digit: + //! * 0.000 (0b10000000) + //! * 00.00 (0b01000000) + //! * 000.0 (0b00100000) + //! * 0.0.0.0 (0b11100000) + //! For displays with just a colon: + //! * 00:00 (0b01000000) + //! For displays with dots and colons colon: + //! * 0.0:0.0 (0b11100000) + //! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are + //! blank. NOTE: leading zero is not supported with negative numbers. + //! @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 of the most significant digit (0 - leftmost, 3 - rightmost) + void showNumberDecEx(int num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0); + + //! Display a hexadecimal number, with dot control + //! + //! Dispaly the given argument as a hexadecimal number. The dots between the digits (or colon) + //! can be individually controlled. + //! + //! @param num The number to be shown + //! @param dots Dot/Colon enable. The argument is a bitmask, with each bit corresponding to a dot + //! between the digits (or colon mark, as implemented by each module). i.e. + //! For displays with dots between each digit: + //! * 0.000 (0b10000000) + //! * 00.00 (0b01000000) + //! * 000.0 (0b00100000) + //! * 0.0.0.0 (0b11100000) + //! For displays with just a colon: + //! * 00:00 (0b01000000) + //! For displays with dots and colons colon: + //! * 0.0:0.0 (0b11100000) + //! @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 of the most significant digit (0 - leftmost, 3 - rightmost) + void showNumberHexEx(uint16_t num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0); + + //! Translate a single digit into 7 segment code + //! + //! The method accepts a number between 0 - 15 and converts it to the + //! code required to display the number on a 7 segment display. + //! Numbers between 10-15 are converted to hexadecimal digits (A-F) + //! + //! @param digit A number between 0 to 15 + //! @return A code representing the 7 segment image of the digit (LSB - segment A; + //! bit 6 - segment G; bit 7 - always zero) + uint8_t encodeDigit(uint8_t digit); + +protected: + void bitDelay(); + + void start(); + + void stop(); + + bool writeByte(uint8_t b); + + void showDots(uint8_t dots, uint8_t* digits); + + void showNumberBaseEx(int8_t base, uint16_t num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0); + + +private: + uint8_t m_pinClk; + uint8_t m_pinDIO; + uint8_t m_brightness; + volatile uint8_t *m_port; + volatile uint8_t *m_ddr; + volatile uint8_t *m_pin; + unsigned int m_bitDelay; + inline void DIO_Output(); + inline void DIO_Input(); + inline void DIO_Low(); + inline bool DIO_Read(); + inline void CLK_Output(); + inline void CLK_Input(); + inline void CLK_Low(); +}; + +#endif // __TM1637DISPLAY__ diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..47f5880 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,29 @@ +/* + * Blink.cpp + * + * Created: 18/12/2018 5:11:34 PM + * Author : jimmy + */ +#define F_CPU 8000000 +#include +#include +#include +#include "TM1637Display.h" + +int main(void) { + *(&PORTA-1) |= (1<