Files
arduino-libs/arduino-cli/libraries/QDP7SegmentDisplay/QDP7SegmentDisplay.cpp
2024-07-20 22:09:06 +08:00

242 lines
5.8 KiB
C++

#include "QDP7SegmentDisplay.h"
static uint8_t TubeTab[] = {0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71,
0xbf, 0x86, 0xdb, 0xcf,
0xe6, 0xed, 0xfd, 0x87,
0xff, 0xef, 0xf7, 0xfc,
0xb9, 0xde, 0xf9, 0xf1, 0x00, 0x40};
QDP7SegmentDisplay::QDP7SegmentDisplay(uint8_t port1,uint8_t port2)
{
Clkpin = port1;
Datapin = port2;
pinMode(Clkpin, OUTPUT);
pinMode(Datapin, OUTPUT);
set();
clearDisplay();
}
void QDP7SegmentDisplay::reset(uint8_t port)
{
reset(port);
pinMode(Clkpin, OUTPUT);
pinMode(Datapin, OUTPUT);
set();
clearDisplay();
}
void QDP7SegmentDisplay::init(void)
{
clearDisplay();
}
void QDP7SegmentDisplay::writeByte(int8_t wr_data)
{
uint8_t i, count1;
for(i = 0; i < 8; i++) //sent 8bit data
{
digitalWrite(Clkpin, LOW);
if(wr_data & 0x01)digitalWrite(Datapin, HIGH); //LSB first
else digitalWrite(Datapin, LOW);
wr_data >>= 1;
digitalWrite(Clkpin, HIGH);
}
digitalWrite(Clkpin, LOW); //wait for the ACK
digitalWrite(Datapin, HIGH);
digitalWrite(Clkpin, HIGH);
pinMode(Datapin, INPUT);
while(digitalRead(Datapin))
{
count1 += 1;
if(count1 == 200)//
{
pinMode(Datapin, OUTPUT);
digitalWrite(Datapin, LOW);
count1 = 0;
}
//pinMode(Datapin,INPUT);
}
pinMode(Datapin, OUTPUT);
}
//send start signal to TM1637
void QDP7SegmentDisplay::start(void)
{
digitalWrite(Clkpin, HIGH); //send start signal to TM1637
digitalWrite(Datapin, HIGH);
digitalWrite(Datapin, LOW);
digitalWrite(Clkpin, LOW);
}
//End of transmission
void QDP7SegmentDisplay::stop(void)
{
digitalWrite(Clkpin, LOW);
digitalWrite(Datapin, LOW);
digitalWrite(Clkpin, HIGH);
digitalWrite(Datapin, HIGH);
}
void QDP7SegmentDisplay::display(uint16_t value)
{
display((int)value);
// display((double)value,0);
}
void QDP7SegmentDisplay::display(int16_t value)
{
display((double)value, 0);
}
void QDP7SegmentDisplay::display(double value, uint8_t digits)
{
AA:
int8_t buf[4] = {' ', ' ', ' ', ' '};
int8_t tempBuf[4];
uint8_t b = 0;
uint8_t bit_num = 0;
uint8_t int_num = 0;
uint8_t isNeg = 0;
double number = value;
if (number >= 9999.5 || number <= -999.5);
else
{
// Handle negative numbers
if (number < 0.0)
{
number = -number;
isNeg = 1 ;
}
// Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5;
for (uint8_t i = 0; i < digits; ++i)
rounding /= 10.0;
number += rounding;
// Extract the integer part of the number and print it
uint16_t int_part = (uint16_t )number;
double remainder = number - (double)int_part;
do
{
uint16_t m = int_part;
int_part /= 10;
char c = m - 10 * int_part;
tempBuf[int_num] = c;
int_num++;
}
while(int_part);
bit_num = isNeg + int_num + digits;
if(bit_num > 4)
{
bit_num = 4;
digits = 4 - (isNeg + int_num);
goto AA;
}
b = 4 - bit_num;
if(isNeg)buf[b++] = 0x21;
for(uint8_t i = int_num; i > 0; i--)buf[b++] = tempBuf[i-1];
// Print the decimal point, but only if there are digits beyond
if (digits > 0)
{
buf[b-1] += 0x10;
// Extract digits from the remainder one at a time
while (digits-- > 0)
{
remainder *= 10.0;
int toPrint = int(remainder);
buf[b++] = toPrint;
remainder -= toPrint;
}
}
}
display(buf);
}
void QDP7SegmentDisplay::write(int8_t SegData[])
{
uint8_t i;
start(); //start signal sent to TM1637 from MCU
writeByte(0x40);
stop();
start();
writeByte(Cmd_SetAddr);
for(i = 0; i < 4; i ++)
{
writeByte(SegData[i]);
}
stop();
start();
writeByte(Cmd_DispCtrl);
stop();
}
void QDP7SegmentDisplay::write(uint8_t BitAddr, int8_t SegData)
{
start(); //start signal sent to TM1637 from MCU
writeByte(0x44);
stop();
start();
writeByte(BitAddr | 0xc0);
writeByte(SegData);
stop();
start();
writeByte(Cmd_DispCtrl);
stop();
}
void QDP7SegmentDisplay::display(int8_t DispData[])
{
int8_t SegData[4];
uint8_t i;
for(i = 0; i < 4; i ++)
{
SegData[i] = DispData[i];
}
coding(SegData);
write(SegData);
}
//******************************************
void QDP7SegmentDisplay::display(uint8_t BitAddr, int8_t DispData)
{
int8_t SegData;
if((DispData >= 'A' && DispData <= 'F'))DispData = DispData - 'A' + 10;
else if((DispData >= 'a' && DispData <= 'f'))DispData = DispData - 'a' + 10;
SegData = coding(DispData);
write(BitAddr, SegData); //
}
void QDP7SegmentDisplay::clearDisplay(void)
{
int8_t buf[4] = {' ', ' ', ' ', ' '};
display(buf);
}
//To take effect the next time it displays.
void QDP7SegmentDisplay::set(uint8_t brightness, uint8_t SetData, uint8_t SetAddr)
{
Cmd_SetData = SetData;
Cmd_SetAddr = SetAddr;
Cmd_DispCtrl = 0x88 + brightness;//Set the brightness and it takes effect the next time it displays.
}
void QDP7SegmentDisplay::coding(int8_t DispData[])
{
// uint8_t PointData = 0;
for(uint8_t i = 0; i < 4; i ++)
{
DispData[i] = TubeTab[DispData[i]];
}
}
int8_t QDP7SegmentDisplay::coding(int8_t DispData)
{
// uint8_t PointData = 0;
DispData = TubeTab[DispData] ;//+ PointData;
return DispData;
}