; **********************************************************************
; * File S1DEB1.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 01.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 un pc via seriale
; (bit per carat.=8, stop bit=1, no parity, com.=asincrona, baud rate=19200),
; e di attivare i led del port 0 della DEB 01 la combinazione
; binaria del dato esadecimale (da 0 a F) immesso tramite la tastiera
; del sistema di sviluppo. Tale codice esadecimale viene anche
; rappresentato sul monitor.
; 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 8BH ;modo 0,port A output,port B e C input
RXCAR EQU 0CH ;variabile contenente il valore ricevuto dalla seriale
TXCAR EQU 0DH ;variabile contenente il valore da trasmettere ...
PORTA EQU 08H ;indirizzo di memoria interna contenente il valore rel. del portA
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 principale
;
ORG 8050H ;Inizio della parte eseguibile
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 SERIALE
MOV DPTR,#INTESTAZIONE ;stampo a monitor la stringa "INTESTAZIONE"
ACALL STRINGA
;
CICLO: ACALL RICSER ;qui parte il ciclo richiamando la procedura
;della ricezione seriale
JNB RICEVUTO,CICLO
MOV TXCAR,RXCAR ;metto in tx quello che ho ricevuto
ACALL TRASMSER
MOV PORTA,TXCAR ;metto sul port A il dato letto se si tratta
ACALL PORTLED ;di un valore esadecimale
MOV TXCAR,#08H ;ritorna a sinistra di un carattere
ACALL TRASMSER
SJMP CICLO ;salta alla rilettura del portC
;
; 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
;
;
; Trasmissione in seriale di una stringa contenuta in memoria
;
STRINGA: PUSH PSW ;salvo i 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 registri utilizzati dalla procedura
POP ACC
POP PSW
RET
;
; Proceura di attesa per la ricezione seriale
;
RICSER: PUSH PSW ;salvo i registri usati dalla procedura
PUSH 0
PUSH 1
MOV R0,90 ;90 ripetizioni del ciclo di ritardo
MOV R1,250 ;250 ripetizioni del ciclo di controllo ricezione
LOOP0: JBC RI,LOOP1 ;salta a LOOP1 se RI = 1 e azzera RI
DJNZ R0,$ ;decrementa R0 e salta alla stessa istruzione
DJNZ R1,LOOP0 ;decrementa il valore contenuto in R1
;salta a LOOP0 se in R1 non si trova uno 0
CLR RICEVUTO ;se non ricevo nulla azzero RICEVUTO
SJMP FINERIC ;salta alla fine della procedura
LOOP1: MOV RXCAR,SBUF ;salvo il valore ricevuto sulla seriale in RXCAR
SETB RICEVUTO ;imposto a 1 il bit di avvenuta ricezione
FINERIC: POP 1 ;ripristino i sudetti registri
POP 0
POP PSW
RET
;
; Procedura di trasmissione 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
;
; Pone il dato della seriale sul port0 della DEB
;
PORTLED: PUSH PSW ;salvo i registri utilizzati dalla procedura
PUSH DPL
PUSH DPH
PUSH ACC
PUSH 0
MOV A,PORTA ;carico in A il valore da controllare
CJNE A,#30H,NUM1 ;se A>=0 (30H) resetta C,se A<0 setta C
NUM1: JC CLEARH ;se A<0 il carattere non e' esadecimale
CJNE A,#39H,NUM2 ;se A<9 (39H) setta C,se A>=9 resetta C
SETB C
NUM2: JNC CONT1 ;se A>9 salta a CONT1
MOV R0,#48 ;ES: carattere 1 ascii: 49: 49 - 48 = 1
SJMP LEDOUT
CONT1: CJNE A,#41H,ESACAR1 ;se A>=A(41H) resetta C,se A=F resetta C
SETB C
ESACAR2: JNC CONT2 ;se A>F salta a CONT2
MOV R0,#55 ;ES: carattere A ascii: 65: 65 - 55 = 10
SJMP LEDOUT
CONT2: CJNE A,#61H,LETTERA1 ;se A>=a(61H) resetta C,se A=f resetta C
SETB C
LETTERA2: JNC CLEARH ;se A>f salta a CLEARH
MOV R0,#87 ;ES: carattere a ascii: 97: 97 - 87 = 10
LEDOUT: MOV A,PORTA ;carico in A il valore da gestire
CLR C
SUBB A,R0 ;per trasformare i valori ASCII delle lettere
CLR C
CPL A ;inverto i bit da visualizzare,led attivi
MOV PORTA,A ;mando il dato sul port A
ACALL OUTPORT
SETB BITH ;indico che il carattere è esadecimale
;settando il bit di memoria BITH
SJMP FINEOUT ;salto alla fine della procedura
CLEARH: CLR BITH ;indico che il carattere non è esadecimale
;resettando il bit di memoria BITH
FINEOUT: POP 0 ;ripristino i suddetti registri
POP ACC
POP DPH
POP DPL
POP PSW
RET
;
; Pone il dato della var. PORTA in output sul port0
;
OUTPORT: PUSH PSW ;salvo i registri utilizzati dalla 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 in A
POP ACC ;ripristino i suddetti registri
POP DPH
POP DPL
POP PSW
RET
;
;
INTESTAZIONE: DB 0CH,'S1DEB1: Riporta sul port 0, il codice esadecimale del tasto premuto',1DH,'dalla tastiera del -sistema di sviluppo-: ',0
END