diff options
| author | Akshay Nair <phenax5@gmail.com> | 2026-02-04 11:04:04 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2026-02-04 12:55:37 +0530 |
| commit | cc9d915435a61d71f11cffa264cf941de58fe444 (patch) | |
| tree | dc190a76b952e26942c298745f5321c5fb0d95ac /src | |
| parent | f0423ae9af947512f5200da1ffd3c5adf81d5d7f (diff) | |
| download | daft-watch-cc9d915435a61d71f11cffa264cf941de58fe444.tar.gz daft-watch-cc9d915435a61d71f11cffa264cf941de58fe444.zip | |
Switch from internal clock to crystal + button
Diffstat (limited to 'src')
| -rw-r--r-- | src/display.c | 41 | ||||
| -rw-r--r-- | src/display.h | 9 | ||||
| -rw-r--r-- | src/main.c | 66 |
3 files changed, 80 insertions, 36 deletions
diff --git a/src/display.c b/src/display.c new file mode 100644 index 0000000..5f2d7f3 --- /dev/null +++ b/src/display.c @@ -0,0 +1,41 @@ +#include <avr/io.h> +#include <stdint.h> +#include <util/delay.h> + +#include "display.h" + +// "_gfedcba" +// Reversed because a-g is mapped to pa0-6. (pa7 is decimal) +// Complemented because display is common anode +const uint32_t digit_masks[] = { + 0b01000000, 0b01111001, 0b00100100, 0b00110000, 0b00011001, + 0b00010010, 0b00000010, 0b01111000, 0b00000000, 0b00010000, +}; + +void write_digit(uint8_t digit) { + if (digit > 9 || digit < 0) + return; + PORTA = digit_masks[digit]; +} + +void write_time(uint16_t hour, uint16_t minute) { + uint8_t minute_digit1 = minute % 10; + uint8_t minute_digit2 = minute / 10; + // unsigned short hour_digit1 = hour % 10; + // unsigned short hour_digit2 = hour / 10; + +#ifdef STUBBED + printf("\r:: %d %d", minute_digit2, minute_digit1); + fflush(stdout); +#endif + + write_digit(minute_digit1); + PORTA |= (1 << PA7); + _delay_ms(10); + PORTA &= ~(1 << PA7); + + write_digit(minute_digit2); + PORTB |= (1 << PB2); + _delay_ms(10); + PORTB &= ~(1 << PB2); +} diff --git a/src/display.h b/src/display.h new file mode 100644 index 0000000..a2bbc79 --- /dev/null +++ b/src/display.h @@ -0,0 +1,9 @@ +#ifndef _LOADED_DISPLAY +#define _LOADED_DISPLAY +#include <stdint.h> + +void write_digit(uint8_t digit); + +void write_time(uint16_t hour, uint16_t minute); + +#endif @@ -1,51 +1,45 @@ #include <avr/io.h> +#include <avr/fuse.h> #include <stdint.h> #include <util/delay.h> -// a b c d e f g decimal -// Reversed because a-g is mapped to pa0-6. (pa7 is decimal) -// Complemented because display is common anode -const uint32_t digits[] = { - 0b01000000, 0b01111001, 0b00100100, 0b00110000, 0b00011001, - 0b00010010, 0b00000010, 0b01111000, 0b00000000, 0b00010000, +#include "display.h" + +// Config for attiny84a + 32KHz crystal osc taken from https://github.com/ingepnet/breadboardwatch/blob/master/Makefile#L26 +FUSES = { + .low = 0xe6, + .high = 0xd7, + .extended = 0xff, }; -void write_digit(uint8_t digit) { - if (digit > 9 || digit < 0) - return; - PORTA = digits[digit]; +void setup_output(void) { + DDRA |= 0b11111111; + DDRB |= 0b11111111; } -void write_time(uint16_t hour, uint16_t minute) { - uint8_t minute_digit1 = minute % 10; - uint8_t minute_digit2 = minute / 10; - // unsigned short hour_digit1 = hour % 10; - // unsigned short hour_digit2 = hour / 10; +int main(void) { + uint32_t count = 0; + uint8_t is_button_on = 0; -#ifdef STUBBED - printf("\r:: %d %d", minute_digit2, minute_digit1); - fflush(stdout); -#endif + while (1) { + DDRB &= ~(1 << PB2); + is_button_on = (PINB & (1 << PB2)) > 0; - write_digit(minute_digit1); - PORTA |= (1 << PA7); - _delay_ms(10); - PORTA &= ~(1 << PA7); + if (is_button_on) { + _delay_ms(30); + is_button_on = (PINB & (1 << PB2)) > 0; + if (is_button_on) { + setup_output(); + PORTA |= 0b10000000; + _delay_ms(500); + continue; + } + } - write_digit(minute_digit2); - PORTB |= (1 << PB2); - _delay_ms(10); - PORTB &= ~(1 << PB2); -} + setup_output(); + write_time(0, (count / 20) % 60); -int main(void) { - DDRA |= 0b11111111; - DDRB |= (1 << PB2); - - uint32_t i = 0; - while (1) { - write_time(0, (i / 20) % 60); - i = (i + 1) % 100000; + count = (count + 1) % 100000; } return 0; } |
