Salta ai contenuti

UDA 4 — Ingressi e uscite: le periferiche di base

6 ore (2 di teoria + 4 di laboratorio) · Settimane 7-8

Al termine di questa unità:

  • distinguesti memoria e spazio delle porte e sai usare IN e OUT in tutte le forme;
  • conosci la mappa delle porte del G80;
  • piloti le uscite: LED, display 7 segmenti, LCD;
  • leggi gli ingressi: interruttori, tastiera, keypad;
  • riconosci un handshake e sai gestire il keypad (bit 7 = dato pronto);
  • usi BIT/SET/RES per lavorare sui singoli bit;
  • hai completato l’Esercizio 5 e sostieni la prova pratica n. 2.

Piano delle due settimane — Incontro 1 (3 h): porte, IN/OUT, LED, 7 segmenti, LCD con OTIR (esempi 04–05). Incontro 2 (3 h): tastiera e keypad con handshake, Esercizio 5, esempi 06–07 e prova pratica.


Il G80 dialoga con il mondo attraverso due spazi separati:

SpazioDimensioneIstruzioniA cosa serve
Memoria65536 celle (16 bit)LD, LDIR…dati e programmi
Porte di I/O256 porte (8 bit)IN, OUTperiferiche (LED, tastiere, display, timer…)

Le forme principali:

in a, (0x90) ; legge la porta 0x90 -> A (porta "diretta")
out (0x20), a ; scrive A sulla porta 0x20
ld c, 0xD0
in a, (c) ; legge la porta indicata da C (porta "in registro")
out (c), a ; scrive sulla porta indicata da C

La forma con la porta in C è comodissima quando la porta cambia (es. prima leggi la tastiera, poi scrivi sull’LCD): basta ricaricare C.

IstruzioneByteNota
in a, (n)DB nlegge una porta
out (n), aD3 nscrive su una porta
in a, (c)ED 78porta in C
out (c), aED 79porta in C
otirED B3blocco: invia B byte da (HL) alla porta (C)

Una lettura da una porta non mappata restituisce 0xFF.


PortaPerifericaDirezioneIn questa UDA
0x208 LEDOUT✅
0x30–0x33chart recorder (+ marker)OUTUDA 5
0x40potenziometroINUDA 5
0x60beeperOUTUDA 5
0x70–0x71timer (CTC)OUTUDA 5
0x80–0x81keypad 16 tastiIN/OUT✅
0x908 interruttoriIN✅
0xA0–0xA12 display 7 segmentiOUT✅
0xB0motore stepperOUTUDA 5
0xC0tastiera ASCIIIN✅
0xD0LCD 20×10OUT✅
0xE0–0xE1counter / nastroOUT/INUDA 5
0xF0–0xF1forno (kiln)OUT/INUDA 5
0x01, 0x03vettori dei device A/BOUTUDA 5 (interrupt)

La mappa completa con tutti i dettagli è nel manuale (§ Periferiche).


Otto bit = otto LED: il bit 0 è il primo LED, il bit 7 l’ultimo.

ld a, 0x0F ; 0000 1111
out (0x20), a ; accesi i primi 4 LED

Ogni byte contiene lo stato dei 7 segmenti: bit 0 = a, bit 1 = b, … bit 6 = g. Ecco i pattern delle cifre (verificati sul simulatore):

Cifra0123456789
Hex3F065B4F666D7D077F6F

Con una tabella in memoria e un indice (ADD HL,DE, UDA 3) si accende la cifra voluta.

Display a caratteri 20 colonne × 10 righe:

  • ogni byte scritto è un carattere ASCII e fa avanzare il cursore;
  • 0x0A = nuova riga;
  • dopo 200 caratteri si riparte dall’inizio (il display “scorre” da solo).

Per scrivere una stringa si usa OTIR:

LCD = 0xD0
ld hl, testo
ld b, fine - testo ; lunghezza (differenza di etichette, UDA 1)
ld c, LCD
otir ; invia B byte da (HL) alla porta (C)
halt
testo: .ascii /Ciao dal G80!/
.db 0x0A ; nuova riga
fine:

OTIR in tre passi: scrive (HL) sulla porta (C), incrementa HL, decrementa B; ripete finché B ≠ 0. È il LDIR delle porte!


Otto bit = otto interruttori:

in a, (0x90) ; legge gli interruttori
out (0x20), a ; ...e li mostra sui LED

Restituisce il codice ASCII del tasto premuto, oppure 0x00 se non c’è nulla di nuovo. La lettura “consuma” il tasto: il carattere viene restituito una sola volta.

attendi:
in a, (0xC0)
or a ; A == 0 ?
jr z, attendi ; nessun tasto: riprova
; qui A contiene il carattere

Il keypad usa un protocollo tutto suo:

  • se non c’è un tasto: legge 0x00;
  • se c’è: bit 7 = 1 (“dato pronto”) e bit 0–3 = tasto (0–9, A–F);
  • la lettura è l’handshake: dopo che hai letto, il “dato pronto” sparisce.
in a, (0x80)
bit 7, a ; c'e' un tasto pronto?
jr z, niente ; no
and 0x0F ; numero del tasto (0-15)
IstruzioneEffettoTipico uso
bit n, rtesta il bit n (Z = 1 se è 0)handshake (bit 7, a)
set n, rporta il bit n a 1accendere un flag
res n, rporta il bit n a 0spegnere un flag

