; ppi.asm ; Uso Porta parallela PPI 8255 ; ; L'I/O aggiuntivo di GPC2 e' mappato come segue in memoria XDATA: ; ; 0FA00h .. 0FA3Fh PPI 8255 ; 0FA40h .. 0FA7Fh TIMER 82C54 (primo) ; 0FA80h .. 0FABFh TIMET 82C54 (secondo) ; 0FAC0h .. 0FAFFh RTC 6242b ; ; 0FB00h .. 0FFFFh BUS esterno (ABACO Bus) ; ; In particolare, per il PPI 8255 avremo: ; 0FA00h -> PDA = Registro dati del port A ; 0FA01h -> PDB = Registro dati del port B ; 0FA02h -> PDC = Registro dati del port C ; 0FA03h -> CNT = registro di controllo ; ; L'8255 ha tre modi di funzionamento (Mode 0 = Basic Input Output, Mode 1 = Strobed ; Input Output, Mode 3 = Bi-Directional Bus), che possono essere selezionati indipendentemente ; per il gruppo Port B, Port C 0..3 e Port A,Port C 4..7. ; Avendo connesso alla scheda il tastierino (TIO 16), il solo modo che ci interessa e' lo 0, ; nel quale ogni port puo' essere programmato come ingresso o uscita, per entrambi i gruppi. ; Vediamo ora come programmare il PPI, tramite il port di controllo: ; ; Bit 0 -> Port C 0..3 : 1 = Input, 0 = Output ; Bit 1 -> Port B : 1 = Input, 0 = Output ; Bit 2 -> Modo Port B : 0 = Mode 0, 1 = Mode 1 ; ; Bit 3 -> Port C 4..7 : 1 = Input, 0 = Output ; Bit 4 -> Port A : 1 = Input, 0 = Output ; Bit 5 -+ ; Bit 6 -+> Modo port A : 00 -> Mode 0, 01 -> Mode 1, 10-11 Mode 3 ; ; Bit 7 -> Programmazione Interrupt : 0 -> Interrupt, 1 -> Modo Polling ; ; Non mi preoccupo della programmazione dll'interrupt, quindi dovremo sempre programmare il ; bit 7 a 1. ; ; Il Port A e' collegato ai piedini 1..8 del connettore CN2 (Tasti rossi) ; Il Port B e' collegato ai DIP Switch ; Il Port C e' collegato ai piedini 9..16 del connettore CN2 (0..3 Tasti gialli, ; 4..7 Tasti verdi) ; ; Scrivo un programma che: ; - Programmi il Port A in uscita, il Port B in ingresso, i bit 0..3 del Port C in uscita e ; i bit 4..7 in ingresso. ; - Copi i bit del Port B (dip switch) sui port A e C (bit 1..3) ; - Emetta un tono alla pressione dei tasti verdi (bit 4..7 di Port C) ; ; .org 8050h ; Inizio del programma caricato da Mo52 ; mov DPTR,#0FA03h ; Port CNT di PPI mov A,#10001010b ; Mode 0 per A e B, A in out, Chi in in, B in in, Clo in out movx @dptr,a ; Setta il PPI ; loop: mov DPL,#1 ; Port B movx a,@DPTR ; Leggo porta B mov DPL,#0 ; Port A movx @DPTR,A ; Copio su porta A mov DPL,#2 ; Port C movx @DPTR,A ; Copio su prota C ; movx A,@DPTR ; Leggo i tasti ; jb ACC.4,no4 ; Tasto 4 rilasciato? ; Tasto 4 premuto ; 128 semicicli a 900 Hz mov r1,128 ; Numero semicicli lo: mov r0,0 ; Durata semiciclo (0 -> 256) cpl p1.2 ; inverto l'uscita lo1: djnz r0,lo1 ; ritardo semiciclo djnz r1,lo ; loop semicicli ; no4: jb ACC.5,no5 ; Tasto 5 Rilasciato? ; Tasto 5 premuto ; 256 semicicli a 1800 Hz mov r1,0 ; Numero semicicli (0 -> 256) hi: mov r0,128 ; Durata semiciclo cpl p1.2 ; inverto l'uscita hi1: djnz r0,hi1 ; ritardo semiciclo djnz r1,hi ; loop semicicli ; no5: jb ACC.6,no6 ; Tasto 6 Rilasciato? ; Tasto 6 premuto ; Tono basso poi pausa mov r1,128 ; Numero semicicli lob: mov r0,0 ; Durata semiciclo cpl p1.2 ; inverto l'uscita lob1: djnz r0,lob1 ; ritardo semiciclo djnz r1,lob ; loop semicicli ; mov r1,0 ; Numero ritardi off: mov r0,128 ; Durata ritardo setb p1.2 ; Azione nulla - non emette suono off1: djnz r0,off1 ; ritardo pausa djnz r1,off ; loop pause ; no6: jb ACC.7,no7 ; Tasto 7 Rilasciato? ; Tasto 7 premuto ; Tono alto poi pausa mov r1,0 ; Numero semicicli (0 -> 256) hib: mov r0,128 ; Durata semiciclo cpl p1.2 ; inverto l'uscita hib1: djnz r0,hib1 ; ritardo semiciclo djnz r1,hib ; loop semicicli ; mov r1,0 ; Numero pause (0 -> 256) offb: mov r0,128 ; Durata pausa setb p1.2 ; Azione nulla - non emette suono offb1: djnz r0,offb1 ; ritardo pausa djnz r1,offb ; loop pause ; no7: sjmp loop ; Ripete all'infinito