Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 asm lcd-treiber Kategorie: Programmierung ASM (von setup_exe - 4.10.2004 18:51)


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

Bisherige Antworten:

Re: asm lcd-treiber (von setup_exe - 8.10.2004 10:49)
    Re: asm lcd-treiber (von Topmail - 8.10.2004 18:35)
Re: asm lcd-treiber (von Klaus2m5 - 6.10.2004 20:00)
Re: asm lcd-treiber (von Topmail - 6.10.2004 18:05)
    Re: asm lcd-treiber (von setup_exe - 6.10.2004 18:47)
        Re: asm lcd-treiber (von Topmail - 7.10.2004 12:18)
Re: asm lcd-treiber (von Carsten - 6.10.2004 8:47)
    Re: asm lcd-treiber (von setup_exe - 6.10.2004 18:27)
        Re: asm lcd-treiber (von Topmail - 7.10.2004 18:06)
Re: asm lcd-treiber (von Henrik - 4.10.2004 19:07)
    Re: asm lcd-treiber (von setup_exe - 6.10.2004 19:18)
    Re: asm lcd-treiber (von setup_exe - 6.10.2004 18:53)