aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/display.c41
-rw-r--r--src/display.h9
-rw-r--r--src/main.c66
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
diff --git a/src/main.c b/src/main.c
index c1dc647..fd4a091 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;
}