/* =============================================== Табло 8сег 5раз - мои изыскания 20250622 ... 20250625 v.3.10 AtTiny2313, 8MHz, Общий Анод - ОА A-PB7, B-PB6, C-PB5, D-PB4, E-PB3, F-PB2, G-P1, dp-PB0 0-PD2, 1-PD3, 2-PD4, 3-PD5, 4-PD6 = FUSES = Low - 0xFD; High - 0xDF; Ext - 0xFE ================================================== */ #include #include #include "pin.h" // ======================================= // ОПРЕДЕЛЯЕМ КОНСТАНТЫ: #define F_QUARTZ 8000000UL // частота кварца #define DIVIDER 64 // делитель таймера T2, задается в инициализации Т1 #define BAUD 9600UL // скорость UART // 8ми сегментный 5х разрядный индикатор: #define LEVEL 1 // (1) - ОА, (0) - ОК #define RAZR 5 // количество разрядов индикатора #define BRIGHT 0xFE // яркость свечения сегментов (больше значение - ярче) // ======================================= // Рабочие переменные: // Отображаемые на индикаторе символы: uint8_t seg[16] = { 0b11111100, // 0 0b01100000, // 1 0b11011010, // 2 0b11110010, // 3 0b01100110, // 4 0b10110110, // 5 0b10111110, // 6 0b11100000, // 7 0b11111110, // 8 0b11110110, // 9 0b00000000, // E - пусто 0b00000010, // F - минус 0b11000110, // G - градус 0b11001110, // H - P 0b00101110, // I - h 0b00111000 // J - v }; uint8_t dataIndic[RAZR] = {10, 10, 10, 10, 10}; // ячейки данных разрядов индикатора // ################################################################ // Инициализация прерываний: void init_interrupt() { // Инициализация USART: uint16_t ubrr = F_QUARTZ / 16 / BAUD - 1; UBRRH = (uint8_t)(ubrr >> 8); // старшие биты UBRR UBRRL = (uint8_t)ubrr; // младшие биты UBRR UCSRA |= (1 << RXC); // | (1 << TXC); UCSRB |= (1 << RXCIE) | (1 << RXEN); // | (1 << TXCIE) | (1 << TXEN); UCSRC |= (1 << UCSZ1) | (1 << UCSZ0); // асинхронный режим, // размер посылки 8 бит, проверка чётности отключена, 1 стоп-бит // Инициализация T0: TCCR0A = 0; //(1 << WGM11); // (1 << WGM10) | (1 << COM1A1) | (1 << COM1A0); // OC1A Отключен TCCR0B |= (1 << CS00) | (1 << CS01); // (1 << WGM12) | OCR0A = BRIGHT; TIMSK |= (1 << TOIE0) | (1 << OCIE0A); } //================================================================ // Включение сегментов: void segWork(uint8_t sTem) { uint8_t segments = seg[sTem]; (LEVEL) ? segments = segments : segments = ~segments; (segments & (1 << 7)) ? PORT_A |= (1 << SEG_A) : PORT_A &= ~(1 << SEG_A); (segments & (1 << 6)) ? PORT_B |= (1 << SEG_B) : PORT_B &= ~(1 << SEG_B); (segments & (1 << 5)) ? PORT_C |= (1 << SEG_C) : PORT_C &= ~(1 << SEG_C); (segments & (1 << 4)) ? PORT_D |= (1 << SEG_D) : PORT_D &= ~(1 << SEG_D); (segments & (1 << 3)) ? PORT_E |= (1 << SEG_E) : PORT_E &= ~(1 << SEG_E); (segments & (1 << 2)) ? PORT_F |= (1 << SEG_F) : PORT_F &= ~(1 << SEG_F); (segments & (1 << 1)) ? PORT_G |= (1 << SEG_G) : PORT_G &= ~(1 << SEG_G); (segments & (1 << 0)) ? PORT_H |= (1 << SEG_H) : PORT_H &= ~(1 << SEG_H); } //================================================================ // Гашение всех разрядов перед установкой сегментов: ISR(TIMER0_COMPA_vect) { (LEVEL) ? PORT_RAZ1 &= ~(1 << RAZ_1) : PORT_RAZ1 |= (1 << RAZ_1); (LEVEL) ? PORT_RAZ2 &= ~(1 << RAZ_2) : PORT_RAZ2 |= (1 << RAZ_2); (LEVEL) ? PORT_RAZ3 &= ~(1 << RAZ_3) : PORT_RAZ3 |= (1 << RAZ_3); (LEVEL) ? PORT_RAZ4 &= ~(1 << RAZ_4) : PORT_RAZ4 |= (1 << RAZ_4); (LEVEL) ? PORT_RAZ5 &= ~(1 << RAZ_5) : PORT_RAZ5 |= (1 << RAZ_5); } //================================================================ // Основная индикация: ISR(TIMER0_OVF_vect) { static uint8_t s = 0; switch (s) { case 0: (LEVEL) ? PORT_RAZ1 |= (1 << RAZ_1) : PORT_RAZ1 &= ~(1 << RAZ_1); segWork(dataIndic[0]); break; case 1: (LEVEL) ? PORT_RAZ2 |= (1 << RAZ_2) : PORT_RAZ2 &= ~(1 << RAZ_2); segWork(dataIndic[1]); break; case 2: (LEVEL) ? PORT_RAZ3 |= (1 << RAZ_3) : PORT_RAZ3 &= ~(1 << RAZ_3); segWork(dataIndic[2]); break; case 3: (LEVEL) ? PORT_RAZ4 |= (1 << RAZ_4) : PORT_RAZ4 &= ~(1 << RAZ_4); segWork(dataIndic[3]); break; case 4: (LEVEL) ? PORT_RAZ5 |= (1 << RAZ_5) : PORT_RAZ5 &= ~(1 << RAZ_5); segWork(dataIndic[4]); break; } (s == (RAZR - 1)) ? s = 0 : s++; // крутим активный разряд } //========================== ISR(USART_RX_vect) { static uint8_t count = 0; uint8_t b = UDR; if (b == 0x0D || b == 0x0A) { count = 0; } else { if (b >= '0' && b <= '9') { dataIndic[count] = b - '0'; } else if (b >= 'A' && b <= 'K') { dataIndic[count] = b - 59; } (count < RAZR) ? count++ : count = 0; } } //================================================================ // Запись данных в массив для отображения: // void visible(uint32_t vis) // { // dataIndic[4] = vis % 10; // dataIndic[3] = vis / 10 % 10; // dataIndic[2] = vis / 100 % 10; // dataIndic[1] = vis / 1000 % 10; // dataIndic[0] = vis / 10000; // } //=============================================================== int main(void) { // Инициализация: init_pin(); init_interrupt(); // Разрешаем прерывания: sei(); //--------------------------------------------------------- while (1) { } }