; ********************************************************************** ; * 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