177 lines
3.4 KiB
C++
177 lines
3.4 KiB
C++
//
|
|
// Created by kerya on 12.06.2022.
|
|
//
|
|
|
|
#include <util/delay.h>
|
|
#include "tm1637.h"
|
|
|
|
void TM1637::redraw() {
|
|
// Write COMM1
|
|
start();
|
|
send(TM1637_I2C_COMM1);
|
|
stop();
|
|
|
|
// Write COMM2 + first digit address
|
|
start();
|
|
send(TM1637_I2C_COMM2);
|
|
|
|
// Write the data bytes
|
|
for (uint8_t b: data) send(b);
|
|
|
|
//for (uint8_t i = 0; i < sizeof(data); i++) send(data[i]);
|
|
|
|
stop();
|
|
|
|
// Write COMM3 + brightness
|
|
start();
|
|
send(TM1637_I2C_COMM3 + (brightness & 0x0f));
|
|
stop();
|
|
}
|
|
|
|
TM1637::TM1637() {
|
|
clear();
|
|
brightness = 0;
|
|
|
|
TM1637_REGISTER &= ~(1 << TM1637_DIO); //set to IN
|
|
TM1637_REGISTER &= ~(1 << TM1637_CLK);
|
|
TM1637_PORT &= ~(1 << TM1637_CLK); //set states to LOW
|
|
TM1637_PORT &= ~(1 << TM1637_DIO);
|
|
}
|
|
|
|
void TM1637::start() {
|
|
TM1637_REGISTER |= (1 << TM1637_DIO);
|
|
delay();
|
|
}
|
|
|
|
void TM1637::stop() {
|
|
TM1637_REGISTER |= (1 << TM1637_DIO);
|
|
delay();
|
|
TM1637_REGISTER &= ~(1 << TM1637_CLK);
|
|
delay();
|
|
TM1637_REGISTER &= ~(1 << TM1637_DIO);
|
|
delay();
|
|
}
|
|
|
|
void TM1637::delay() {
|
|
_delay_us(100);
|
|
}
|
|
|
|
//Button = 0 = &
|
|
//OUTPUT = 1 = |
|
|
|
|
uint8_t TM1637::send(uint8_t d) {
|
|
for (uint8_t i = 0; i < 8; i++) {
|
|
TM1637_REGISTER |= (1 << TM1637_CLK);
|
|
delay();
|
|
if (d >> i & 0x1) {
|
|
TM1637_REGISTER &= ~(1 << TM1637_DIO);
|
|
} else {
|
|
TM1637_REGISTER |= (1 << TM1637_DIO);
|
|
}
|
|
delay();
|
|
TM1637_REGISTER &= ~(1 << TM1637_CLK);
|
|
delay();
|
|
}
|
|
|
|
TM1637_REGISTER |= (1 << TM1637_CLK);
|
|
TM1637_REGISTER &= ~(1 << TM1637_DIO);
|
|
delay();
|
|
TM1637_REGISTER &= ~(1 << TM1637_CLK);
|
|
delay();
|
|
uint8_t ack = TM1637_PIN & (1 << TM1637_DIO);
|
|
if (ack == 0) TM1637_REGISTER |= (1 << TM1637_DIO);
|
|
|
|
delay();
|
|
TM1637_REGISTER |= (1 << TM1637_CLK);
|
|
delay();
|
|
|
|
return ack;
|
|
}
|
|
|
|
void TM1637::enable() {
|
|
brightness = 0x0f;
|
|
redraw();
|
|
}
|
|
|
|
void TM1637::disable() {
|
|
clear();
|
|
brightness = 0;
|
|
redraw();
|
|
}
|
|
|
|
void TM1637::setSegment(uint8_t index, uint8_t d) {
|
|
if (index < sizeof(data)) {
|
|
data[index] = d;
|
|
}
|
|
}
|
|
//
|
|
// A
|
|
// ---
|
|
// F | | B
|
|
// -G-
|
|
// E | | C
|
|
// ---
|
|
// D
|
|
// XGFEDCBA
|
|
//0b01111111
|
|
//
|
|
|
|
|
|
uint8_t TM1637::encodeChar(char c) {
|
|
switch (c) {
|
|
case 'A':
|
|
return 0b01110111;
|
|
case 'C':
|
|
return 0b00111001;
|
|
case 'E':
|
|
return 0b01111001;
|
|
case 'L':
|
|
return 0b00111000;
|
|
case 'P':
|
|
return 0b01110011;
|
|
case 'T':
|
|
return 0b01111000;
|
|
case 'U':
|
|
return 0b00111110;
|
|
case 'H':
|
|
case 'K':
|
|
case 'X':
|
|
return 0b01110110;
|
|
case 'O':
|
|
case '0':
|
|
return 0b00111111;
|
|
case '1':
|
|
return 0b00000110;
|
|
case '2':
|
|
return 0b01011011;
|
|
case '3':
|
|
return 0b01001111;
|
|
case '4':
|
|
case 'Y':
|
|
return 0b01100110;
|
|
case '5':
|
|
return 0b01101101;
|
|
case '6':
|
|
return 0b01111101;
|
|
case '7':
|
|
return 0b00000111;
|
|
case '8':
|
|
return 0b01111111;
|
|
case '9':
|
|
return 0b01101111;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void TM1637::clear() {
|
|
for (uint8_t &i: data) i = 0;
|
|
}
|
|
|
|
uint8_t TM1637::encodeNumber(uint8_t n) {
|
|
if (n >= 10) return 0;
|
|
return encodeChar((char) 48 + n);
|
|
}
|
|
|
|
|