Paso 3: Charlieplexing en Software - introducción
En primer lugar, he definido mis pins A la E y especificó que la broca en PORTB se estará refiriendo al. Esto hace más fácil para referirse a la línea A hasta E más adelante en el código:
#define LINE_A 0 //Pin 5 (PB0) en ATtiny85
#define LINE_B 1 //Pin 6 (PB1) en ATtiny85
#define LINE_C 2 //Pin 7 (PB2) en ATtiny85
#define LINE_D 3 //Pin 2 (PB3) en ATtiny85
#define LINE_E 4 //Pin 3 (PB4) en ATtiny85
Con el fin de la luz de los 20 LEDs, necesitamos configurar nuestro 5 pernos de una manera diferente para cada LED. Para encender un LED, necesitamos un perno en una salida con una tensión alta, uno de los pines en una salida con una tensión de tierra, y todas las clavijas para ajustarse a las entradas para evitar el flujo de corriente.
Para hacerlo más simple, a establecer algunas matrices para almacenar todas las configuraciones para DDRB (que establece los modos de entrada y salida de cada pin) y el PORTB (que fija el voltaje alto o bajo de cada pin).
DDRB dirección config para cada LED (1 = salida)
const char led_dir [20] = {}
(1 << LINE_A | 1 << LINE_E), //LED 0
(1 << LINE_B | 1 << LINE_E), //LED 1
(1 << LINE_C | 1 << LINE_E), //LED 2
(1 << LINE_D | 1 << LINE_E), //LED 3
(1 << LINE_E | 1 << LINE_D), //LED 4
(1 << LINE_A | 1 << LINE_D), //LED 5
(1 << LINE_B | 1 << LINE_D), //LED 6
(1 << LINE_C | 1 << LINE_D), //LED 7
(1 << LINE_D | 1 << LINE_C), //LED 8
(1 << LINE_E | 1 << LINE_C), //LED 9
(1 << LINE_A | 1 << LINE_C), //LED 10
(1 << LINE_B | 1 << LINE_C), //LED 11
(1 << LINE_C | 1 << LINE_B), //LED 12
(1 << LINE_D | 1 << LINE_B), //LED 13
(1 << LINE_E | 1 << LINE_B), //LED 14
(1 << LINE_A | 1 << LINE_B), //LED 15
(1 << LINE_B | 1 << LINE_A), //LED 16
(1 << LINE_C | 1 << LINE_A), //LED 17
(1 << LINE_D | 1 << LINE_A), //LED 18
(1 << LINE_E | 1 << LINE_A) //LED 19
};
PORTB salida config para cada LED (1 = alto, 0 = bajo)
const char led_out [20] = {}
(1 << LINE_A), //LED 0
(1 << LINE_B), //LED 1
(1 << LINE_C), //LED 2
(1 << LINE_D), //LED 3
(1 << LINE_E), //LED 4
(1 << LINE_A), //LED 5
(1 << LINE_B), //LED 6
(1 << LINE_C), //LED 7
(1 << LINE_D), //LED 8
(1 << LINE_E), //LED 9
(1 << LINE_A), //LED 10
(1 << LINE_B), //LED 11
(1 << LINE_C), //LED 12
(1 << LINE_D), //LED 13
(1 << LINE_E), //LED 14
(1 << LINE_A), //LED 15
(1 << LINE_B), //LED 16
(1 << LINE_C), //LED 17
(1 << LINE_D), //LED 18
(1 << LINE_E) //LED 19
};
Por último, tenemos una función simple para hacer este trabajo, "light_led"
void light_led (char led_num) {//led_num debe ser de 0 a 19
DDRB = led_dir [led_num];
PORTB = led_out [led_num];
}
void leds_off() {}
DDRB = 0;
PORTB = 0;
}
Por light_led llamadas con un número del 0 al 19, podemos luz LED deseado. Desde aquí podemos construir más complejidad en el software para almacenar una cuadrícula de 4 x 5 y visualizar en las luces.