94 lines
2.0 KiB
C
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;
|
|
}
|
|
}
|
|
}
|
|
}
|