
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo Forum, ich hatte am WE mein erstes Assembler-Programm zur Ansteuerung eines LCD geschrieben. Funzt endlich auch. PortC ist Datenport und Bit4 des PortB ist EN (wird als BUS mit 74573 angesteuert). Derzeit kann ich folgende Einsprungadressen nutzen: LCD_INIT &H101 LCD_CLS &H123 LCD_LINE1 &H12B LCD_LINE2 &H130 LCD_LINE3 &H135 LCD_LINE4 &H13A LCD_POSL1 &H13F LCD_POSL2 &H143 LCD_POSL3 &H147 LCD_POSL4 &H14B LCD_PRINT &H17F Mein Problem ist LCD_PRINT. Derzeit übergebe ich an Adresse $0A1 den HEX-Wert des darzustellenden Zeichens. Dabei muss ich bei Zeichen > 1 immer LCD_PRINT erneut aufrufen. Die Zeichen werden gegenüber CC_Basic trotzdem sehr schnell an- gezeigt. Beispiel: sys LCD_LINE1 char = L_ : sys LCD_PRINT char = E_ : sys LCD_PRINT char = I_ : sys LCD_PRINT char = S_ : sys LCD_PRINT char = T_ : sys LCD_PRINT char = U_ : sys LCD_PRINT char = N_ : sys LCD_PRINT char = G_ : sys LCD_PRINT char = DP : sys LCD_PRINT Die Zeichen sind im CC-Basic definiert. Ich würde aber gern schreiben: sys LCD_LINE1:sys LCD_PRINT:print"LEISTUNG:" Leider bin ich dafür ein DAU und würde mich über einen eventuellen Lösungsweg freuen (brauche nur einen Tip wo ich ansetzen muss). Anbei der bisherige asm-Code, mit der Bitte um Verbesserungen: portB .equ $01 portC .equ $02 dirB .equ $05 dirC .equ $06 .org $101 start lda #$ff ; lade accu mit $ff sta dirC ; datenrichtung portC = ausgang lda #$ff ; lade accu mit $ff sta dirB ; datenrichtung portB = ausgang clr portB ; portB = off clr portC ; portC = off ldx #$38 ; lade index mit $38 = Display 8-Bit-Modus bsr stZei ; springe zu stZei lda #$02 ; lade accu mit $02 = Display in 4-Bit-Modus sta portC ; ausgabe portC bset 4,portB ; bit4 portB setzen (High) = EN Display bclr 4,portB ; bit4 portB zurücksetzen (Low) bsr loop1 ; springe zu loop1 ldx #$28 ; lade index mit $28 = ab jetzt 4-Bit-Modus bsr stZei ; springe zu stZei ldx #$0c ; lade index mit $0c = ab jetzt 4-Bit-Modus bsr stZei ; springe zu stZei ldx #$02 ; lade index mit $02 = LCD-CLS bsr stZei ; springe zu stZei ldx #$01 ; lade index mit $01 = LCD-CLS bsr stZei ; springe zu stZei line1 ldx #$80 ; lade index mit $80 = Zeile 1 bsr stZei ; springe zu stZei rts ; return line2 ldx #$C0 ; lade index mit $C0 = Zeile 2 bsr stZei ; springe zu stZei rts ; return line3 ldx #$90 ; lade index mit $90 = Zeile 3 bsr stZei ; springe zu stZei rts ; return line4 ldx #$D0 ; lade index mit $D0 = Zeile 4 bsr stZei ; springe zu stZei rts ; return posL1 lda #$7f ; lade accu mit $7f -> Zeile1 - 1 bra pos ; springe zu pos posL2 lda #$bf ; lade accu mit $bf -> Zeile2 - 1 bra pos ; springe zu pos posL3 lda #$8f ; lade accu mit $8f -> Zeile3 - 1 bra pos ; springe zu pos posL4 lda #$cf ; lade accu mit $cf -> Zeile4 - 1 pos add $0A1 ; addiere accu mit Wert aus Basic-Reg. $0A1 tax ; lade index mit accu bsr stZei ; springe zu stZei rts ; return stZei txa ; lade accu mit index lsra ; shr -> 4x rechtsverschieben (4-Bit!) lsra ; shr upper-bits!!! lsra ; shr upper-bits!!! lsra ; shr upper-bits!!! ora #$00 ; oder accu mit $00 -> Steuerzeichen! sta portC ; Ausgabe portC mit Inhalt von accu bset 4,portB ; bit4 portB setzen (High) = EN Display bclr 4,portB ; bit4 portB zurücksetzen (Low) bsr loop1 ; springe zu loop1 txa ; lade accu mit index and #$0f ; und accu mit $0f -> lower-bits!!! ora #$00 ; oder accu mit $00 -> Steuerzeichen! sta portC ; Ausgabe portC mit Inhalt von accu bset 4,portB ; bit4 portB setzen (High) = EN Display bclr 4,portB ; bit4 portB zurücksetzen (Low) bsr loop3 ; springe zu loop3 rts ; return loop1 lda #$1e ; load accumulator with value #$1e loop2 deca ; decrement accumulator bne loop2 ; branch if not equal (Z is clear) rts ; return from subroutine loop3 lda #$05 ; lade accu mit $05 loop4 decx ; index -1 bne loop4 ; springe zu loop4, wenn index nicht 0 deca ; accu -1 bne loop4 ; springe zu loop4, wenn accu nicht 0 rts ; return from subroutine print lda $0A1 ; lade accu mit Basic-Register 0A1 lsra ; shr -> 4x rechtsverschieben (4-Bit!) lsra ; shr upper-bits!!! lsra ; shr upper-bits!!! lsra ; shr upper-bits!!! ora #$20 ; oder accu mit $20 -> Zeichen schreiben sta portC ; Ausgabe portC mit Inhalt von accu bset 4,portB ; bit4 portB setzen (High) = EN Display bclr 4,portB ; bit4 portB zurücksetzen (Low) bsr loop1 ; springe zu loop1 lda $0A1 ; lade accu mit Basic-Register 0A1 and #$0f ; und accu mit $0f -> lower-bits!!! ora #$20 ; oder accu mit $20 -> Zeichen schreiben sta portC ; Ausgabe portC mit Inhalt von accu bset 4,portB ; bit4 portB setzen (High) = EN Display bclr 4,portB ; bit4 portB zurücksetzen (Low) bsr loop3 ; springe zu loop3 rts ; return .end Ich habe mir mit der Formatierung echt Mühe gegeben, dass Ihr auch alles lesen könnt. Vielen Dank für das Lesen dieses langen Threads. Cu Dominique |
| Antwort schreiben |