arduino/main.c
2025-10-13 12:34:02 +02:00

94 lines
2.0 KiB
C

#include <stdint.h>
#define F_CPU 8000000UL // 8 MHz
#include <util/delay.h>
#include <avr/io.h>
#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;
}
}
}
}