242 lines
5.8 KiB
C++
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;
|
|
}
|