BIT non modifica il registro: aggiorna i flag. SET/RES la usano per accendere/spegnere.

Un handshake è un piccolo dialogo per non perdere dati:

  1. il device alza un segnale “sono pronto” (qui: il bit 7 del keypad);
  2. il programma conferma leggendo il dato;
  3. il device abbassa il segnale e aspetta il prossimo dato.

Senza handshake si rischia di leggere due volte lo stesso tasto o di perdere quelli veloci. La tastiera 0xC0 usa un handshake “implicito”: il tasto è disponibile finché non lo leggi.


Attività A — Esempio 04: dagli interruttori ai LED

Sezione intitolata “Attività A — Esempio 04: dagli interruttori ai LED”

Apri 04-interruttori-led.asm ed esegui: muovendo gli interruttori, i LED li seguono.

Varianti da provare (collegano la UDA 1–2):

  1. mostra solo i bit dispari: and 0xAA;
  2. mostrali invertiti: cpl;
  3. mostra i bit invertiti solo se il primo interruttore è acceso (altrimenti tutto spento).

Attività B — Esempio 05: messaggio sul LCD con OTIR

Sezione intitolata “Attività B — Esempio 05: messaggio sul LCD con OTIR”
  1. esegui 05-lcd-messaggio.asm e osserva il testo sul display;
  2. cambia il messaggio e la lunghezza: perché fine - testo continua a funzionare?
  3. aggiungi una seconda riga (aggiungi 0x0A + altro testo) e verifica il “a capo”.

Attività C — Tastiera (Esercizio 5) e keypad (Esempio 07)

Sezione intitolata “Attività C — Tastiera (Esercizio 5) e keypad (Esempio 07)”
  1. Esercizio 5 (esercizi/05-eco-lcd.asm): completa l’eco — ogni carattere digitato deve comparire sul LCD. Verifica: digitando “ciao” compare “ciao” (e la lettura lo consuma!).
  2. Esempio 07-keypad-lcd.asm: osserva la conversione numero → ASCII (add a, 0x30 per 0–9, add a, 0x37 per A–F) e il ruolo del bit 7.

Consegna: nell’esempio 07, cosa succede se non si guarda il bit 7 ma solo i bit 0–3? Spiega con un esempio di lettura sbagliata.

Imposta una cifra (0–9) con gli interruttori e mostrala sul primo display a 7 segmenti:

ld hl, cifre
ld a, (0x90)
and 0x0F ; tieni solo 0-15
ld e, a
ld d, 0
add hl, de ; HL = indirizzo del pattern
ld a, (hl)
out (0xA0), a ; primo display
halt
cifre: .db 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F

Verifica: con gli interruttori che valgono 3, sul display compare 3. Prova le altre cifre. (Se il valore è > 9 si accende un pattern “strano”: perché? Guarda la tabella: esistono solo 10 pattern ma AND 0x0F può produrre 10–15.)

Attività E — Sfida: contatore di tasti sull’LCD

Sezione intitolata “Attività E — Sfida: contatore di tasti sull’LCD”

Ogni volta che premi un tasto sulla tastiera, l’LCD mostra il numero progressivo dei tasti (1, 2, 3…). Aiutati con l’eco dell’Esercizio 5.

Mostra una soluzione
KBD = 0xC0
LCD = 0xD0
ld b, 0 ; contatore dei tasti
ciclo:
ld c, KBD
in a, (c)
or a
jr z, ciclo ; nessun tasto
inc b ; nuovo tasto
ld a, b
add a, 0x30 ; 1 -> '1', 2 -> '2', ...
ld c, LCD
out (c), a ; stampa la cifra
jp ciclo

(Con più di 9 tasti il carattere non è più una cifra: come si potrebbe rimediare? Idea: stampare anche 0x0A ogni tanto, oppure usare due cifre con la LUT del 7 segmenti… ma è un’altra storia!)


In coda a questa unità c’è la prova pratica intermedia (1 ora, al simulatore): un programma con almeno una porta di ingresso e una di uscita. La trovi nella pagina “UDA 4 — Esempio di prova pratica n. 2” (due tracce + griglia di correzione): usala per allenarti, poi il docente assegna la versione per la classe.


  1. Differenza tra lo spazio di memoria e lo spazio delle porte? Quali istruzioni per ciascuno?
  2. Che differenza c’è tra out (0x20), a e out (c), a? Quando è comoda la seconda?
  3. Cosa fa OTIR esattamente? Quali tre registri usa?
  4. Tastiera e keypad: come si capisce che c’è un dato nuovo? Cosa cambia tra i due device?
  5. Perché bit 7, a è meglio di and 0x80 per l’handshake? (Suggerimento: cosa succede ad A?)

📎 I file .asm di esempi ed esercizi si scaricano dalla pagina Materiali.

  • Compito: completa l’Esercizio 5; risolvi la sfida del contatore; prepara la prova pratica sul foglio prima di provarla al simulatore.
  • Pre-lettura: manuale, tabella delle porte e sezione LCD.
  • Materiali: esempi 04–07; esercizio 05-eco-lcd.asm (+ soluzione); tabella cifre 7 segmenti.
  • Prossima unità: interrupt e periferiche avanzate — timer, counter, motore, forno (UDA 5).