1
0

Some more implementation of led matrix

This commit is contained in:
Kai Ryu 2014-01-14 16:12:21 +09:00
parent be407eb8d3
commit 2e30e38479
4 changed files with 77 additions and 7 deletions

View File

@ -69,6 +69,11 @@ ifdef KEYMAP_EX_ENABLE
OPT_DEFS += -DKEYMAP_EX_ENABLE
endif
ifdef LED_MATRIX_ENABLE
SRC += $(COMMON_DIR)/led_matrix.c
OPT_DEFS += -DLED_MATRIX_ENABLE
endif
# Version string
OPT_DEFS += -DVERSION=$(shell (git describe --always --dirty || echo 'unknown') 2> /dev/null)

View File

@ -62,6 +62,11 @@ void keyboard_init(void)
{
timer_init();
matrix_init();
#ifdef LED_MATRIX_ENABLE
led_matrix_init();
#endif
#ifdef PS2_MOUSE_ENABLE
ps2_mouse_init();
#endif

View File

@ -17,12 +17,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "led_matrix.h"
#define LED_MATRIX_TIMER_TOP F_CPU/(256*64)/LED_MATRIX_ROWS
static led_matrix_element_t led_matrix[LED_MATRIX_ROWS][LED_MATRIX_COLS];
void led_matrix_init(void)
{
led_matrix_unselect_rows();
led_matrix_write_cols(0);
/* Timer1 setup */
/* CTC mode */
TCCR1B |= (1<<WGM12);
@ -47,3 +52,40 @@ void led_matrix_disable(void)
/* Disable Compare Match Interrupt */
TIMSK1 &= ~_BV(OCIE1A);
}
inline
led_matrix_row_t led_matrix_make_cols(uint8_t row, uint8_t pwm)
{
led_matrix_row_t cols = 0;
for (uint8_t i = 0; i < LED_MATRIX_COLS; i++) {
cols |= ((led_matrix[row][i].value < pwm ? 1 : 0) << i);
}
return cols;
}
inline
void led_matrix_set_value(uint8_t row, uint8_t col, uint8_t value)
{
led_matrix[row][col].value = value;
}
inline
void led_matrix_set_delta(uint8_t row, uint8_t col, int8_t delta)
{
led_matrix[row][col].delta = delta;
}
ISR(TIMER1_COMPA_vect)
{
static uint8_t row = 0;
static uint8_t pwm = 0;
row = (row + 1) % LED_MATRIX_ROWS;
pwm++;
led_matrix_select_row(row);
_delay_us(10);
led_matrix_write_cols(led_matrix_make_cols(row, pwm));
_delay_us(10);
led_matrix_unselect_rows();
}

View File

@ -21,27 +21,45 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdint.h>
#include <stdbool.h>
#if (LED_MATRIX_COLS <= 8)
typedef uint8_t led_matrix_row_t;
#elif (LED_MATRIX_COLS <= 16)
typedef uint16_t led_matrix_row_t;
#elif (LED_MATRIX_COLS <= 32)
typedef uint32_t led_matrix_row_t;
#else
#error "LED_MATRIX_COLS: invalid value"
#endif
typedef struct {
union {
int8_t delta;
struct {
bool direction:1;
}
}
};
};
uint8_t value;
} led_matrix_element_t;
#ifdef LED_MATRIX_ENABLE
uint8_t led_matrix_rows(void);
uint8_t led_matrix_cols(void);
void led_matrix_init(void);
void led_matrix_enable(void);
void led_matrix_disable(void);
uint8_t led_matrix_scan(void);
void led_matrix_init_cols(void);
led_matrix_row_t led_matrix_make_cols(uint8_t row, uint8_t pwm);
void led_matrix_set_value(uint8_t row, uint8_t col, uint8_t value);
void led_matrix_set_delta(uint8_t row, uint8_t col, int8_t delta);
extern void led_matrix_write_cols(led_matrix_row_t cols);
extern void led_matrix_unselect_rows(void);
extern void led_matrix_select_row(uint8_t row);
#else
#define led_matrix_rows()
#define led_matrix_cols()
#define led_matrix_init()
#define led_matrix_enable()
#define led_matrix_disable()
#define led_matrix_init_cols()
#define led_matrix_write_cols()
#define led_matrix_unselect_rows()
#define led_matrix_select_row()
#endif
#endif