Skapa ett charlieplexed LED rutnät att köra på ATTiny85 (3 / 5 steg)
Steg 3: Charlieplexing i programvara - komma igång
Först har jag definierat min pins A till E och anges som lite på PORTB de kommer att hänvisa till. Detta gör det lättare att hänvisa till linje A till E senare i koden:
#define LINE_A 0 //Pin 5 (PB0) på ATtiny85
#define LINE_B 1 //Pin 6 (PB1) på ATtiny85
#define LINE_C 2 //Pin 7 (PB2) på ATtiny85
#define LINE_D 3 //Pin 2 (PB3) på ATtiny85
#define LINE_E 4 //Pin 3 (PB4) på ATtiny85
För att att tända en av 20 lysdioder, behöver vi konfigurera våra 5 stift ett annat sätt för varje LED. För ljus en LED, vi behöver en PIN-kod anges till en utgång med en hög spänning, en PIN-kod anges till en utgång med en spänning på marken, och alla andra stift måste sättas till ingångar för att förhindra strömflödet.
För att göra det enklare, ska vi ställa in vissa matriser att lagra alla konfigurationer för DDRB (som anger indata/utdata lägen för varje stift) och PORTB (som anger hög/låg spänning varje stift).
DDRB riktning config för varje LED (1 = utgång)
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 utgång config för varje LED (1 = hög, 0 = låg)
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
};
Slutligen har vi en enkel funktion för att göra detta arbete, "light_led"
void light_led (char led_num) {//led_num måste vara från 0 till 19
DDRB = led_dir [led_num];
PORTB = led_out [led_num];
}
void leds_off() {
DDRB = 0;
PORTB = 0;
}
Genom att anropa light_led med ett antal 0 till 19, kan vi lätt önskad LED. Härifrån kan vi bygga mer komplexitet i programvaran att lagra ett 4 x 5 rutnät och Visa den i ljus.