.org 00000h ;Daten von Out2 werden als Command an das Display gesendet, Daten von Out4 ;als Daten (Zeichen). ; ;Port B.0 -> RS (0=Command/1=Data) ;Port B.1 -> R/-W (0=Write to Display/1=Read from Display) ;Port B.2 -> E (0=Disable/1=Enable;Data must be valid on falling edge) ; ;Port C.0 -> D0 ;Port C.1 -> D1 ;Port C.2 -> D2 ;Port C.3 -> D3 ;Port C.4 -> D4 ;Port C.5 -> D5 ;Port C.6 -> D6 ;Port C.7 -> D7 ; OUT2BUF .equ 07DC0h OUT2BC .equ 07FC9h OUT2CS .equ 07FC8h OUT4BUF .equ 07CC0h OUT4BC .equ 07FCDh OUT4CS .equ 07FCCh OEC .equ 07F9Eh OUTC .equ 07F98h PINSC .equ 07F9Bh OEB .equ 07F9Dh OUTB .equ 07F97h ACC .equ 0E0h ACC.1 .equ 0E1h ACC.7 .equ 0E7h DPS .equ 086h SP .equ 081h DPL0 .equ 082h DPH0 .equ 083h DPL1 .equ 084h DPH1 .equ 085h ;* ;* Initialisierung der Port's und Pipe's und Register ;* mov SP,#01Fh ;SP auf 1Fh setzen mov DPTR,#OUTB ;Port B auf 00 setzen mov A,#000h movx @DPTR,A mov DPTR,#OUTC ;Port C auf 00 setzen movx @DPTR,A mov DPTR,#OEB ;Port B initialisieren mov A,#0FFh movx @DPTR,A mov DPTR,#OEC ;Port C initialisieren movx @DPTR,A mov DPTR,#OUT2BC ;Out2 klarmachen movx @DPTR,A mov DPTR,#OUT4BC ;Out4 klarmachen movx @DPTR,A ;* ;* Begin des Hauptprogramms ;* mainl1 mov DPTR,#OUT2CS ;Out2 Status abfragen movx A,@DPTR jnb ACC.1,cmd ;Daten bekommen für Display Command mov DPTR,#OUT4CS ;Out4 Status abfragen movx A,@DPTR jnb ACC.1,dat ;Daten bekommen für Display Data ajmp mainl1 ;Loop bis Daten kommen ;* ;* Display Command schreiben ;* cmd mov DPTR,#OUT2BC ;Anzahl der Bytes von Out2 in R0 sichern movx A,@DPTR mov R0,A mov DPTR,#OUT2BUF ;Out2 in DPTR laden inc DPS ;(DPTR1 aktiv) cmdl1 mov DPTR,#OUTC ;PortC in DPTR1 laden inc DPS ;(DPTR aktiv) acall dspbsy ;Display bereit? movx A,@DPTR ;Out2 Buffer lesen inc DPS ;(DPTR1 aktiv) movx @DPTR,A ;und auf PortC(Datenbus) schreiben mov DPTR,#OUTB ;PortB in DPTR1 laden mov A,#000h movx @DPTR,A ;RS=0, R/-W=0, E=0 mov A,#004h movx @DPTR,A ;Enable (B.2) High mov A,#000h movx @DPTR,A ;und alles wieder zurück inc DPL0 ;Out2 DataPointer +1 djnz R0,cmdl1 ;Wiederholen bis alle Daten weg inc DPS ;(DPTR aktiv) mov DPTR,#OUT2BC ;Out2 klarmachen movx @DPTR,A ajmp mainl1 ;* ;* Display Data schreiben ;* dat mov DPTR,#OUT4BC ;Anzahl der Bytes von Out4 in R0 sichern movx A,@DPTR mov R0,A mov DPTR,#OUT4BUF ;Out4 in DPTR laden inc DPS ;(DPTR1 aktiv) datl1 mov DPTR,#OUTC ;PortC in DPTR1 laden inc DPS ;(DPTR aktiv) acall dspbsy ;Display bereit? movx A,@DPTR ;Out4 Buffer lesen inc DPS ;(DPTR1 aktiv) movx @DPTR,A ;und auf PortC(Datenbus) schreiben mov DPTR,#OUTB ;PortB in DPTR1 laden mov A,#001h movx @DPTR,A ;RS=1, R/-W=0, E=0 mov A,#005h movx @DPTR,A ;Enable (B.2) High mov A,#000h movx @DPTR,A ;und alles wieder zurück inc DPL0 ;Out4 DataPointer +1 djnz R0,datl1 ;Wiederholen bis alle Daten weg inc DPS ;(DPTR aktiv) mov DPTR,#OUT4BC ;Out4 klarmachen movx @DPTR,A ajmp mainl1 ;* ;* Display Busy Bit abfragen und warten ;* dspbsy push DPL0 push DPH0 push DPL1 push DPH1 push ACC mov DPTR,#OEC ;PortC(Daten) in DPTR laden mov A,#000h ;PortC(Daten) alle Bits INPUT movx @DPTR,A ; mov DPTR,#OUTB ;PortB(Control) in DPTR laden bsyl1 mov A,#002h ;RS=0; R/-W=1; E=0 movx @DPTR,A ; mov A,#006h ;Enable(B.2)=1 movx @DPTR,A mov DPTR,#PINSC ; movx A,@DPTR ;PortC(Daten) lesen mov R7,A mov DPTR,#OUTB mov A,#000h ;Enable(B.2)=0 movx @DPTR,A mov A,R7 jb ACC.7,bsyl1 ;Display Busy -> warten(bsyl1) mov DPTR,#OEC ;PortC(Daten)-Output Enable in DPTR laden mov A,#0FFh ;PortC(Daten)-Output Enable alle Bits OUTPUT movx @DPTR,A ;setzen pop ACC pop DPH1 pop DPL1 pop DPH0 pop DPL0 ret .end