// // Created by kerya on 12.06.2022. // #include #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); }