UDA 4 — Ingressi e uscite: le periferiche di base
6 ore (2 di teoria + 4 di laboratorio) · Settimane 7-8
Obiettivi
Sezione intitolata “Obiettivi”Al termine di questa unità:
- distinguesti memoria e spazio delle porte e sai usare
INeOUTin 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/RESper 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 conOTIR(esempi 04–05). Incontro 2 (3 h): tastiera e keypad con handshake, Esercizio 5, esempi 06–07 e prova pratica.
1. Due spazi: memoria e porte
Sezione intitolata “1. Due spazi: memoria e porte”Il G80 dialoga con il mondo attraverso due spazi separati:
| Spazio | Dimensione | Istruzioni | A cosa serve |
|---|---|---|---|
| Memoria | 65536 celle (16 bit) | LD, LDIR… | dati e programmi |
| Porte di I/O | 256 porte (8 bit) | IN, OUT | periferiche (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 CLa forma con la porta in C è comodissima quando la porta cambia (es. prima leggi la tastiera,
poi scrivi sull’LCD): basta ricaricare C.
| Istruzione | Byte | Nota |
|---|---|---|
in a, (n) | DB n | legge una porta |
out (n), a | D3 n | scrive su una porta |
in a, (c) | ED 78 | porta in C |
out (c), a | ED 79 | porta in C |
otir | ED B3 | blocco: invia B byte da (HL) alla porta (C) |
Una lettura da una porta non mappata restituisce 0xFF.
2. La mappa delle porte del G80
Sezione intitolata “2. La mappa delle porte del G80”| Porta | Periferica | Direzione | In questa UDA |
|---|---|---|---|
0x20 | 8 LED | OUT | ✅ |
0x30–0x33 | chart recorder (+ marker) | OUT | UDA 5 |
0x40 | potenziometro | IN | UDA 5 |
0x60 | beeper | OUT | UDA 5 |
0x70–0x71 | timer (CTC) | OUT | UDA 5 |
0x80–0x81 | keypad 16 tasti | IN/OUT | ✅ |
0x90 | 8 interruttori | IN | ✅ |
0xA0–0xA1 | 2 display 7 segmenti | OUT | ✅ |
0xB0 | motore stepper | OUT | UDA 5 |
0xC0 | tastiera ASCII | IN | ✅ |
0xD0 | LCD 20×10 | OUT | ✅ |
0xE0–0xE1 | counter / nastro | OUT/IN | UDA 5 |
0xF0–0xF1 | forno (kiln) | OUT/IN | UDA 5 |
0x01, 0x03 | vettori dei device A/B | OUT | UDA 5 (interrupt) |
La mappa completa con tutti i dettagli è nel manuale (§ Periferiche).
3. Le uscite
Sezione intitolata “3. Le uscite”LED — porta 0x20
Sezione intitolata “LED — porta 0x20”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 LEDDisplay 7 segmenti — porte 0xA0 e 0xA1
Sezione intitolata “Display 7 segmenti — porte 0xA0 e 0xA1”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):
| Cifra | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| Hex | 3F | 06 | 5B | 4F | 66 | 6D | 7D | 07 | 7F | 6F |
Con una tabella in memoria e un indice (ADD HL,DE, UDA 3) si accende la cifra voluta.
LCD — porta 0xD0
Sezione intitolata “LCD — porta 0xD0”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) halttesto: .ascii /Ciao dal G80!/ .db 0x0A ; nuova rigafine:OTIR in tre passi: scrive (HL) sulla porta (C), incrementa HL, decrementa B;
ripete finché B ≠ 0. È il LDIR delle porte!
4. Gli ingressi
Sezione intitolata “4. Gli ingressi”Interruttori — porta 0x90
Sezione intitolata “Interruttori — porta 0x90”Otto bit = otto interruttori:
in a, (0x90) ; legge gli interruttori out (0x20), a ; ...e li mostra sui LEDTastiera ASCII — porta 0xC0
Sezione intitolata “Tastiera ASCII — porta 0xC0”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 carattereKeypad 16 tasti — porte 0x80/0x81
Sezione intitolata “Keypad 16 tasti — porte 0x80/0x81”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)Bit per bit: BIT, SET, RES
Sezione intitolata “Bit per bit: BIT, SET, RES”| Istruzione | Effetto | Tipico uso |
|---|---|---|
bit n, r | testa il bit n (Z = 1 se è 0) | handshake (bit 7, a) |
set n, r | porta il bit n a 1 | accendere un flag |
res n, r | porta il bit n a 0 | spegnere un flag |
BIT non modifica il registro: aggiorna i flag. SET/RES la usano per accendere/spegnere.
Che cos’è un “handshake”
Sezione intitolata “Che cos’è un “handshake””Un handshake è un piccolo dialogo per non perdere dati:
- il device alza un segnale “sono pronto” (qui: il bit 7 del keypad);
- il programma conferma leggendo il dato;
- 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.
5. Laboratorio guidato
Sezione intitolata “5. Laboratorio guidato”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):
- mostra solo i bit dispari:
and 0xAA; - mostrali invertiti:
cpl; - 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”- esegui
05-lcd-messaggio.asme osserva il testo sul display; - cambia il messaggio e la lunghezza: perché
fine - testocontinua a funzionare? - 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)”- 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!). - Esempio
07-keypad-lcd.asm: osserva la conversione numero → ASCII (add a, 0x30per 0–9,add a, 0x37per 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.
Attività D — Display 7 segmenti con la tabella
Sezione intitolata “Attività D — Display 7 segmenti con la tabella”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 haltcifre: .db 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6FVerifica: 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 = 0xC0LCD = 0xD0
ld b, 0 ; contatore dei tasticiclo: 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!)
6. Prova pratica n. 2
Sezione intitolata “6. Prova pratica n. 2”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.
7. Autoverifica
Sezione intitolata “7. Autoverifica”- Differenza tra lo spazio di memoria e lo spazio delle porte? Quali istruzioni per ciascuno?
- Che differenza c’è tra
out (0x20), aeout (c), a? Quando è comoda la seconda? - Cosa fa
OTIResattamente? Quali tre registri usa? - Tastiera e keypad: come si capisce che c’è un dato nuovo? Cosa cambia tra i due device?
- Perché
bit 7, aè meglio diand 0x80per l’handshake? (Suggerimento: cosa succede adA?)
8. Compiti e materiali
Sezione intitolata “8. Compiti e materiali”📎 I file
.asmdi 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; esercizio05-eco-lcd.asm(+ soluzione); tabella cifre 7 segmenti. - Prossima unità: interrupt e periferiche avanzate — timer, counter, motore, forno (UDA 5).