Étape 3: Charlieplexing dans le logiciel - mise en route
Tout d’abord, j’ai défini mes broches A à E et spécifié qui bit sur PORTB ils vont se référer à. Cela rend plus facile de se référer à la ligne A à E ultérieurement dans le code :
#define LINE_A 0 //Pin 5 (PB0) sur ATtiny85
#define LINE_B 1 //Pin 6 (PB1) sur ATtiny85
#define LINE_C 2 //Pin 7 (PB2) sur ATtiny85
#define LINE_D 3 //Pin 2 (PB3) sur ATtiny85
#define LINE_E 4 //Pin 3 (PB4) sur ATtiny85
Pour allumer l’un des 20 LEDs, nous devons configurer notre 5 tiges d’une manière différente pour chaque LED. Pour allumer une LED, nous avons besoin d’une broche sur une sortie avec une haute tension, une broche sur une sortie avec une tension de terre, et toutes les autres tiges doivent être définis aux entrées pour empêcher le flux actuel.
Pour le rendre plus simple, nous vais mettre en place des tableaux pour stocker toutes les configurations DDRB (qui définit les modes d’entrées/sorties de chaque aiguille) et PORTB (qui définit la haute/basse tension de chaque aiguille).
Config de direction DDRB pour chaque LED (1 = sortie)
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
};
PORT de sortie config pour chaque LED (1 = haut, 0 = faible)
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
};
Enfin, nous avons une fonction simple de faire ce travail, « light_led »
void light_led (char led_num) {//led_num doit être de 0 à 19
DDRB = led_dir [led_num] ;
PORTB = led_out [led_num] ;
}
void leds_off() {}
DDRB = 0 ;
PORTB = 0 ;
}
Par appel light_led avec un nombre de 0 à 19, nous pouvons allumer la LED souhaitée. De là, nous pouvons bâtir plus de complexité dans le logiciel pour stocker une grille de 4 x 5 et l’afficher dans les lumières.