From c297ea9e9f98fa3a8fd1a62bb957727245f7a76d Mon Sep 17 00:00:00 2001 From: "rjbatista@gmail.com" Date: Wed, 11 Jan 2012 01:39:34 +0000 Subject: [PATCH] Restructuring for supporting other modules --- TM1638.cpp | 157 ++-------------- TM1638.h | 37 +--- TM16XX.cpp | 167 ++++++++++++++++++ TM16XX.h | 75 ++++++++ TM1638Fonts.h => TM16XXFonts.h | 6 +- .../tm1638_one_module_example.pde | 2 +- .../tm1638_scrolling_modules_example.pde | 2 +- .../tm1638_two_modules_example.pde | 2 +- 8 files changed, 266 insertions(+), 182 deletions(-) create mode 100644 TM16XX.cpp create mode 100644 TM16XX.h rename TM1638Fonts.h => TM16XXFonts.h (97%) diff --git a/TM1638.cpp b/TM1638.cpp index df93151..981f857 100644 --- a/TM1638.cpp +++ b/TM1638.cpp @@ -26,42 +26,19 @@ along with this program. If not, see . #include "string.h" TM1638::TM1638(byte dataPin, byte clockPin, byte strobePin, boolean activateDisplay, byte intensity) + : TM16XX(dataPin, clockPin, strobePin, 8, activateDisplay, intensity) { - this->dataPin = dataPin; - this->clockPin = clockPin; - this->strobePin = strobePin; - - pinMode(dataPin, OUTPUT); - pinMode(clockPin, OUTPUT); - pinMode(strobePin, OUTPUT); - - digitalWrite(strobePin, HIGH); - digitalWrite(clockPin, HIGH); - - sendCommand(0x40); - sendCommand(0x80 | (activateDisplay ? 8 : 0) | min(7, intensity)); - - digitalWrite(strobePin, LOW); - send(0xC0); - for (int i = 0; i < 16; i++) { - send(0x00); - } - digitalWrite(strobePin, HIGH); -} - -void TM1638::setupDisplay(boolean active, byte intensity) -{ - sendCommand(0x80 | (active ? 8 : 0) | min(7, intensity)); + // nothing else to do - calling super is enough } void TM1638::setDisplayToHexNumber(unsigned long number, byte dots, boolean leadingZeros, const byte numberFont[]) { - for (int i = 0; i < 8; i++) { + for (int i = 0; i < displays; i++) { if (!leadingZeros && number == 0) { - clearDisplayDigit(7 - i, (dots & (1 << i)) != 0); + clearDisplayDigit(displays - i - 1, (dots & (1 << i)) != 0); } else { - setDisplayDigit(number & 0xF, 7 - i, (dots & (1 << i)) != 0, numberFont); + setDisplayDigit(number & 0xF, displays - i - 1, (dots & (1 << i)) != 0, numberFont); number >>= 4; } } @@ -73,15 +50,15 @@ void TM1638::setDisplayToDecNumber(unsigned long number, byte dots, boolean lead if (number > 99999999L) { setDisplayToError(); } else { - for (int i = 0; i < 8; i++) { + for (int i = 0; i < displays; i++) { if (number != 0) { - setDisplayDigit(number % 10, 7 - i, (dots & (1 << i)) != 0, numberFont); + setDisplayDigit(number % 10, displays - i - 1, (dots & (1 << i)) != 0, numberFont); number /= 10; } else { if (leadingZeros) { - setDisplayDigit(0, 7 - i, (dots & (1 << i)) != 0, numberFont); + setDisplayDigit(0, displays - i - 1, (dots & (1 << i)) != 0, numberFont); } else { - clearDisplayDigit(7 - i, (dots & (1 << i)) != 0); + clearDisplayDigit(displays - i - 1, (dots & (1 << i)) != 0); } } } @@ -90,61 +67,8 @@ void TM1638::setDisplayToDecNumber(unsigned long number, byte dots, boolean lead void TM1638::setDisplayToBinNumber(byte number, byte dots, const byte numberFont[]) { - for (int i = 0; i < 8; i++) { - setDisplayDigit((number & (1 << i)) == 0 ? 0 : 1, 7 - i, (dots & (1 << i)) != 0, numberFont); - } -} - -void TM1638::setDisplayDigit(byte digit, byte pos, boolean dot, const byte numberFont[]) -{ - sendChar(pos, numberFont[digit & 0xF], dot); -} - -void TM1638::setDisplayToError() -{ - setDisplay(ERROR_DATA); -} - -void TM1638::clearDisplayDigit(byte pos, boolean dot) -{ - sendChar(pos, 0, dot); -} - -void TM1638::setDisplay(const byte values[]) -{ - for (int i = 0; i < 8; i++) { - sendChar(i, values[i], 0); - } -} - -void TM1638::clearDisplay() -{ - for (int i = 0; i < 8; i++) { - sendData(i << 1, 0); - } -} - -void TM1638::setDisplayToString(const char* string, const byte dots, const byte pos, const byte font[]) -{ - for (int i = 0; i < 8 - pos; i++) { - if (string[i] != '\0') { - sendChar(i + pos, font[string[i] - 32], dots & (1 << (7 - i))); - } else { - break; - } - } -} - -void TM1638::setDisplayToString(const String string, const byte dots, const byte pos, const byte font[]) -{ - int stringLength = string.length(); - - for (int i = 0; i < 8 - pos; i++) { - if (i < stringLength) { - sendChar(i + pos, font[string.charAt(i) - 32], dots & (1 << (7 - i))); - } else { - break; - } + for (int i = 0; i < displays; i++) { + setDisplayDigit((number & (1 << i)) == 0 ? 0 : 1, displays - i - 1, (dots & (1 << i)) != 0, numberFont); } } @@ -155,14 +79,14 @@ void TM1638::setLED(byte color, byte pos) void TM1638::setLEDs(word leds) { - for (int i = 0; i < 8; i++) { + for (int i = 0; i < displays; i++) { byte color = 0; - if (leds & (1 << i)) { + if (leds & (1 << i) != 0) { color |= TM1638_COLOR_RED; } - if (leds & (1 << (i + 8))) { + if (leds & (1 << (i + 8)) != 0) { color |= TM1638_COLOR_GREEN; } @@ -188,56 +112,3 @@ void TM1638::sendChar(byte pos, byte data, boolean dot) { sendData(pos << 1, data | (dot ? 0b10000000 : 0)); } - -void TM1638::sendCommand(byte cmd) -{ - digitalWrite(strobePin, LOW); - send(cmd); - digitalWrite(strobePin, HIGH); -} - -void TM1638::sendData(byte add, byte data) -{ - sendCommand(0x44); - digitalWrite(strobePin, LOW); - send(0xc0 | add); - send(data); - digitalWrite(strobePin, HIGH); -} - -void TM1638::send(byte data) -{ - for (int i = 0; i < 8; i++) { - digitalWrite(clockPin, LOW); - digitalWrite(dataPin, data & 1 ? HIGH : LOW); - data >>= 1; - digitalWrite(clockPin, HIGH); - } -} - -byte TM1638::receive() -{ - byte temp = 0; - - // Pull-up on - pinMode(dataPin, INPUT); - digitalWrite(dataPin, HIGH); - - for (int i = 0; i < 8; i++) { - temp >>= 1; - - digitalWrite(clockPin, LOW); - - if (digitalRead(dataPin)) { - temp |= 0x80; - } - - digitalWrite(clockPin, HIGH); - } - - // Pull-up off - pinMode(dataPin, OUTPUT); - digitalWrite(dataPin, LOW); - - return temp; -} diff --git a/TM1638.h b/TM1638.h index ed069a1..a6d59c5 100644 --- a/TM1638.h +++ b/TM1638.h @@ -25,20 +25,18 @@ along with this program. If not, see . #include "WProgram.h" #endif -#include "TM1638Fonts.h" +#include "TM16XX.h" +#include "TM16XXFonts.h" #define TM1638_COLOR_RED 1 #define TM1638_COLOR_GREEN 2 -class TM1638 +class TM1638 : public TM16XX { public: /** Instantiate a tm1638 module specifying the display state, the starting intensity (0-7) data, clock and stobe pins. */ TM1638(byte dataPin, byte clockPin, byte strobePin, boolean activateDisplay = true, byte intensity = 7); - /** Set the display (segments and LEDs) active or off and intensity (range from 0-7). */ - void setupDisplay(boolean active, byte intensity); - /** Set the display to a unsigned hexadecimal number (with or without leading zeros) */ void setDisplayToHexNumber(unsigned long number, byte dots, boolean leadingZeros = true, const byte numberFont[] = NUMBER_FONT); @@ -48,23 +46,6 @@ class TM1638 /** Set the display to a unsigned binary number */ void setDisplayToBinNumber(byte number, byte dots, const byte numberFont[] = NUMBER_FONT); - /** Set a single display at pos (starting at 0) to a digit (left to right) */ - void setDisplayDigit(byte digit, byte pos, boolean dot, - const byte numberFont[] = NUMBER_FONT); - /** Set the display to an error message */ - void setDisplayToError(); - /** Clear a single display at pos (starting at 0, left to right) */ - void clearDisplayDigit(byte pos, boolean dot); - /** Set the display to the 8 values (left to right) */ - void setDisplay(const byte values[]); - /** Clear the display */ - void clearDisplay(); - /** Set the display to the string (defaults to built in font) */ - void setDisplayToString(const char* string, const byte dots = 0, const byte pos = 0, - const byte font[] = FONT_DEFAULT); - /** Set the display to the String (defaults to built in font) */ - void setDisplayToString(String string, const byte dots = 0, const byte pos = 0, - const byte font[] = FONT_DEFAULT); /** Set the LED at pos to color (TM1638_COLOR_RED, TM1638_COLOR_GREEN or both) */ virtual void setLED(byte color, byte pos); @@ -75,17 +56,7 @@ class TM1638 virtual byte getButtons(); protected: - virtual void sendChar(byte pos, byte data, boolean dot); - - void sendCommand(byte led); - void sendData(byte add, byte data); - void send(byte data); - byte receive(); - - private: - byte dataPin; - byte clockPin; - byte strobePin; + virtual void sendChar(byte pos, byte data, boolean dot); }; #endif diff --git a/TM16XX.cpp b/TM16XX.cpp new file mode 100644 index 0000000..b05964a --- /dev/null +++ b/TM16XX.cpp @@ -0,0 +1,167 @@ +/* +TM16XX.cpp - Library implementation for TM16XX. + +Copyright (C) 2011 Ricardo Batista (rjbatista gmail com) + +This program is free software: you can redistribute it and/or modify +it under the terms of the version 3 GNU General Public License as +published by the Free Software Foundation. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#if defined(ARDUINO) && ARDUINO >= 100 + #include "Arduino.h" +#else + #include "WProgram.h" +#endif + +#include "TM16XX.h" +#include "string.h" + +TM16XX::TM16XX(byte dataPin, byte clockPin, byte strobePin, byte displays, boolean activateDisplay, + byte intensity) +{ + this->dataPin = dataPin; + this->clockPin = clockPin; + this->strobePin = strobePin; + this->displays = displays; + + pinMode(dataPin, OUTPUT); + pinMode(clockPin, OUTPUT); + pinMode(strobePin, OUTPUT); + + digitalWrite(strobePin, HIGH); + digitalWrite(clockPin, HIGH); + + sendCommand(0x40); + sendCommand(0x80 | (activateDisplay ? 8 : 0) | min(7, intensity)); + + digitalWrite(strobePin, LOW); + send(0xC0); + for (int i = 0; i < 16; i++) { + send(0x00); + } + digitalWrite(strobePin, HIGH); +} + +void TM16XX::setupDisplay(boolean active, byte intensity) +{ + sendCommand(0x80 | (active ? 8 : 0) | min(7, intensity)); +} + +void TM16XX::setDisplayDigit(byte digit, byte pos, boolean dot, const byte numberFont[]) +{ + sendChar(pos, numberFont[digit & 0xF], dot); +} + +void TM16XX::setDisplayToError() +{ + setDisplay(ERROR_DATA, 8); + + for (int i = 8; i < displays; i++) { + clearDisplayDigit(i, 0); + } +} + +void TM16XX::clearDisplayDigit(byte pos, boolean dot) +{ + sendChar(pos, 0, dot); +} + +void TM16XX::setDisplay(const byte values[], unsigned int size) +{ + for (int i = 0; i < size; i++) { + sendChar(i, values[i], 0); + } +} + +void TM16XX::clearDisplay() +{ + for (int i = 0; i < displays; i++) { + sendData(i << 1, 0); + } +} + +void TM16XX::setDisplayToString(const char* string, const word dots, const byte pos, const byte font[]) +{ + for (int i = 0; i < displays - pos; i++) { + if (string[i] != '\0') { + sendChar(i + pos, font[string[i] - 32], dots & (1 << (displays - i - 1)) != 0); + } else { + break; + } + } +} + +void TM16XX::setDisplayToString(const String string, const word dots, const byte pos, const byte font[]) +{ + int stringLength = string.length(); + + for (int i = 0; i < displays - pos; i++) { + if (i < stringLength) { + sendChar(i + pos, font[string.charAt(i) - 32], dots & (1 << (displays - i - 1)) != 0); + } else { + break; + } + } +} + +void TM16XX::sendCommand(byte cmd) +{ + digitalWrite(strobePin, LOW); + send(cmd); + digitalWrite(strobePin, HIGH); +} + +void TM16XX::sendData(byte address, byte data) +{ + sendCommand(0x44); + digitalWrite(strobePin, LOW); + send(0xC0 | address); + send(data); + digitalWrite(strobePin, HIGH); +} + +void TM16XX::send(byte data) +{ + for (int i = 0; i < 8; i++) { + digitalWrite(clockPin, LOW); + digitalWrite(dataPin, data & 1 ? HIGH : LOW); + data >>= 1; + digitalWrite(clockPin, HIGH); + } +} + +byte TM16XX::receive() +{ + byte temp = 0; + + // Pull-up on + pinMode(dataPin, INPUT); + digitalWrite(dataPin, HIGH); + + for (int i = 0; i < 8; i++) { + temp >>= 1; + + digitalWrite(clockPin, LOW); + + if (digitalRead(dataPin)) { + temp |= 0x80; + } + + digitalWrite(clockPin, HIGH); + } + + // Pull-up off + pinMode(dataPin, OUTPUT); + digitalWrite(dataPin, LOW); + + return temp; +} diff --git a/TM16XX.h b/TM16XX.h new file mode 100644 index 0000000..4912cea --- /dev/null +++ b/TM16XX.h @@ -0,0 +1,75 @@ +/* +TM16XX.h - Library for TM1638. + +Copyright (C) 2011 Ricardo Batista + +This program is free software: you can redistribute it and/or modify +it under the terms of the version 3 GNU General Public License as +published by the Free Software Foundation. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef TM16XX_h +#define TM16XX_h + +#if defined(ARDUINO) && ARDUINO >= 100 + #include "Arduino.h" +#else + #include "WProgram.h" +#endif + +#include "TM16XXFonts.h" + +class TM16XX +{ + public: + /** + * Instantiate a tm16xx module specifying the number of displays, display state, + * the starting intensity (0-7) data, clock and stobe pins. + */ + TM16XX(byte dataPin, byte clockPin, byte strobePin, byte displays, boolean activateDisplay = true, + byte intensity = 7); + + /** Set the display (segments and LEDs) active or off and intensity (range from 0-7). */ + virtual void setupDisplay(boolean active, byte intensity); + + /** Set a single display at pos (starting at 0) to a digit (left to right) */ + virtual void setDisplayDigit(byte digit, byte pos, boolean dot, const byte numberFont[] = NUMBER_FONT); + /** Set the display to an error message */ + virtual void setDisplayToError(); + /** Clear a single display at pos (starting at 0, left to right) */ + virtual void clearDisplayDigit(byte pos, boolean dot); + /** Set the display to the values (left to right) */ + virtual void setDisplay(const byte values[], unsigned int length = 8); + /** Clear the display */ + virtual void clearDisplay(); + + /** Set the display to the string (defaults to built in font) */ + virtual void setDisplayToString(const char* string, const word dots = 0, const byte pos = 0, + const byte font[] = FONT_DEFAULT); + /** Set the display to the String (defaults to built in font) */ + virtual void setDisplayToString(String string, const word dots = 0, const byte pos = 0, + const byte font[] = FONT_DEFAULT); + + protected: + virtual void sendChar(byte pos, byte data, boolean dot) = 0; + + virtual void sendCommand(byte led); + virtual void sendData(byte add, byte data); + virtual void send(byte data); + virtual byte receive(); + + byte displays; + byte dataPin; + byte clockPin; + byte strobePin; +}; + +#endif diff --git a/TM1638Fonts.h b/TM16XXFonts.h similarity index 97% rename from TM1638Fonts.h rename to TM16XXFonts.h index fc32b55..92bf7fe 100644 --- a/TM1638Fonts.h +++ b/TM16XXFonts.h @@ -1,5 +1,5 @@ /* -TM1638Fonts.h - Font definition for TM1638. +TM16XXFonts.h - Font definition for TM16XX. Copyright (C) 2011 Ricardo Batista (rjbatista gmail com) @@ -27,8 +27,8 @@ The bits are displayed by mapping bellow */ -#ifndef TM1638Fonts_h -#define TM1638Fonts_h +#ifndef TM16XXFonts_h +#define TM16XXFonts_h // definition for standard hexadecimal numbers const byte NUMBER_FONT[] = { diff --git a/examples/tm1638_one_module_example/tm1638_one_module_example.pde b/examples/tm1638_one_module_example/tm1638_one_module_example.pde index 1adc4ca..84eb9d1 100644 --- a/examples/tm1638_one_module_example/tm1638_one_module_example.pde +++ b/examples/tm1638_one_module_example/tm1638_one_module_example.pde @@ -1,5 +1,5 @@ /* -TM1638.h - Library for TM1638. +Library examples for TM1638. Copyright (C) 2011 Ricardo Batista diff --git a/examples/tm1638_scrolling_modules_example/tm1638_scrolling_modules_example.pde b/examples/tm1638_scrolling_modules_example/tm1638_scrolling_modules_example.pde index f7947bb..ceee1d2 100644 --- a/examples/tm1638_scrolling_modules_example/tm1638_scrolling_modules_example.pde +++ b/examples/tm1638_scrolling_modules_example/tm1638_scrolling_modules_example.pde @@ -1,5 +1,5 @@ /* -TM1638.h - Library for TM1638. +Library examples for TM1638. Copyright (C) 2011 Ricardo Batista diff --git a/examples/tm1638_two_modules_example/tm1638_two_modules_example.pde b/examples/tm1638_two_modules_example/tm1638_two_modules_example.pde index 9263cb1..d358f83 100644 --- a/examples/tm1638_two_modules_example/tm1638_two_modules_example.pde +++ b/examples/tm1638_two_modules_example/tm1638_two_modules_example.pde @@ -1,5 +1,5 @@ /* -TM1638.h - Library for TM1638. +Library examples for TM1638. Copyright (C) 2011 Ricardo Batista