Enable software-based LED brightness configuration
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
#include "rtc.h"
|
#include "rtc.h"
|
||||||
#include "led.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)
|
void inc_hour(void)
|
||||||
{
|
{
|
||||||
@@ -24,10 +24,16 @@ void inc_second(void)
|
|||||||
rtc_set_time(SECOND, led_second);
|
rtc_set_time(SECOND, led_second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void inc_brightness(void)
|
||||||
|
{
|
||||||
|
led_brightness <<= 1;
|
||||||
|
if(!led_brightness) led_brightness = 1;
|
||||||
|
}
|
||||||
|
|
||||||
void keyboard_init(void)
|
void keyboard_init(void)
|
||||||
{
|
{
|
||||||
KEYBOARD_DIR &= ~(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;
|
PORTB |= KEY_INC_HOUR | KEY_INC_MINUTE | KEY_INC_SECOND | KEY_INC_BRIGHTNESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void keyboard_handle_input(void)
|
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_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_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_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);
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
#define KEY_INC_HOUR (1<<PB0)
|
#define KEY_INC_HOUR (1<<PB0)
|
||||||
#define KEY_INC_MINUTE (1<<PB1)
|
#define KEY_INC_MINUTE (1<<PB1)
|
||||||
#define KEY_INC_SECOND (1<<PB2)
|
#define KEY_INC_SECOND (1<<PB2)
|
||||||
|
#define KEY_INC_BRIGHTNESS (1<<PB3)
|
||||||
|
|
||||||
void keyboard_init(void);
|
void keyboard_init(void);
|
||||||
void keyboard_handle_input(void);
|
void keyboard_handle_input(void);
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include "led.h"
|
#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_hour;
|
||||||
volatile uint8_t led_minute;
|
volatile uint8_t led_minute;
|
||||||
volatile uint8_t led_second;
|
volatile uint8_t led_second;
|
||||||
@@ -12,66 +11,48 @@ void led_init(void)
|
|||||||
{
|
{
|
||||||
// Set outputs
|
// Set outputs
|
||||||
ANODES_DIR |= HOUR_ANODE | MINUTE_ANODE | SECOND_ANODE;
|
ANODES_DIR |= HOUR_ANODE | MINUTE_ANODE | SECOND_ANODE;
|
||||||
LED0_DIR |= LED0;
|
LED_DIR |= 0x3F; // 0b00111111
|
||||||
LED1_DIR |= LED1;
|
|
||||||
LED2_DIR |= LED2;
|
|
||||||
LED3_DIR |= LED3;
|
|
||||||
LED4_DIR |= LED4;
|
|
||||||
LED5_DIR |= LED5;
|
|
||||||
|
|
||||||
// Clear LEDs
|
// Clear LEDs
|
||||||
ANODES_PORT = HOUR_ANODE | MINUTE_ANODE | SECOND_ANODE;
|
ANODES_PORT = HOUR_ANODE | MINUTE_ANODE | SECOND_ANODE;
|
||||||
LED0_PORT |= LED0;
|
LED_PORT |= 0x3F; // 0b00111111
|
||||||
LED1_PORT |= LED1;
|
|
||||||
LED2_PORT |= LED2;
|
|
||||||
LED3_PORT |= LED3;
|
|
||||||
LED4_PORT |= LED4;
|
|
||||||
LED5_PORT |= LED5;
|
|
||||||
|
|
||||||
TCCR0 |= (1<<WGM01); // CTC Mode
|
TCCR0 |= (1<<CS00);
|
||||||
TCCR0 |= (1<<CS02) | (1<<CS00); // Prescaler 1024
|
TIMSK |= (1<<TOIE0);
|
||||||
OCR0 = 38; // 200Hz
|
|
||||||
TIMSK |= (1<<OCIE0); // Enable CTC interruptions
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ISR(TIMER0_COMP_vect)
|
// ISR(TIMER0_COMP_vect)
|
||||||
|
ISR(TIMER0_OVF_vect)
|
||||||
{
|
{
|
||||||
static uint8_t counter = 1;
|
static uint8_t pwm_counter = 0;
|
||||||
|
static uint8_t counter = 0;
|
||||||
|
static uint8_t curr_anode = 1;
|
||||||
|
|
||||||
switch(counter) {
|
switch(curr_anode)
|
||||||
case 1:
|
{
|
||||||
ANODES_PORT = ~HOUR_ANODE;
|
case 1:
|
||||||
SET_LED(LED0_PORT, 0, led_hour);
|
LED_PORT = ~led_hour;
|
||||||
SET_LED(LED1_PORT, 1, led_hour);
|
ANODES_PORT = led_brightness >= pwm_counter ? ~HOUR_ANODE : 0xFF;
|
||||||
SET_LED(LED2_PORT, 2, led_hour);
|
break;
|
||||||
SET_LED(LED3_PORT, 3, led_hour);
|
case 2:
|
||||||
SET_LED(LED4_PORT, 4, led_hour);
|
LED_PORT = ~led_minute;
|
||||||
SET_LED(LED5_PORT, 5, led_hour);
|
ANODES_PORT = led_brightness >= pwm_counter ? ~MINUTE_ANODE : 0xFF;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 4:
|
||||||
ANODES_PORT = ~MINUTE_ANODE;
|
LED_PORT = ~led_second;
|
||||||
SET_LED(LED0_PORT, 0, led_minute);
|
ANODES_PORT = led_brightness >= pwm_counter ? ~SECOND_ANODE : 0xFF;
|
||||||
SET_LED(LED1_PORT, 1, led_minute);
|
break;
|
||||||
SET_LED(LED2_PORT, 2, led_minute);
|
}
|
||||||
SET_LED(LED3_PORT, 3, led_minute);
|
|
||||||
SET_LED(LED4_PORT, 4, led_minute);
|
if(!counter)
|
||||||
SET_LED(LED5_PORT, 5, led_minute);
|
{
|
||||||
break;
|
curr_anode <<= 1;
|
||||||
case 4:
|
|
||||||
ANODES_PORT = ~SECOND_ANODE;
|
if(curr_anode > 4) curr_anode = 1;
|
||||||
SET_LED(LED0_PORT, 0, led_second);
|
|
||||||
SET_LED(LED1_PORT, 1, led_second);
|
counter = 250;
|
||||||
SET_LED(LED2_PORT, 2, led_second);
|
|
||||||
SET_LED(LED3_PORT, 3, led_second);
|
|
||||||
SET_LED(LED4_PORT, 4, led_second);
|
|
||||||
SET_LED(LED5_PORT, 5, led_second);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
counter <<= 1;
|
--counter;
|
||||||
|
++pwm_counter;
|
||||||
if(counter > 4)
|
|
||||||
{
|
|
||||||
counter = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,24 +1,8 @@
|
|||||||
#ifndef __LED_H__
|
#ifndef __LED_H__
|
||||||
#define __LED_H__
|
#define __LED_H__
|
||||||
|
|
||||||
#define LED0_PORT PORTA
|
#define LED_PORT PORTA
|
||||||
#define LED0_DIR DDRA
|
#define LED_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 ANODES_PORT PORTD
|
#define ANODES_PORT PORTD
|
||||||
#define ANODES_DIR DDRD
|
#define ANODES_DIR DDRD
|
||||||
@@ -26,6 +10,7 @@
|
|||||||
#define MINUTE_ANODE (1<<PD6)
|
#define MINUTE_ANODE (1<<PD6)
|
||||||
#define SECOND_ANODE (1<<PD7)
|
#define SECOND_ANODE (1<<PD7)
|
||||||
|
|
||||||
|
extern volatile uint8_t led_brightness;
|
||||||
extern volatile uint8_t led_hour;
|
extern volatile uint8_t led_hour;
|
||||||
extern volatile uint8_t led_minute;
|
extern volatile uint8_t led_minute;
|
||||||
extern volatile uint8_t led_second;
|
extern volatile uint8_t led_second;
|
||||||
|
|||||||
Reference in New Issue
Block a user