From f52570e01191f2a4397284c70433b1206d6b20cb Mon Sep 17 00:00:00 2001 From: "rjbatista@gmail.com" Date: Mon, 20 Feb 2012 22:17:47 +0000 Subject: [PATCH] ISSUE #20: Support for negative decimal numbers --- CHANGES.txt | 1 + TM1638.cpp | 27 ++++++++++++++++++++++++--- TM1638.h | 5 +++++ TM16XXFonts.h | 2 ++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 7f1d8ee..84d9ff1 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,4 @@ +- ISSUE #20: Support for negative decimal numbers; - ISSUE #19: Corrected setDisplayToString dot bug. Version 2.0.1 diff --git a/TM1638.cpp b/TM1638.cpp index 4784b4d..02aad4e 100644 --- a/TM1638.cpp +++ b/TM1638.cpp @@ -44,18 +44,18 @@ void TM1638::setDisplayToHexNumber(unsigned long number, byte dots, boolean lead } } -void TM1638::setDisplayToDecNumber(unsigned long number, byte dots, boolean leadingZeros, +void TM1638::setDisplayToDecNumberAt(unsigned long number, byte dots, byte startingPos, boolean leadingZeros, const byte numberFont[]) { if (number > 99999999L) { setDisplayToError(); } else { - for (int i = 0; i < displays; i++) { + for (int i = 0; i < displays - startingPos; i++) { if (number != 0) { setDisplayDigit(number % 10, displays - i - 1, (dots & (1 << i)) != 0, numberFont); number /= 10; } else { - if (leadingZeros) { + if (leadingZeros) { setDisplayDigit(0, displays - i - 1, (dots & (1 << i)) != 0, numberFont); } else { clearDisplayDigit(displays - i - 1, (dots & (1 << i)) != 0); @@ -65,6 +65,27 @@ void TM1638::setDisplayToDecNumber(unsigned long number, byte dots, boolean lead } } +void TM1638::setDisplayToDecNumber(unsigned long number, byte dots, boolean leadingZeros, + const byte numberFont[]) +{ + setDisplayToDecNumberAt(number, dots, leadingZeros, 0, numberFont); +} + +void TM1638::setDisplayToSignedDecNumber(signed long number, byte dots, boolean leadingZeros, + const byte numberFont[]) +{ + if (number >= 0) { + setDisplayToDecNumberAt(number, dots, 0, leadingZeros, numberFont); + } else { + if (-number > 9999999L) { + setDisplayToError(); + } else { + setDisplayToDecNumberAt(-number, dots, 1, leadingZeros, numberFont); + sendChar(0, MINUS, (dots & (0x80)) != 0); + } + } +} + void TM1638::setDisplayToBinNumber(byte number, byte dots, const byte numberFont[]) { for (int i = 0; i < displays; i++) { diff --git a/TM1638.h b/TM1638.h index a6d59c5..46bd80f 100644 --- a/TM1638.h +++ b/TM1638.h @@ -43,6 +43,9 @@ class TM1638 : public TM16XX /** Set the display to a unsigned decimal number (with or without leading zeros) */ void setDisplayToDecNumber(unsigned long number, byte dots, boolean leadingZeros = true, const byte numberFont[] = NUMBER_FONT); + /** Set the display to a signed decimal number (with or without leading zeros) */ + void setDisplayToSignedDecNumber(signed long number, byte dots, boolean leadingZeros = true, + const byte numberFont[] = NUMBER_FONT); /** Set the display to a unsigned binary number */ void setDisplayToBinNumber(byte number, byte dots, const byte numberFont[] = NUMBER_FONT); @@ -57,6 +60,8 @@ class TM1638 : public TM16XX protected: virtual void sendChar(byte pos, byte data, boolean dot); + void setDisplayToDecNumberAt(unsigned long number, byte dots, byte startingPos, + boolean leadingZeros, const byte numberFont[]); }; #endif diff --git a/TM16XXFonts.h b/TM16XXFonts.h index 92bf7fe..1b1489d 100644 --- a/TM16XXFonts.h +++ b/TM16XXFonts.h @@ -50,6 +50,8 @@ const byte NUMBER_FONT[] = { 0b01110001 // F }; +const byte MINUS = 0b01000000; + // definition for error const byte ERROR_DATA[] = { 0b01111001, // E