; ********************************************************************** ; * File S1DEB2.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 11.06.04 * ; ********************************************************************** ; Programma di esempio per la DEB 01, comandata da una GPC F2, della ; sezione 1. 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 visualizzare ; sullo schermo il codice decimale (da 0 a 255) dello stato dei due port: ; praticamnete, premendo i tasti della DEB 01 si può andare a variare ; il dato rappresentato. ; Per il i movimenti e posizionamenti del cursore 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 allaccia 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 PDC EQU 0FA02H ;registro dati del port C dell'82c55 CNT EQU 0FA03H ;registro di controllo e comando dell'82c55 ; ; ; Indirizzi gestione memorie ; INIT EQU 99H ;modo 0,port A input,port B output e C input RXCAR EQU 0CH ;variabile contenente il valore ricevuto dalla seriale TXCAR EQU 0DH ;variabile contenente il valore da trasmettere sulla seriale UNITA EQU 0EH ;variabile contenente il valore delle unità DECINE EQU 0FH ;variabile contenente il valore delle decine CENTI EQU 10H ;veriabile contenente il valore delle centinaia PORTA EQU 08H ;indirizzo di memoria interna contenente il valore rel. del port A PORTC EQU 09H ;indirizzo di memoria interna contenente il valore rel. del port C RICEVUTO EQU 01H ;bit di ricezione della seriale:1 ricevuto,0 nulla BITH EQU 00H ;indirizzo x caratteri esadecimali:0 car. non esadec.,1 x car. esadec ; ; ; Inizio programma (main) ; ORG 8050H ;Inizio del codice in ram 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 ;idem ACALL SERIALE MOV DPTR,#INTESTAZIONE ;stampo a monitor la stringa "INTESTAZIONE" ACALL STRINGA ; ; ; Inizio ciclo principale del programma ; CICLO: ACALL INPORTS ;leggo i port A e C MOV TXCAR,#1AH ;pongo il cursore in alto ACALL TRASMSER MOV A,PORTA ;carico il valore di PORTA in A ACALL ASCII ;conversione da decimale a carattere ascii ACALL TRASCII ;trasmissione MOV TXCAR,#0AH ;cursore in basso ACALL TRASMSER MOV A,PORTC ;carico il valore di PORTC in A ACALL ASCII ;conversione ACALL TRASCII ;trasmissione SJMP CICLO ;salta alla rilettura del portC ; ; Procedura che acquisisce il valore dei port A e C ; ; INPORTS: PUSH PSW ;salvo i registri utilizzati nello stack PUSH DPL PUSH DPH PUSH ACC MOV DPTR,#PDA ;carico l'indirizzo del port A MOVX A,@DPTR ;pone il dato in A MOV PORTA,A ;mette il dato nella variabile PORTA 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 ; SERIALE: 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 per scrivere parti di testo via seriale ; STRINGA: PUSH PSW ;salvo registri utilizzati dalla procedura PUSH ACC PUSH TXCAR 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 TXCAR,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 TXCAR ;ripristina i suddetti registri POP ACC POP 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,TXCAR POP PSW ;ripristino PSW RET ; ; Procedura che trasforma il codice acquisito dai port in codice decimale ; ASCII: PUSH PSW ;salvo i registri usati dalla procedura PUSH ACC PUSH B MOV B,#100 ;carica in B il valore 100 DIV AB ;divide A per B (100) ADD A,#30H ;aggiunge alle centinaia 30H per renderlo un Ascii MOV CENTI,A ;salva le centinaia MOV A,B ;ricarica in A il valore MOV B,#10 ;carica in B il valore 10 DIV AB ;divide A per B (10) ADD A,#30H ;aggiunge alle decine 30H per renderlo un Ascii MOV DECINE,A ;salva le decine MOV A,B ;ricarica in A il valore ADD A,#30H ;aggiunge alle unita' 30H per renderlo un Ascii MOV UNITA,A ;salva le unita POP B ;ripristina i registri usati dalla procedura POP ACC POP PSW RET ; ; Procedura per inviare il valore sullo schermo tramite seriale ; TRASCII: PUSH PSW ;salvo i registri usati dalla procedura PUSH ACC PUSH TXCAR MOV A,CENTI ;controllo se le centinaia sono diverse da '0' CLR F0 ;azzero il flag F0 MOV TXCAR,A ;CENTI in TXCAR CJNE A,#48,ASCII1 ;se diverse salta a ASCII1 MOV TXCAR,#20H ;altrimenti spedisce uno spazio SETB F0 ;indico che le centinaia erano uguali a '0' ASCII1: ACALL TRASMSER MOV A,DECINE ;controllo se le decine sono diverse da '0' MOV TXCAR,A ;metto le decine in TXCAR CJNE A,#48,ASCII2 ;se diverse spedisci le decine JNB F0,ASCII2 ;altrimenti controlla se le centinaia erano a '0' MOV TXCAR,#20H ;spedisce uno spazio ASCII2: ACALL TRASMSER MOV TXCAR,UNITA ;trasmette le unita' ACALL TRASMSER MOV TXCAR,#08H ;trasmette tre ritorni a sinistra ACALL TRASMSER ACALL TRASMSER ACALL TRASMSER POP TXCAR ;ripristina i registri usati dalla procedura POP ACC POP PSW RET ; ; INTESTAZIONE: DB 0CH,'Riporta sul monitor del sistema di sviluppo lo stato di entrambi i port',1DH,1DH,'Port A: ',1DH,'Port C: ',00H END