Modulo display a 7 segmenti

  • by

Nella progettazione e realizzazione dei progetti adotto da tempo la tecnica “modulare” che consiste nella realizzazione di periferiche con interfacciamento standard (seriale nel caso specifico). Vediamo qui la scheda del modulo display a 7 segmenti.

display

Le caratteristiche principali:

  • 4 cifre
  • Interfaccia seriale 9600 baud
  • 256 byte EEPROM

csdispp

L’interfaccia seriale comunica utilizzando il protocollo descritto qui ed implementa i seguenti comandi:

  • aggiunta cifra a destra
  • cancellazione ultima cifra inserita
  • cancel completo (porta a 0 tutte le cifre)
  • Lettura valore visualizzato
  • Scrittura EEPROM
  • Lettura EEPROM

L’utilizzo tipico avviene tramite tastiera, per cui ad ogni tasto premuto viene visualizzata la relativa cifra, partendo da destra con shift verso sinistra. Il comando di lettura del valore visualizzato permette la completa asincronicità tra display e utilizzatore: quando serve viene letto il valore.

Gli ultimi due comandi servono per sfruttare la memoria EEPROM disponibile sul controllore, che per la gestione dei disply non vengono utilizzate. Siccome c’è sempre carenza di memoria, perché non sfruttarla?

Schema elettrico

schemadisplay

R1-R4: 1k ohm

R5-R12: 330 ohm

T1-T4: BC517

DIS1-DIS4 Display anodo comune

Il controllore visualizza i valori delle 4 cifre, multiplexando i 4 display, alimentati tramite 4 darlington. L’interfaccia seriale lavora a livelli TTL e sfrutta gli stessi pin utilizzati per la programmazione (ICSP).

Firmware

Allego il progetto completo MPLAB. Il compilatore utilizzato è il PICC di Hitech

Per implementare altri comandi di deve modificare la funzione

unsigned char interrupt ricezione(void), in particolare intervenendo nel blocco switch, inserendo altri case, riferiti ai comandi da implementare:

...
c = GetCommand();
if (!c) {
switch (read_Buff(2)) {
case 5:
...

Esempio di utilizzo

ecco ora una parte del codice di un progetto che utilizza il modulo:

c = ReadKey();
switch (c) {
case 0x0a:
sendCommand (0x35, 6, 0);
break;
case 0x1a:
sendCommand (0x35, 7, 0);
break;
case 0x0b:
DelayMs (200);
sendCommand (0x35, 8, 0);

if (getCommand()==0)
sendSlave();
break;
default:
DelayMs (200);
c += 0x30;
sendCommand (0x35, 5, c);
}

Leave a Reply