TM1638 BOARD con ARDUINO 8-Bit LED 8-Bit Digital 8-Bit Key TM1638. Ci sono solo tre linee di controllo.c'è una libreria e la scheda ha solo 3 pin di controllo, più alimentazione e la terra. I pin di controllo sono: strobo, clock e dati. I pin strobo e di clock sono solo uscita, mentre il pin dati può essere sia uscita che ingresso. Il piedino strobo viene utilizzato quando si inviano i dati alla scheda - si imposta il pin strobo basso prima di inviare i dati - Uno o più byte - e quindi impostare il pin strobo alto. Si noti che esiste un solo piedino dati il che significa che i dati vengono inviati 1 bit alla volta. Qui è dove il pin di clock entra in gioco. c'e da notare che c'è solo un pin dati quindi la trasmissione avviene in modo seriale qui è quando entra in funzione il pin di clock quando si inviano i dati si imposta il pin di clock a livello basso dopodichè si setta il pin dati e il pin del clock di nuovo a livello alto per far commutare il valore del bit avrai probabilmente già familiarità con questi modelli ( se così non è dai uno sguardo a questo documento) questo è il modo standard per inviare dati tramite lo shift register e quindi possiamo usare solo la funzione standard shiftout function per inviare 8 bit con una sola riga di codice i dati che vengono inviati alla scheda seguono un protocollo per il quale il primo byte dice alla scheda cosa noi vogliamo fare ed'è detto "command" è seguito da uno ZERO o altri byte che sono l'argomento della funzione selezionata. gli argomenti sono inviati separatamente i pin di strobe devono essere settati alti dopo il comando di invio e bassi quando i dati sono stati inviati la scheda ha 4 funzioni: attivare/disattivare la scheda e inizializzare il display scrivere un byte in un indirizzo specifico leggere i pulsanti per attivare la scheda e la luminosità del display usiamo il comando 1000abbb (0x8?) dove i bit contrassegnati con "a" servono per attivare/disattivare la scheda e i bit contrassegnati con "bbb" servono per impostare la luminosità del display. Per esempio per attivare la scheda e impostare la luminosità del display al valore massimo abbiamo bisogno di inviare 0x8f. Questa funzione non ha nessun argomento. per scrivere un byte in un indirizzo specifico dobbiamo inviare il comando 010000100 (0x44) seguito dall'indirizzo nella forma 1100aaaa ( aaaa sono i bit che indicano dove noi vogliamo scrivere ) seguiti dal valore ad esempio per scrivere il valore 0x45 all'indirizzo 0x0a dobbiamo inviare anche la sequenza di bytes: 0x44 0xca 0x45 se vogliamo scrivere i valori in indirizzi consecutivi ( molto utile per resettare la scheda ) noi dovremmo inviare 01000000 (0x40) seguito dall'indirizzo iniziale (ancora nella forma 1100aaaa) seguita dal valore che si vuole scrivere. Istantaneamente se noi inviamo 0x40 0xc0 0x00 0x01 0x02 0 verrebbe scritto nell indirizzo 0, 1 verrebbe scritto nell indirizzo 1 e 2 nell indirizzo 2. Da notare che noi abbiamo 4 bit per selezionare l ndirizzo, ciò significa che ci
sono 16 locazioni nelle quali possono essere scritti. Se tu continuassi a scrivere anche dopo aver raggiunto l indirizzo 0x0f, esso verrebbe perso e tu ripartiresti a scrivere dall indirizzo 0x00. Per leggere i bottoni noi inviamo il comando 010000010 (0x42), setti il pin data come INPUT e leggi 4 byte contenenti lo stato dei bottoni. COMANDI ARGOMENTI DESCRIZIONE 0X8? (1000abbb) nulla Attiva la basetta ( bit a), setta luminosità (bits b) 0x44 (10000100) 0xc? 0x?? Scrivi il valore 0x?? Alla locazione 0xc? (modalità singolo indirizzo ) 0x40 (10000000) 0xc? 0x?? 0x?? 0x?? Scrivi i valori 0x?? Partendo dalla locazione 0xc? (modalità auto-incrementazione indirizzo) 0x42 (10000010) N/A Legge i bottoni Adesso sappiamo che possiamo scrivere i valori a una delle 16 locazioni. Questo è il modo con cui accendiamo i LED e controlliamo i display. La basetta ha due 4 display a 7 segmenti digitali ed 8 LED. Ognuno di essi ha un indirizzo dedicato nel quale il valore necessita di essere scritto per controllare l oggetto corrispondente. Istantaneamente se accendiamo il primo led andremmo a scrivere 1 all indirizzo 0x01. Sotto abbiamo una lista di locazioni con brevi spiegazioni. Indirizzo Descrizione 0x00 (0000) Display #1 0x01 (0001) LED#1 00000001 -rosso, 00000010- verde 0x02 (0010) Display #2 0x03 (0011) LED#2 00000001 -rosso, 00000010- verde 0x04 (0100) Display #3 0x05 (0101) LED#3 00000001 -rosso, 00000010- verde 0x06 (0110) Display #4 0x07 (0111) LED#4 00000001 -rosso, 00000010- verde 0x08 (1000) Display #5 0x09 (1001) LED#5 00000001 -rosso, 00000010- verde 0x0a (1010) Display #6 0x0b (1011) LED#6 00000001 -rosso, 00000010- verde
0x0c (1100) Display #7 0x0d (1101) LED#7 00000001 -rosso, 00000010- verde 0x0e (1110) Display #8 0x0f (1111) LED#8 00000001 -rosso, 00000010- verde TM1638 alla basetta di arduino. >> >> >> Arduino TM1638 basetta 3.3V --------------VCC GND ------------- GND PIN#7 ----------- STB PIN#8 ----------- DIO PIN #9 ---------- CLK La funzione setup necessita di attivare e resettare la basetta. Per la leggibilità ho creato una funzione che ti aiuta maggiormente per spedire i comandi e una funzione separata per il setup. Qui c è come il codice per il setup della basetta deve essere: 1const int strobe = 7; 2const int clock = 9; 3const int data = 8; 4 5void sendcommand(uint8_t value) 6{ 7 8 9 shiftout(data, clock, LSBFIRST, value); 10} 11 12void reset() 13{ 14 15 sendcommand(0x40); // setta la modalità ad auto-incremento 16 shiftout(data, clock, LSBFIRST, 0xc0); // setta l indirizzo di partenza a zero 17 18 19 20 21 for(uint8_t i = 0; i < 16; i++) { shiftout(data, clock, LSBFIRST, 0x00); } 22} 23 24void setup() 25{ 26 27 28 pinmode(strobe, OUTPUT); pinmode(clock, OUTPUT); pinmode(data, OUTPUT); 29 30 sendcommand(0x8f); // attiva e setta la luminosità al massimo 31 reset(); 32} Prima noi settiamo i pin 7,8,9, come output.
Dopo attiviamo la basetta e settiamo la luminosità al massimo valore inviando 0x8f. Infine resettiamo la basetta pulendo tutte le locazioni di memoria. Lo facciamo settando la basetta all indirizzo della modalità ad auto-incremento (0x40), selezionando 0 comne l indirizzo iniziale (0xc0) e settando 0 sedici volte. Adesso che la basetta è pronta a lavorare programmiamo qualcosa. Una cosa semplice da mandare al display è l 8. alla posizione iniziale e finale del digit sul display e illuminare il terzo e sresto led. Per fare ciò useremo la modalità a singolo indirizzo dalla locazione sulla quale stiamo per scrivere che non sono consecutive. La nostra funzione ciclo che fa questo è la seguente: 1void loop() 2{ 3 4 sendcommand(0x44); // setta un singolo indirizzo 5 6 7 8 shiftout(data, clock, LSBFIRST, 0xc0); // primo digit shiftout(data, clock, LSBFIRST, 0xff); 9 10 11 12 13 shiftout(data, clock, LSBFIRST, 0xc5); // terzo LED shiftout(data, clock, LSBFIRST, 0x01); 14 15 16 17 18 shiftout(data, clock, LSBFIRST, 0xcb); //terzo LED shiftout(data, clock, LSBFIRST, 0x01); 19 20 21 22 23 shiftout(data, clock, LSBFIRST, 0xce); // ultimo digit shiftout(data, clock, LSBFIRST, 0xff); 24} Esempio intero displayled. Inob. Scrivere sul display8. è figo ma lo sarebbe ancora di più se conoscessimo la relazione fra il valore inviato alla basetta e quello che sarà mostrato. La basetta sta usando la codifica standard a 7 segmenti, così il valore inviato alla basetta è un byte coi bit codificati come segue: [DP] GFEDCBA. Ogni bit illuminerà un segmento come di seguito indicato: Così, istantaneamente se vuoi scrivere sul display A dovresti scrivere 0x77 alla corrispondente locazione. Adesso sappiamo come controllare i led e il display. Ma la basetta offre un altra funzionalità- pulsanti. Leggendo quali pulsanti non sono premuti lavora in un modo poco differente da quello che abbiamo visto all inizio. Inizialmente abbiamo bisogno di inviare il comando 0x42, dopodichè settiamo il pin data come INPUT. Infine abbiamo bisogno di leggere 4 byte dalla basetta (bit per bit). Il primo byte contiene lo stato dei pulsanti S1 ( bit 1 ) e S5 (bit 4), il secondo byte contiene lo stato per i pulsanti S2 (bit 2) ed S6 (bit 5) e così via. Se (i.e. logical or ) tutti i byte che noi stopperemo avranno un byte dove ogni bit corrisponde a un pulsante- se un bit è settato a 1 ciò significa
che il corrispondente pulsante non è premuto. Qui c è un breve programma (ho omesso i setup-è identico a quello del primo esempio) dove la basetta accenderà un LED quando un pulsante è premuto. 1uint8_t readbuttons(void) 2{ 3 uint8_t buttons = 0; 4 5 shiftout(data, clock, LSBFIRST, 0x42); 6 7 pinmode(data, INPUT); 8 9 for (uint8_t i = 0; i < 4; i++) 10 { 11 uint8_t v = shiftin(data, clock, LSBFIRST) << i; 12 buttons = v; 13 } 14 15 pinmode(data, OUTPUT); 16 17 return buttons; 18} 19 20void setled(uint8_t value, uint8_t position) 21{ 22 pinmode(data, OUTPUT); 23 24 sendcommand(0x44); 25 26 shiftout(data, clock, LSBFIRST, 0xC1 + (position << 1)); 27 shiftout(data, clock, LSBFIRST, value); 28 29} 30 31void loop() 32{ 33 uint8_t buttons = readbuttons(); 34 35 for(uint8_t position = 0; position < 8; position++) 36 { 37 uint8_t mask = 0x1 << position; 38 39 setled(buttons & mask? 1 : 0, position); 40 } 41}