This repository has been archived on 2025-01-09. You can view files and clone it, but cannot push or open issues or pull requests.
pig-feeder/lib/tm1637/tm1637.cpp

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);
}