From b1173ebc9e77b49c73dbd633592d7d92b92276da Mon Sep 17 00:00:00 2001 From: victor Date: Mon, 13 Oct 2025 12:34:02 +0200 Subject: [PATCH] bless --- .clangd | 8 +++++ Makefile | 16 ++++++++++ main.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.elf | Bin 0 -> 15788 bytes main.hex | 44 ++++++++++++++++++++++++++ 5 files changed, 161 insertions(+) create mode 100644 .clangd create mode 100644 Makefile create mode 100644 main.c create mode 100755 main.elf create mode 100644 main.hex diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..704032d --- /dev/null +++ b/.clangd @@ -0,0 +1,8 @@ +CompileFlags: + Add: + - -I/usr/avr/include + - -mmcu=atmega32u4 + - -DF_CPU=8000000UL + - --target=avr + Remove: + - -m* diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cf0ccae --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +BOARD = adafruit:avr:leonardo +PORT = /dev/ttyACM0 + +SRC := main.c + +CC = avr-gcc + +INCLUDE := /usr/avr +CFLAGS := -mmcu=atmega32u4 -DF_CPU=8000000UL -I$(INCLUDE) + +all: + $(CC) $(CFLAGS) -Os $(SRC) -o main.elf + avr-objcopy -O ihex main.elf main.hex + +upload: all + sudo avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U flash:w:main.hex diff --git a/main.c b/main.c new file mode 100644 index 0000000..ada2fc6 --- /dev/null +++ b/main.c @@ -0,0 +1,93 @@ +#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; + } + } + } +} diff --git a/main.elf b/main.elf new file mode 100755 index 0000000000000000000000000000000000000000..5e189f4da3ca808e4268597d0e5ad0e2821d6117 GIT binary patch literal 15788 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 XchN=1qi0fNzaSn6S*JUp)cyVknbKg6 literal 0 HcmV?d00001 diff --git a/main.hex b/main.hex new file mode 100644 index 0000000..36624b1 --- /dev/null +++ b/main.hex @@ -0,0 +1,44 @@ +:100000000C9456000C946B000C946B000C946B00D9 +:100010000C946B000C946B000C946B000C946B00B4 +:100020000C946B000C946B000C946B000C946B00A4 +:100030000C946B000C946B000C946B000C946B0094 +:100040000C946B000C946B000C946B000C946B0084 +:100050000C946B000C946B000C946B000C946B0074 +:100060000C946B000C946B000C946B000C946B0064 +:100070000C946B000C946B000C946B000C946B0054 +:100080000C946B000C946B000C946B000C946B0044 +:100090000C946B000C946B000C946B000C946B0034 +:1000A0000C946B000C946B000C946B0011241FBE1D +:1000B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4E9D0 +:1000C000F2E002C005900D92AA30B107D9F70E9464 +:1000D000AD000C9448010C94000080B3826780BB93 +:1000E00081B38D7881BB08953E9A259A6E9A2D989A +:1000F0007698089527E030E090E0AC01022E02C02F +:10010000559547950A94E2F740FF25C0469A769A9E +:100110004FEF50E762E0415050406040E1F700C0CF +:100120000000769846984FEF50E762E0415050400B +:100130006040E1F700C0000021503040F1F62D9AF8 +:100140008FEF90E722E0815090402040E1F700C01F +:1001500000002D9808954698DACFCDB7DEB72897DE +:100160000FB6F894DEBF0FBECDBF0E9474000E9490 +:100170006D000AE010E01F8218868F81988564E682 +:1001800070E00E942001FB018F819885B8010E94D8 +:1001900020019C01CB01B8010E94200144E6E42E1D +:1001A000F12CAF0140505F4F49835A83FC01E0506E +:1001B000FF4FEB83FC83A90140505F4F4D835E836B +:1001C0008E9A8EEF0E947A008FE99FE00197F1F7F7 +:1001D00000C000008E988D9AE981FA8180810E948A +:1001E0007A008FE99FE00197F1F700C000008D9839 +:1001F0008C9AEB81FC8180810E947A008FE99FE0DC +:100200000197F1F700C000008C98899AED81FE817A +:1002100080810E947A008FE99FE00197F1F700C08A +:100220000000899891E0E91AF10851F6EF81F8850C +:100230003196EF83F887EF3FF10509F09ECF9BCF12 +:1002400097FB072E16F4009407D077FD09D00E9483 +:10025000340107FC05D03EF4909581959F4F089599 +:10026000709561957F4F0895AA1BBB1B51E107C094 +:10027000AA1FBB1FA617B70710F0A61BB70B881F36 +:10028000991F5A95A9F780959095BC01CD010895C5 +:04029000F894FFCF10 +:0A029400FECF9286CCA4A08D8084DA +:00000001FF