; ********************************************************************** ; * File S1DEB7.asm scheda: GPC 553 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 27.09.04 * ; ********************************************************************** ; Programma di esempio per la sezione 1 della DEB 01, comandata da una ; GPC 553. 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 far scorrere ; l'accensione di un led in una direzione o nell'altra a seconda della ; posizione dello switch 1 del dip switch utilizzando i led di ; entrambi i port, in sequenza, della GPC 553. ; In particolare se lo switch 1 è in ON il led shifterà verso destra, mentre ; se lo switch 1 è in OFF, il led shifterà verso sinistra. ; 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 CN5 della GPC 553 e il connettore CN15 della DEB 01. ; ; Indirizzi delle periferiche di bordo ; PORT1 EQU 00090H ;registro dati del port 1 del 80c552 PORT4 EQU 000C0H ;registro dati del port 4 del 80c552 DSW1 EQU 0FFFCH ;registro dati del dip switch ; ; Gestione memorie ; FPORT EQU 08H ;indirizzo di memoria interna contenente il valore rel. del port 4 DIPS EQU 0AH ;indirizzo di memoria interna contenente il valore rel. del dip switch SECPORT EQU 09H ;indirizzo di memoria interna contenente il valore rel. del port 1 TXCHAR EQU 0DH ;indirizzo di memoria contenente il valore da trasmettere sulla seriale DELAY EQU 11H ;variabile utilizzata nella procedura di ritardo di 100 usec (DELAY100) ; ; Inizio programma (main) ; ORG 2050H ;Inizio del codice in memoria MOV PORT1,#00H ;setto in port 1 GPC 553 (port 1 DEB 01) in output MOV PORT4,#00H ;setto in port 4 GPC 553 (port 0 DEB 01) in output 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 INDSW1 ;richiamo la procedura che legge lo stato del dip switch ANL DIPS,#01H ;metto una maschera in modo che solo il bit 0 possa variare:tutto il resto è a 0 MOV A,DIPS CJNE A,#00H,RIGHT ;se il dip1 è in OFF, led verso destra LEFT: ACALL SHIFTLEFT AJMP CYCLE RIGHT: ACALL SHIFTRIGHT AJMP CYCLE ; ; Procedura per la rappresentazione sui Port 0 e 1 del dato acquisito ; OUTPORT01: PUSH PSW ;salvo i registri utilizzati nella procedura PUSH DPL PUSH DPH PUSH ACC MOV A,FPORT ;carico il valore del port 4 da rappresentare in ACC MOV PORT4,A ;e lo sparo sul port 0 della DEB 01 MOV A,SECPORT ;carico il valore del port 1 da rappresentare in ACC MOV PORT1,A ;e lo sparo sul port 0 della DEB 01 POP ACC ;ripristino i suddetti registri 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 ; ; Procedura per la lettura ed acquisizione del dip switch ; INDSW1: PUSH PSW ;salvo i registri utilizzati nello stack PUSH DPL PUSH DPH PUSH ACC MOV DPTR,#DSW1 ;carico l'indirizzo del port DSW1 MOVX A,@DPTR ;pone il dato in A MOV DIPS,A ;mette il dato nella variabile DIPS POP ACC ;ripristina i registri utilizzati POP DPH POP DPL POP PSW RET ; ; Procedura per creare lo shift verso sinistra ; SHIFTLEFT: MOV R0,#08 MOV FPORT,#0FEH ;accendo il primo led del port0 MOV SECPORT,#0FFH ;tengo spenti i led del port1 SHIFTLEFT_0: MOV R2,#256 ;registro usato nella procedura DELAY100 ACALL DELAY100 ;richiamo procedure x il ritardo ACALL OUTPORT01 ;procedura che visualizza il contenuto delle variabili MOV A,FPORT ;FPORT e SECPORT sui led della DEB01 RL A ;shift del led acceso verso sinistra MOV FPORT,A DJNZ R0,SHIFTLEFT_0 MOV R0,#08 ;inizializzo contatore x altri otto cicli CJNE R0,#08,SHIFTLEFT_1 MOV FPORT,#0FFH ;una volta finite le accensioni del port0,si spengono tutti i led MOV SECPORT,#0FEH ;primo led acceso del port1 SHIFTLEFT_1: MOV R2,#256 ;registro usato nella procedura del ritardo ACALL DELAY100 ACALL OUTPORT01 ;questa volta visualizzo SECPORT MOV A,SECPORT RL A MOV SECPORT,A DJNZ R0,SHIFTLEFT_1 ;qui finisce il ciclo delle accensionidel port1 MOV SECPORT,#0FFH ;una volta finite le accensioni del port1,si spengono tutti i led RET ; ; Procedura per creare lo shift verso destra ; SHIFTRIGHT: MOV FPORT,#0FFH ;procedura del tutto simile a quella precedente MOV SECPORT,#0FEH ;che provoca però uno shift verso destra MOV R0,#08 SHIFTRIGHT_1: MOV R2,#256 ACALL DELAY100 MOV A,SECPORT RR A MOV SECPORT,A ACALL OUTPORT01 DJNZ R0,SHIFTRIGHT_1 MOV FPORT,#7FH MOV SECPORT,#0FFH MOV R0,#08 SHIFTRIGHT_0: MOV R2,#256 ACALL DELAY100 ACALL OUTPORT01 MOV A,FPORT RR A MOV FPORT,A DJNZ R0,SHIFTRIGHT_0 MOV FPORT,#0FFH RET ; ; Procedura fissa che crea un ritardo di circa 100 microsecondi variabile moltiplicando R2 ; DELAY100: MOV DELAY,#120 DJNZ DELAY,$ DJNZ R2,DELAY100 RET ; ; HEADING: DB 0CH,' Fa scorrere la accensione di un led, in una direzione o nell altra, a seconda',1DH,' della posizione dello switch 1 del dip switch.',00H END