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)