mirror of
https://github.com/letscontrolit/ESPEasy.git
synced 2026-07-27 19:57:38 +00:00
179 lines
3.2 KiB
C++
179 lines
3.2 KiB
C++
#include "HT16K33.h"
|
|
#include <Wire.h>
|
|
|
|
CHT16K33::CHT16K33(void)
|
|
{
|
|
|
|
};
|
|
|
|
void CHT16K33::Init(uint8_t addr)
|
|
{
|
|
_addr = addr;
|
|
|
|
// System Setup Register
|
|
Wire.beginTransmission(_addr);
|
|
Wire.write(0x21); // oscillator on
|
|
Wire.endTransmission();
|
|
|
|
// Display Setup Register
|
|
Wire.beginTransmission(_addr);
|
|
Wire.write(0x81); // blink off; display on
|
|
Wire.endTransmission();
|
|
|
|
SetBrightness(15);
|
|
ClearRowBuffer();
|
|
TransmitRowBuffer();
|
|
};
|
|
|
|
void CHT16K33::SetBrightness(uint8_t b)
|
|
{
|
|
if (b > 15)
|
|
b = 15;
|
|
// Digital Dimming Data Input
|
|
Wire.beginTransmission(_addr);
|
|
Wire.write(0xE0 | b); // brightness
|
|
Wire.endTransmission();
|
|
};
|
|
|
|
void CHT16K33::TransmitRowBuffer(void)
|
|
{
|
|
// Display Memory
|
|
Wire.beginTransmission(_addr);
|
|
Wire.write(0); // start data at address 0
|
|
for (uint8_t i=0; i<8; i++)
|
|
{
|
|
Wire.write(_rowBuffer[i] & 0xFF);
|
|
Wire.write(_rowBuffer[i] >> 8);
|
|
}
|
|
Wire.endTransmission();
|
|
};
|
|
|
|
void CHT16K33::ClearRowBuffer(void)
|
|
{
|
|
for (uint8_t i=0; i<8; i++)
|
|
_rowBuffer[i] = 0;
|
|
};
|
|
|
|
void CHT16K33::SetRow(uint8_t com, uint16_t data)
|
|
{
|
|
if (com < 8)
|
|
_rowBuffer[com] = data;
|
|
};
|
|
|
|
uint16_t CHT16K33::GetRow(uint8_t com)
|
|
{
|
|
if (com < 8)
|
|
return _rowBuffer[com];
|
|
else
|
|
return 0;
|
|
};
|
|
|
|
void CHT16K33::SetDigit(uint8_t com, uint8_t c, bool setDot)
|
|
{
|
|
uint16_t value = 0;
|
|
|
|
if (c <= 0xF)
|
|
value = _digits[c];
|
|
|
|
switch (c)
|
|
{
|
|
case 'A':
|
|
case 'B':
|
|
case 'C':
|
|
case 'D':
|
|
case 'E':
|
|
case 'F':
|
|
case 'a':
|
|
case 'b':
|
|
case 'c':
|
|
case 'd':
|
|
case 'e':
|
|
case 'f':
|
|
value = c + 10 - 'A';
|
|
value = _digits[value & 0xF];
|
|
break;
|
|
case '0':
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9':
|
|
value = c - '0';
|
|
value = _digits[value & 0xF];
|
|
break;
|
|
case ' ':
|
|
value = 0;
|
|
break;
|
|
case ':':
|
|
value = 0x02; //special for China 4 x 7-seg big display
|
|
break;
|
|
case '-':
|
|
value = 0x40;
|
|
break;
|
|
}
|
|
if (setDot) {
|
|
value |= 0x80; // Set the dot-bit
|
|
}
|
|
|
|
SetRow(com, value);
|
|
}
|
|
|
|
uint8_t CHT16K33::ReadKeys(void)
|
|
{
|
|
// Display Memory
|
|
Wire.beginTransmission(_addr);
|
|
Wire.write(0x40); // start data at address 0x40
|
|
Wire.endTransmission();
|
|
|
|
Wire.requestFrom(_addr, (uint8_t)6);
|
|
if (Wire.available() == 6)
|
|
{
|
|
for (uint8_t i=0; i<3; i++)
|
|
{
|
|
_keyBuffer[i] = Wire.read() | (Wire.read() << 8);
|
|
}
|
|
// Not needed See: https://github.com/Koepel/How-to-use-the-Arduino-Wire-library/wiki/Common-mistakes#2
|
|
// Wire.endTransmission();
|
|
}
|
|
|
|
for (uint8_t i=0; i<3; i++)
|
|
{
|
|
uint8_t mask = 1;
|
|
for (uint8_t k=0; k<12; k++)
|
|
{
|
|
if (_keyBuffer[i] & mask)
|
|
{
|
|
_keydown = 16*(i+1) + (k+1);
|
|
return _keydown;
|
|
}
|
|
mask <<= 1;
|
|
}
|
|
}
|
|
_keydown = 0;
|
|
return _keydown;
|
|
};
|
|
|
|
const uint8_t CHT16K33::_digits[16] =
|
|
{
|
|
0x3F, // 0
|
|
0x06, // 1
|
|
0x5B, // 2
|
|
0x4F, // 3
|
|
0x66, // 4
|
|
0x6D, // 5
|
|
0x7D, // 6
|
|
0x07, // 7
|
|
0x7F, // 8
|
|
0x6F, // 9
|
|
0x77, // A
|
|
0x7C, // B
|
|
0x39, // C
|
|
0x5E, // D
|
|
0x79, // E
|
|
0x71, // F
|
|
};
|