Ich muss nochmals lästig sein. Habe mich inzwischen rund zwei Tage mit oben genanntem Problem herumgeplagt und kann es einfach nicht verstehen, dass die Funktion showNumberDecEx nicht erkannt wird, obwohl sie sowohl im Header-als auch cpp-File der Bibliothek aufscheint, sprich, ich komme einfach nicht drauf.
// 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 <inttypes.h>
#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 SEG_DP 0b10000000
#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, unsigned 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
//!
//! Display 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
//!
//! Display 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
//!
//! Display 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)
static 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;
unsigned int m_bitDelay;
};
#endif // __TM1637DISPLAY__
Zum Inhalt springen
Anmelden
Anmelden
Avishorp/TM1637 Öffentlich
Meister
TM1637/TM1637Anzeige.cpp
Zur Datei

avishorp Bugfix: Punkte/Doppelpunkt wird nicht angezeigt #65
...
Letzter Commit 9486982 on Jun 27, 2020 Geschichte
4 Mitwirkende



258 Zeilen (215 sloc) 5.48 KB
Roh Schuld
Nämpf Autor: avishorp@gmail.com
//
Nämpf Diese Bibliothek ist freie Software; Sie können es weitergeben und/oder
Es unter den Bedingungen der GNU Lesser General Public zu modifizieren
Nämpf Lizenz, wie von der Free Software Foundation veröffentlicht; entweder
Version 2.1 der Lizenz oder (nach Ihrer Wahl) eine spätere Version.
//
Nämpf Diese Bibliothek wird in der Hoffnung verteilt, dass sie nützlich sein wird,
aber OHNE GEWÄHRLEISTUNG; ohne die stillschweigende Gewährleistung von
Nämpf MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe GNU
Nämpf Lesser General Public License für weitere Details.
//
Nämpf Sie sollten ein Exemplar der GNU Lesser General Public erhalten haben
Nämpf Lizenz zusammen mit dieser Bibliothek; Wenn nicht, schreiben Sie in die Freie Software
Nämpf Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
vextern "C" {
#Fügen Sie <stdlib.h> hinzu
#<string.h> einschließen
#<inttypes.h> einschließen
}
#enthalten <TM1637Display.h>
#Dazu gehören <Arduino.h>
#Definieren Sie TM1637_I2C_COMM1 0x40
#Definieren Sie TM1637_I2C_COMM2 0xC0
#Definieren Sie TM1637_I2C_COMM3 0x80
//
Nämpf Ein
// ---
Nämpf F B
// -G-
Nämpf E C
// ---
Nämpf D
const uint8_t digitToSegment[] = {
Nämpf 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, unsigned int bitDelay)
{
Nämpf Kopieren Sie die PIN-Nummern
m_pinClk = pinClk;
m_pinDIO = pinDIO;
m_bitDelay = bitDelay;
Nämpf Legen Sie die Pin-Richtung und den Standardwert fest.
Nämpf Beide Pins sind als Eingänge eingestellt, so dass die Pull-up-Widerstände sie nach oben ziehen können
pinMode(m_pinClk, INPUT);
pinMode(m_pinDIO,INPUT);
digitalWrite(m_pinClk, LOW);
digitalWrite(m_pinDIO, LOW);
}
void TM1637Display::setBrightness(uint8_t Helligkeit, bool on)
{
m_brightness = (Helligkeit & 0x7) (Auf? 0x08 : 0x00);
}
void TM1637Display::setSegments(const uint8_t Segmente[], uint8_t Länge, uint8_t pos)
{
Nämpf COMM1 schreiben
anfangen();
writeByte(TM1637_I2C_COMM1);
aufhören();
Nämpf COMM2 + Adresse der ersten Ziffer schreiben
anfangen();
writeByte(TM1637_I2C_COMM2 + (pos & 0x03));
Nämpf Schreiben Sie die Datenbytes
für (uint8_t k=0; k < Länge; k++)
writeByte(segmente[k]);
aufhören();
Nämpf COMM3 + Helligkeit schreiben
anfangen();
writeByte(TM1637_I2C_COMM3 + (m_brightness & 0x0f));
aufhören();
}
void TM1637Anzeige::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, Länge, pos);
}
void TM1637Display::showNumberDecEx(int num, uint8_t Punkte, bool leading_zero,
uint8_t Länge, uint8_t pos)
{
showNumberBaseEx(num < 0? -10 : 10, num < 0? -num : num, Punkte, leading_zero, Länge, pos);
}
void TM1637Display::showNumberHexEx(uint16_t num, uint8_t Punkte, bool leading_zero,
uint8_t Länge, uint8_t pos)
{
showNumberBaseEx(16, Zahl, Punkte, leading_zero, Länge, Pos);
}
void TM1637Display::showNumberBaseEx(int8_t Basis, uint16_t num, uint8_t Punkte, bool leading_zero,
uint8_t Länge, uint8_t pos)
{
bool negativ = falsch;
if (Basis < 0) {
Basis = -Basis;
negativ = wahr;
}
uint8_t Ziffern[4];
if (num == 0 && !leading_zero) {
Nämpf Einzelfall - gesondert aufpassen
for(uint8_t i = 0; i < (length-1); i++)
Ziffern[i] = 0;
digits[length-1] = encodeDigit(0);
}
oder {
//uint8_t i = Länge-1;
//if (negativ) {
// // Negative Zahl, Minuszeichen anzeigen
// digits[i] = minusSegments;
// i--;
//}
for(int i = Länge-1; i >= 0; --i)
{
uint8_t Ziffer = Anzahl % Basis;
if (digit == 0 & & num == 0 && leading_zero == false)
Nämpf Führende Null ist leer
Ziffern[i] = 0;
oder
digits[i] = encodeDigit(digit);
if (Ziffer == 0 & & num == 0 && negativ) {
Ziffern[i] = MinusSegmente;
negativ = falsch;
}
num /= Basis;
}
}
if(Punkte != 0)
{
showDots(Punkte, Ziffern);
}
setSegments(Ziffern, Länge, pos);
}
void TM1637Display::bitDelay()
{
VerzögerungMikrosekunden(m_bitDelay);
}
void TM1637Anzeige::start()
{
pinMode(m_pinDIO, OUTPUT);
bitVerzögerung();
}
void TM1637Anzeige::stop()
{
pinMode(m_pinDIO, OUTPUT);
bitVerzögerung();
pinMode(m_pinClk, INPUT);
bitVerzögerung();
pinMode(m_pinDIO, INPUT);
bitVerzögerung();
}
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;
}
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];
}
Ich habe sämtliche Libraries durchgetestet, bekomme aber jedesmal die Meldung:
Compilation error: 'class TM1637Display' has no member named 'showNumberDecEx'; did you mean 'showNumberDec'?
Ich komme einfach auf die Ursache net drauf! Mit der Funktion 'showNumberDec' lässt sich das oben erwähnte Astro-Uhren-Programm problemlos compilieren, aber die Funktion showNumberDecEx, die ich gerne verwenden möchte, ist nicht bekannt.
Kurz gesagt, ich renne im Kreis, obwohl ich wirklich angestrengt versucht habe, das Problem in den Griff zu bekommen.
Die Anzeige des Doppelpunktes auf dem TM1637 ist ja nicht unbedingt notwendig aber sie sollte schon sein und showNumberDec kann das ja nicht.