Ho un display 7 segmenti 4 cifre collegato come da schema parziale allegato, dove si vedono
le uscite da pin 23 a 26 che pilotano i bjt, ogni bjt è connesso al catodo comune di ogni cifra.
L'alta immagine mostra i 4 tasti, connessi direttamente ai pin 23 a 26 e una uscita tasti chiamata Kout connessa al pin 21 (PC2).
Il software chiama una funzione utente ogni 4.2 ms per aggiornare il display in multiplex, la funzione dovrebbe anche stabilire quali tasti vengono premuti e per quando tempo.
La funzione chiamata ogni 4.2ms è la seguente:
// chiama questa funzione periodicamente almeno ogni 4ms
// CATODO_NIBBLE = 4
// n_max_columns = 4, cioè display 7 seg 4 cifre.
// uint8_t bit_buff[4], un array di interi da 4 elementi
void dled_update()
{
static uint8_t idx = 0;
PORTC &= ~0xf0;
if (idx > n_max_columns-1)
idx = 0;
bit_idx = idx;
PORTB = bit_buff[idx];
PORTC |= _BV(idx + CATODO_NIBBLE);
// qui devo aggiungere la decodifica dei tasti
}
Non riesco a focalizzare come agire, in base a quale logica, scrivere il codice.
Ogni 4.2 ms il valore di idx viene incrementato ma se supera 3 viene ripotato a 0 (zero)
Per stabilire quali tasti sono premuti devo almeno lasciare che dled_update venga chiamata almeno 4 volte, 4voltex4.2ms = 16.8 ms.
Le uscite del multiplex, si trovano tutte a 0, tranne quella del display in aggiornamento, quindi:
0001, 0010, 0100, 1000, 0001, 0100, 0100, 1000 e la cosa si ripete all'infinito.
Ad ogni bit dei 4 è connesso un tasto, se quel bit è acceso e il tasto è premuto il pin Kout da 0 passa ad 1. Ogni bit rimane alto per 4.2 ms, in questo tempo io non posso controllare costantemente lo stato del pin Kout, trascorsi 4.2ms Kout passa da 1 a 0 anche se il tasto rimane premuto, perchè quello che si spegne è il bit del multiplex, si spegne e si accende il successivo.
Adesso ho pensato che per le prima 4 chiamate alla routine devo salvare lo stato di Kout, e questa è già una cosa, ma poi cosa gli faccio fare al software, basta questo no devo anche rilevare il rilascio del tasto o dei tasti.
Spero di aver messo tutte le info necessarie a ricevere aiuto, o meglio uno spunto, un link o altri consigli sulla logica da adottare.
Ciao.

