{ ********************************************************************** ** Programma: S1DEB7b.PAS Versione: 1.1-8 Febbraio 1999 ** ** Ditta: GRIFO(r) Via Dell'Artigiano 8/6 ** ** 40016 San Giorgio di Piano (BO) ** ** Tel. 051-892052 FAX 051-893661 ** ** Realizzato da: Tassinari Enea ** ********************************************************************** Il programma e' in grado di far scorrere i led del PORT A e PORT C in due direzioni in modo sequenziale a seconda che lo switch 1 del dip switch sia a 1 o a 0. Per il funzionamento del seguente programma e' necessario un compilatore pascal (parte software), una scheda DEB01 e una scheda GPC-15R opportunamente collegate (parte hrdware). } program S1DEB7b; {$C-} { disabilita il Ctrl+C } const CNT=$17; { Registro di controllo e comando del PPI 82C55 } PDA=$14; { Registro dati del port A } PDB=$15; { Registro dati del port B } PDC=$16; { Registro dati del port C } RIT=100; { Ritardo di 100 ms } var STATO:byte; TASTO:char; VAL:integer; SWC:integer; RIS:integer; procedure INIZIALIZZAZIONE; { Inizializzazione del registro di controllo dell' 82C55 } begin port[CNT]:=130; end; function LETTURA (INDIRIZZO:integer):byte; begin LETTURA:=port[INDIRIZZO]; end; procedure SCRITTURA (STATO:integer); { Scrittura sul Port A e Port C } var BYTEL,BYTEH:byte; begin BYTEL:=STATO and $FF; { Scrive all'interno della variabile BYTEL solo il valore del byte basso del contenuto della variabile STATO } BYTEH:=(STATO and $FF00) shr 8; { Scrive all'interno della variabile BYTEH solo il valore del byte alto del contenuto della variabile STATO. La lettura del valore inoltre risulta compresa tra 0 e 255 in quanto il contenuto del byte alto e' stato spostato di otto posizioni quindi riportato all'equivalente del byte basso. } port[PDA]:=BYTEL; port[PDC]:=BYTEH; end; begin {programma principale } clrscr; INIZIALIZZAZIONE; gotoxy(10,3); writeln('VISUALIZZAZIONE DELLO SCORRIMENTO DEI LED SUI PORT A-C IN CORSO'); gotoxy(25,4); write('Premere un tasto per uscire'); begin SCRITTURA($FFFF); { Vengono spenti tutti i led del port A e del port C } SWC:=LETTURA(PDB); RIS:=SWC and 1; { Viene reso sensibile solo lo switch 1 del dip switch } if RIS=0 then VAL:=1 { In base alla lettura dello switch 1 del dip switch la variabile VAL puo' assumere due diversi valori che corrispondono con l'accensione del primo o dell'ultimo led. } else VAL:=$8000; repeat begin SCRITTURA($FFFF-VAL); delay(RIT); SWC:=LETTURA(PDB); RIS:=SWC and 1; if RIS=0 then begin if VAL=$8000 then VAL:=1 { Tramite questo comando riesco ad accendere l'ultimo led e il primo in sequenza. In sostanza gli estremi devo riportarli a mano e non posso utilizzare lo shl. } else VAL:=VAL shl 1; { I led interni vengono schiftati verso sinistra. } end else begin if VAL=1 then VAL:=$8000 { E' possibile accendere in sequenza il primo e l'ultimo led. E' necessario collegarli in questa modo in quanto non e' possibile schiftarli. } else VAL:=VAL shr 1; end end; until keypressed; end; SCRITTURA($FFFF); { Permette di mantenere, all'uscita del programma, tutti i led del spenti } read(kbd,TASTO); end.