; ********************************************************************** ; * File S1DEB5.asm scheda: GPC F2 con SXA51 * ; * GRIFO(R) via Dell'Artigiano 8/6 40016 S. Giorgio di Piano (BO) * ; * Tel. +39 051 892052 Fax. +39 051 893661 * ; * http://www.grifo.it http://www.grifo.com * ; * by Alessio Francesconi del 30.06.04 * ; ********************************************************************** ; Programma di esempio per la sezione 1 della DEB 01, comandata da una ; GPC F2. Tale sezione è composta da 16 tasti collegati a 16 led: ; la pressione di uno o più di questi tasti determina lo stato logico ; 0 sulla linea, e l'accensione del led corrispondente via hardware. ; Questo programma ha il compito di comunicare con il pc e di riportare ; lo stato del port 1 (port C della GPC F2) sul port 0 (port A GPC F2) ; se il dip 1 del dip switch è in ON, diversamente di riportare il negato ; del port 1,sempre sul port 0 se il dip 1 del dip switch è in OFF. ; In particolare premendo tasti relativi ai led del port 1 vedremo accendere ; o spegnere i led del port 0 a seconda della posizione del dip 1. ; Per i movimenti e posizionamenti del cursore sono state ; adoperate alcune sequenze di comando secondo lo standard ADDS Viewpoint ; (vedi manuale GET51). ; Il collegamento è realizzato tramite un flat 20 vie che congiunge il ; connettore CN2 della GPC F2 e il connettore CN15 della DEB 01. ; ; ; Indirizzi delle periferiche di bordo ; ; PDA EQU 0FA00H ;registro dati del port A dell'82c55 PDB EQU 0FA01H ;registro dati del port B (dip switch) dell'8255 PDC EQU 0FA02H ;registro dati del port C dell'82c55 CNT EQU 0FA03H ;registro di controllo e comando dell'82c55 ; ; Gestione memorie ; INIT EQU 8BH ;modo 0,port A output,port B e C in input PORTA EQU 08H ;indirizzo di memoria interna contenente il valore rel. del port A PORTB EQU 0AH ;indirizzo di memoria interna contenente il valore rel. del port B PORTC EQU 09H ;indirizzo di memoria interna contenente il valore rel. del port C TXCHAR EQU 0DH ;indirizzo di memoria contenente il valore da trasmettere sulla seriale ; ; Inizio programma (main) ; ORG 8050H ;Inizio del codice in memoria MOV DPTR,#CNT ;carica nel DPTR l'indirizzo del registro di controllo del 82C55 MOV A,#INIT ;carica in A il valore da scrivere nel registro di controllo del 82C55 MOVX @DPTR,A ;scrive nel registro di controllo dell'82C55 la parola di controllo MOV SP,#2FH ;inizializzo il puntatore della prima locazione libera dello stack CLR RS0 ;imposto l'indirizzo di memoria dei registri (00H-07H) CLR RS1 ACALL SERIAL ;inizializza la seriale MOV DPTR,#HEADING ;stampo a monitor la stringa "HEADING" ACALL STRING ; ; CYCLE: ACALL INPORTB ;richiamo la procedura che legge lo stato del dip switch (Port B) ANL PORTB,#01H ;metto una maschera in modo che solo il bit 0 possa variare:tutto il resto è a 0 MOV A,PORTB ;PORTB in ACC CJNE A,#00H,COMPL ;se il dip1 è in OFF, salta a COMPL ACALL INPORTC ;richiamo la procedura che legge il dato del Port C MOV PORTA,PORTC ;metto il dato su PORTC in PORTA ACALL OUTPORTA ;richiamo la procedura che va a scrivere sul port A SJMP ENDCYCLE ;salto a fine ciclo COMPL: ACALL INPORTC MOV A,PORTC CPL A ;complemento lo stato del Port C contenuto qui MOV PORTA,A ACALL OUTPORTA ENDCYCLE: AJMP CYCLE ; ; ; Procedura per la rappresentazione sul Port A del dato acquisito ; OUTPORTA: PUSH PSW ;salvo i registri utilizzati nella procedura PUSH DPL PUSH DPH PUSH ACC MOV A,PORTA ;mette la variabile PORTA in ACC MOV DPTR,#PDA ;carico l'indirizzo del PORTA MOVX @DPTR,A ;pone il dato sul port A POP ACC ;ripristino i suddetti registri POP DPH POP DPL POP PSW RET ; ; ; INPORTB: PUSH PSW ;salvo i registri utilizzati nello stack PUSH DPL PUSH DPH PUSH ACC MOV DPTR,#PDB ;carico l'indirizzo del port B MOVX A,@DPTR ;pone il dato in A MOV PORTB,A ;mette il dato nella variabile PORTB POP ACC ;ripristina i registri utilizzati POP DPH POP DPL POP PSW RET ; ; Procedura per l'acquisizione del dato letto sul Port C ; INPORTC: PUSH PSW ;salvo i registri utilizzati nello stack PUSH DPL PUSH DPH PUSH ACC MOV DPTR,#PDC ;carico l'indirizzo del port C MOVX A,@DPTR ;pone il dato in A MOV PORTC,A ;mette il dato nella variabile PORTC POP ACC ;ripristina i registri utilizzati POP DPH POP DPL POP PSW RET ; Procedura di inizializzazione seriale ; SERIAL: PUSH PSW ;salvo PSW MOV SCON,#50H ;seleziono modo 1, rx attivo MOV TH1,#253 ;imposto a 253 il TH1 ANL PCON,#7FH ;azzero il bit 7 del PCON (SMOD):imposto baud rate POP PSW ;ripristino PSW RET ; ; Procedura che consente la trasmissione di dati sulla seriale ; TRASMSER: PUSH PSW ;salvo PSW TRASM1: JBC TI,TRASM2 ;salta a TRASM2 se TI = 1 e azzera TI SJMP TRASM1 ;salta a TRASM1 perche' TI = 0 ;seriale ancora in fase di trasmissione TRASM2: MOV SBUF,TXCHAR ;scrive nel buffer della seriale il car. da trasmettere POP PSW ;ripristino PSW RET ; ; Procedura per scrivere parti di testo via seriale ; STRING: PUSH PSW ;salvo registri utilizzati dalla procedura PUSH ACC PUSH TXCHAR STRINGLOOP: MOVX A,@DPTR ;carica in A il contenuto della memoria puntata da DPTR JZ ENDSTRING ;se l'ultimo carattere letto e' nullo (00H),salta alla fine MOV TXCHAR,A ;carica il carattere nella variabile per la trasmissione ACALL TRASMSER ;trasmetti il carattere INC DPTR ;incrementa il puntatore al carattere SJMP STRINGLOOP ;il ciclo riparte per un altro carattere ENDSTRING: POP TXCHAR ;ripristina i registri sopra indicati POP ACC POP PSW RET ; ; HEADING: DB 0CH,'Riporta sul port 0, il negato del port 1 se lo switch 1 del dip switch',1DH,'e in OFF,riporta il port 1 negli altri casi',00H END