Archiving Datasheets and libraries that may be required to reproduce old work.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
3.9 KiB

3 years ago
/*
TM1638.cpp - Library implementation for TM1638.
Copyright (C) 2011 Ricardo Batista (rjbatista <at> gmail <dot> 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 <http://www.gnu.org/licenses/>.
*/
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include "TM1638QYF.h"
#include "string.h"
TM1638QYF::TM1638QYF(byte dataPin, byte clockPin, byte strobePin, boolean activateDisplay, byte intensity)
: TM16XX(dataPin, clockPin, strobePin, 8, activateDisplay, intensity)
{
// nothing else to do - calling super is enough
}
void TM1638QYF::setDisplay(const byte values[], unsigned int length)
{
for (int i = 0; i < displays; i++) {
int val = 0;
for (int j = 0; j < length; j++) {
val |= ((values[j] >> i) & 1) << (displays - j - 1);
}
sendData(i << 1, val);
}
}
void TM1638QYF::clearDisplay()
{
setDisplay(NULL, 0);
}
void TM1638QYF::setDisplayToString(const char* string, const word dots, const byte ignored, const byte font[])
{
byte values[displays];
boolean done = false;
memset(values, 0, displays * sizeof(byte));
for (int i = 0; i < displays; i++) {
if (!done && string[i] != '\0') {
values[i] = font[string[i] - 32] | (((dots >> (displays - i - 1)) & 1) << 7);
} else {
done = true;
values[i] = (((dots >> (displays - i - 1)) & 1) << 7);
}
}
setDisplay(values, displays);
}
void TM1638QYF::setDisplayToString(String string, const word dots, const byte ignored, const byte font[])
{
byte values[displays];
int stringLength = string.length();
memset(values, 0, displays * sizeof(byte));
for (int i = 0; i < displays; i++) {
if (i < stringLength) {
values[i] = font[string.charAt(i) - 32] | (((dots >> (displays - i - 1)) & 1) << 7);
} else {
values[i] = (((dots >> (displays - i - 1)) & 1) << 7);
}
}
setDisplay(values, displays);
}
void TM1638QYF::setDisplayToBinNumber(byte number, byte dots, const byte numberFont[])
{
byte values[displays];
memset(values, 0, displays * sizeof(byte));
for (int i = 0; i < displays; i++) {
values[i] = numberFont[(number >> (displays - i - 1)) & 1] | (((dots >> (displays - i - 1)) & 1) << 7);
}
setDisplay(values, displays);
}
void TM1638QYF::setDisplayToHexNumber(unsigned long number, byte dots, boolean leadingZeros,
const byte numberFont[])
{
char values[displays + 1];
snprintf(values, displays + 1, leadingZeros ? "%08X" : "%X", number); // ignores display size
setDisplayToString(values, dots, 0, numberFont);
}
void TM1638QYF::setDisplayToDecNumber(unsigned long number, byte dots, boolean leadingZeros,
const byte numberFont[])
{
char values[displays + 1];
snprintf(values, displays + 1, leadingZeros ? "%08ld" : "%ld", number); // ignores display size
Serial.println(values);
setDisplayToString(values, dots, 0, numberFont);
}
void TM1638QYF::setDisplayToSignedDecNumber(signed long number, byte dots, boolean leadingZeros,
const byte numberFont[])
{
char values[displays + 1];
snprintf(values, displays + 1, leadingZeros ? "%08d" : "%d", number); // ignores display size
setDisplayToString(values, dots, 0, numberFont);
}
word TM1638QYF::getButtons(void)
{
word keys = 0;
digitalWrite(strobePin, LOW);
send(0x42); // B01000010 Read the key scan data
for (int i = 0; i < 4; i++) {
byte rec = receive();
rec = (((rec & B1000000) >> 3 | (rec & B100)) >> 2) | (rec & B100000) | (rec & B10) << 3;
keys |= ((rec & 0x000F) << (i << 1)) | (((rec & 0x00F0) << 4) << (i << 1));
}
digitalWrite(strobePin, HIGH);
return keys;
}