#include #define F_CPU 8000000UL // 8 MHz #include #include #define SN74_SER (1 << PC6) #define SN74_RCLK (1 << PB5) #define SN74_SRCLK (1 << PE6) #define SEG_DIG1 (1 << PF6) #define SEG_DIG2 (1 << PF5) #define SEG_DIG3 (1 << PF4) #define SEG_DIG4 (1 << PF1) void init_3461BS() { DDRF |= SEG_DIG1 | SEG_DIG2 | SEG_DIG3 | SEG_DIG4; PORTF &= ~(SEG_DIG1 | SEG_DIG2 | SEG_DIG3 | SEG_DIG4); } void init_74HC595() { DDRC |= SN74_SER; DDRB |= SN74_RCLK; DDRE |= SN74_SRCLK; PORTB &= ~SN74_RCLK; PORTE &= ~SN74_SRCLK; } const uint8_t digit_segments[] = { 0b11111110, // 0 0b11001111, // 1 0b10010010, // 2 0b10000110, // 3 0b11001100, // 4 0b10100100, // 5 0b10100000, // 6 0b10001101, // 7 0b10000000, // 8 0b10000100, // 9 }; void send_serial_byte(uint8_t n) { for (int i = 7; i > 0; i--) { if (n & (1 << i)) { PORTC |= SN74_SER; } else { PORTC &= ~SN74_SER; } PORTE |= SN74_SRCLK; _delay_ms(100); PORTE &= ~SN74_SRCLK; PORTC &= ~SN74_SER; _delay_ms(100); } PORTB |= SN74_RCLK; _delay_ms(100); PORTB &= ~SN74_RCLK; } int main() { init_74HC595(); init_3461BS(); while (1) { for (int i = 0; i < 255; i++) { for(int j = 0; j < 100; j++) { PORTF |= SEG_DIG1; send_serial_byte(digit_segments[i / 1000]); _delay_ms(2); PORTF &= ~SEG_DIG1; PORTF |= SEG_DIG2; send_serial_byte(digit_segments[(i / 100) % 10]); _delay_ms(2); PORTF &= ~SEG_DIG2; PORTF |= SEG_DIG3; send_serial_byte(digit_segments[(i / 10) % 10]); _delay_ms(2); PORTF &= ~SEG_DIG3; PORTF |= SEG_DIG4; send_serial_byte(digit_segments[i % 10]); _delay_ms(2); PORTF &= ~SEG_DIG4; } } } }