diff --git a/firmware/keyboard.c b/firmware/keyboard.c index 440c6cf..41fee8a 100644 --- a/firmware/keyboard.c +++ b/firmware/keyboard.c @@ -4,7 +4,7 @@ #include "rtc.h" #include "led.h" -uint8_t k_inc_hour, k_inc_minute, k_inc_second; +uint8_t k_inc_hour, k_inc_minute, k_inc_second, k_inc_brightness; void inc_hour(void) { @@ -24,10 +24,16 @@ void inc_second(void) rtc_set_time(SECOND, led_second); } +void inc_brightness(void) +{ + led_brightness <<= 1; + if(!led_brightness) led_brightness = 1; +} + void keyboard_init(void) { - KEYBOARD_DIR &= ~(KEY_INC_HOUR | KEY_INC_MINUTE | KEY_INC_SECOND); - PORTB |= KEY_INC_HOUR | KEY_INC_MINUTE | KEY_INC_SECOND; + KEYBOARD_DIR &= ~(KEY_INC_HOUR | KEY_INC_MINUTE | KEY_INC_SECOND | KEY_INC_BRIGHTNESS); + PORTB |= KEY_INC_HOUR | KEY_INC_MINUTE | KEY_INC_SECOND | KEY_INC_BRIGHTNESS; } void keyboard_handle_input(void) @@ -35,4 +41,5 @@ void keyboard_handle_input(void) SuperDebounce(&k_inc_hour, &KEYBOARD_PIN, KEY_INC_HOUR, 20, 500, &inc_hour, &inc_hour); SuperDebounce(&k_inc_minute, &KEYBOARD_PIN, KEY_INC_MINUTE, 20, 500, &inc_minute, &inc_minute); SuperDebounce(&k_inc_second, &KEYBOARD_PIN, KEY_INC_SECOND, 20, 500, &inc_second, &inc_second); + SuperDebounce(&k_inc_brightness, &KEYBOARD_PIN, KEY_INC_BRIGHTNESS, 20, 500, &inc_brightness, &inc_brightness); } \ No newline at end of file diff --git a/firmware/keyboard.h b/firmware/keyboard.h index ffb139e..8d351c7 100644 --- a/firmware/keyboard.h +++ b/firmware/keyboard.h @@ -7,6 +7,7 @@ #define KEY_INC_HOUR (1< #include "led.h" -#define SET_LED(PORT, IDX, NUM) PORT = ((PORT & ~(1<<(IDX))) | (~(NUM) & 1<<(IDX))) - +volatile uint8_t led_brightness = 1; volatile uint8_t led_hour; volatile uint8_t led_minute; volatile uint8_t led_second; @@ -12,66 +11,48 @@ void led_init(void) { // Set outputs ANODES_DIR |= HOUR_ANODE | MINUTE_ANODE | SECOND_ANODE; - LED0_DIR |= LED0; - LED1_DIR |= LED1; - LED2_DIR |= LED2; - LED3_DIR |= LED3; - LED4_DIR |= LED4; - LED5_DIR |= LED5; + LED_DIR |= 0x3F; // 0b00111111 // Clear LEDs ANODES_PORT = HOUR_ANODE | MINUTE_ANODE | SECOND_ANODE; - LED0_PORT |= LED0; - LED1_PORT |= LED1; - LED2_PORT |= LED2; - LED3_PORT |= LED3; - LED4_PORT |= LED4; - LED5_PORT |= LED5; + LED_PORT |= 0x3F; // 0b00111111 - TCCR0 |= (1<= pwm_counter ? ~HOUR_ANODE : 0xFF; + break; + case 2: + LED_PORT = ~led_minute; + ANODES_PORT = led_brightness >= pwm_counter ? ~MINUTE_ANODE : 0xFF; + break; + case 4: + LED_PORT = ~led_second; + ANODES_PORT = led_brightness >= pwm_counter ? ~SECOND_ANODE : 0xFF; + break; + } + + if(!counter) + { + curr_anode <<= 1; + + if(curr_anode > 4) curr_anode = 1; + + counter = 250; } - counter <<= 1; - - if(counter > 4) - { - counter = 1; - } + --counter; + ++pwm_counter; } \ No newline at end of file diff --git a/firmware/led.h b/firmware/led.h index 7fbeb3b..9981c43 100644 --- a/firmware/led.h +++ b/firmware/led.h @@ -1,24 +1,8 @@ #ifndef __LED_H__ #define __LED_H__ -#define LED0_PORT PORTA -#define LED0_DIR DDRA -#define LED0 (1<<0) -#define LED1_PORT PORTA -#define LED1_DIR DDRA -#define LED1 (1<<1) -#define LED2_PORT PORTA -#define LED2_DIR DDRA -#define LED2 (1<<2) -#define LED3_PORT PORTA -#define LED3_DIR DDRA -#define LED3 (1<<3) -#define LED4_PORT PORTA -#define LED4_DIR DDRA -#define LED4 (1<<4) -#define LED5_PORT PORTA -#define LED5_DIR DDRA -#define LED5 (1<<5) +#define LED_PORT PORTA +#define LED_DIR DDRA #define ANODES_PORT PORTD #define ANODES_DIR DDRD @@ -26,6 +10,7 @@ #define MINUTE_ANODE (1<