Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

ext. LCD mit Assembler Kategorie: Progr. Assembler, TaskingTools, OS (von Thomas, http://www.tho-bai.de - 29.03.2005 17:20)
Ich nutze:
C-Control II Unit, CC2-Application-Board
Hi,

habe ein "kleines" Programm in Assembler geschrieben, das das externe LCD an Port 1 ansteuern soll.
Zunächst einmal habe ich noch nicht herausgefunden, welcher Zeichensatz für das mit dem Aplication Board
mitgelieferte LCD zutrifft, aber ich bekomme auch nur eher komische Ausgaben. Der folgende Code lässt den
Cursor kurz aufblinken und zeigt dann eine 4 an. Diese steht jedoch nicht am Anfang der Zeile sondern mittendrin.
Das Busy-Flag habe ich wieder auskommentiert, die Aufrufe sind also wirkungslos. Andernfalls bekomme ich
gar keine Ausgabe...hoffe mir kann da jemand helfen.

Das Programm läuft ohne OS im Segment 0. Hier der Code:


$case
$nonsegmented                   ;keine Segmentierung, da nur in Seg0 gearbeitet wird
$model(medium)
$extend
$nomod166
$stdnames(reg164ci.def)

        regdef  R0-R15

text    EQU     'H'

;----------------------------------------------------------------------
;Reset-Vektor
;----------------------------------------------------------------------
start           SECTION CODE WORD AT 0
jump2_main      PROC    NEAR
                JMP     main
jump2_main      ENDP
start           ENDS

;----------------------------------------------------------------------
;Interrupt-Vektor fr Timer 7
;----------------------------------------------------------------------
T7_INT          SECTION CODE WORD AT 0F4h
int_T7          PROC    NEAR
                JMP     tim7_int
int_T7          ENDP
T7_INT          ENDS

;----------------------------------------------------------------------
;logische Sektion fr Programmcode
;----------------------------------------------------------------------
code_s          SECTION CODE WORD AT 200h

;----------------------------------------------------------------------
;Timer-3-Initialisierung
;----------------------------------------------------------------------
init_timer3     PROC    NEAR

                MOV     R4,#0
                MOV     T3,R4                   ;T3 zurcksetzen
                MOV     T3IC,R4                 ;Interupt fr T3 deaktivieren
                MOV     T3CON,#100B             ;Aufl???ung=6,4us

                RET
init_timer3     ENDP

;----------------------------------------------------------------------
;Timer-7-Initialisierung
;----------------------------------------------------------------------
init_timer7     PROC    NEAR

                MOV     R3,#1011000B            ;Konfiguration fr T7IC
                MOV     R4,#0                   ;Startwert fr T7

                MOV     T7,R4                   ;T7 zurcksetzen
                MOV     T7REL,R2                ;Reload-Wert Timer 7 = R2
                MOV     T7IC,R3                 ;Interupt T7 ein
                MOV     T78CON,#1000100B        ;Timer 7 starten, Periode=420ms

                BSET    IEN                     ;Interrupt Enable
                RET                             ;Rcksprung
init_timer7     ENDP

;----------------------------------------------------------------------
;Interrupt-Routine fr Timer 7
;----------------------------------------------------------------------
timer7_int      PROC    TASK INTNO=3Dh

tim7_int:       XOR     P1L,R10                 ;LEDs invertieren
                RETI                            ;Rcksprung vom Interrupttimer_int

timer7_int      ENDP

;----------------------------------------------------------------------
;Hauptprogramm
;----------------------------------------------------------------------
pa4cc2          PROC    NEAR

main:           ;Initialisierung
                DISWDT                          ;Watchdogtimer beenden
                MOV     STKOV,#0FA00H           ;Stackgrenzen initialisieren
                MOV     STKUN,#0FC00H
                MOV     SP,#0FC00H              ;Stack-Pointer initialisieren
                MOV     CP,#0FC00H              ;Context-Pointer initilisieren
                BFLDL   BUSCON0,#37H,#15H       ;Buskonfiguration
                BFLDH   BUSCON0,#12H,#00H
                BFLDL   SYSCON,#04H,#04H        ;Systemkonfiguration
                BFLDH   SYSCON,#0FFH,#00H
                EINIT                           ;Ende der Initialisierung

                EXTR    #1                      ;extended Register
                MOV     DP1L,#0FFh              ;P1L.6 auf Ausgang

                CALL    init_timer3             ;Timer initialisieren

                MOV     R14,#30                 ;sleep(30)
                CALL    sleep
                CALL    check_bf

                BCLR    P1L.0                   ;Funktionsmodus
                MOV     R14,#10
                CALL    sleep
                ;CALL  check_bf


                MOV     R14,#20         ;sleep(2)
                CALL    sleep
                ;CALL  check_bf


                MOV     R2,#30h                 ;8-Bit Modus
                CALL    lcd_write_nibble
                MOV     R14,#20         ;sleep(2)
                CALL    sleep
                CALL    check_bf
                MOV     R2,#08h                 ;2-zeilig
                CALL    lcd_write_nibble
                MOV     R14,#20         ;sleep(2)
                CALL    sleep
                CALL    check_bf
                MOV     R2,#20h                 ;4-Bit, 1-zeilig, 5x8-Punkt
                CALL    lcd_write_nibble
                MOV     R14,#20         ;sleep(2)
                CALL    sleep
                CALL    check_bf


                ;MOV   R2,#20h+8h              ;Function_Mode+Two_Line
                MOV     R2,#28h
                CALL    lcd_write_4_Bit
                MOV     R14,#50                 ;Sleep 5
                CALL    sleep
                CALL    check_bf
                ;MOV   R2,#20h+8h              ;Function_Mode+Two_Line
                MOV     R2,#28h
                CALL    lcd_write_4_Bit
                MOV     R14,#200                        ;Sleep 2
                CALL    sleep
                CALL    check_bf
                MOV     R2,#40                  ;Entry_Mode
                CALL    lcd_write_4_Bit
                MOV     R14,#20                 ;Sleep 2
                CALL    sleep
                CALL    check_bf
                MOV     R2,#400                 ;Entry_Mode
                CALL    lcd_write_4_Bit
                MOV     R14,#20                 ;Sleep 2
                CALL    sleep
                CALL    check_bf
                ;MOV   R2,#8h+4h               ;display+display_on
                MOV     R2,#0Ch
                CALL    lcd_write_4_Bit
                MOV     R14,#20                 ;Sleep 2
                CALL    sleep
                CALL    check_bf
                MOV     R2,#80h                 ;Set DDRAM
                CALL    lcd_write_4_Bit
                MOV     R14,#20                 ;Sleep 2
                CALL    sleep
                CALL    check_bf

                BSET    P1L.0                   ;Datenmodus
                MOV     R14,#10
                CALL    sleep                   ;Sleep 1
                CALL    check_bf

                BCLR    P1L.0                   ;Funktionsmodus
                MOV     R14,#100
                CALL    sleep                   ;Sleep 1
                CALL    check_bf

                MOV     R2,#1                   ;Clear Display
                CALL    lcd_write_4_Bit

                MOV     R14,#100
                CALL    sleep           ;1Sek warten
                CALL    check_bf

                MOV     R2,#0Fh                 ;Cursor einschalten
                CALL    lcd_write_4_Bit

                MOV     R14,#1000
                CALL    sleep                   ;1Sek warten
                CALL    check_bf


                BSET    P1L.0                   ;Datenmodus
                MOV     R14,#10
                CALL    sleep                   ;Sleep 1
                CALL    check_bf

                ;BSET  P1L.0                   ;Datenmodus
                ;MOV   R14,#1000
                ;CALL  sleep

                MOV     R2,#10101011b
                CALL    lcd_write_4_Bit




endl:           JMP     endl                    ;Endlosschleife

lcd_write_nibble:
                ;Daten in R2
                BCLR    P1L.1                   ;Schreibmodus
                MOV     R14,#10
                CALL    sleep
                ;CALL  check_bf

                AND     R2,#0F0h                ;Low-Nibble loeschen

                MOV     R1,P1L                  ;High-Nibble loeschen
                AND     R1,#0Fh
                ;AND   P1L,R1

                ;SHR   R2,#4                   ;->Low-Nibble
                ;MOV   P1L,R2                  ;Set Nibble

                OR      R1,R2                   ;Set Nibble
                MOV     P1L,R1

                BSET    P1L.2                   ;Pulse
                MOV     R3,#800                 ;8xNOP
                CALL    nop_wait
                ;CALL  check_bf

                BCLR    P1L.2
                MOV     R14,#60
                CALL    sleep                   ;sleep 6ms
                ;CALL  check_bf

                RET

lcd_write_4_Bit:
                ;Daten in R2
                BCLR    P1L.1                   ;Schreibmodus
                MOV     R4,R2                   ;Temp

                ;Daten - Low-Nibble loeschen
                AND     R2,#0F0h

                ;P1L
                MOV     R1,P1L                  ;High-Nibble loeschen
                AND     R1,#0Fh

                OR      R1,R2                   ;Set Nibble
                MOV     P1L,R1



                MOV     R14,#10
                CALL    sleep


                ;AND   R2,#0F0h                ;Low-Nibble loeschen
                ;SHR   R2,#4                   ;->Low-Nibble
                ;MOV   P1L,R2                  ;Set Nibble

                BSET    P1L.2                   ;Pulse
                MOV     R3,#800
                CALL    nop_wait
                BCLR    P1L.2
                CALL    nop_wait

                ;CALL  check_bf

                ;Low-Nibble of Byte
                MOV     R2,R4                   ;Temp->R2
                AND     R2,#0Fh                 ;HIGH-Nibble loeschen
                SHL     R2,#4                   ;Low->High-Nibble

                ;P1L
                MOV     R1,P1L
                AND     R1,#0Fh                 ;High-Nibble loeschen

                OR      R2,R1
                MOV     P1L,R2                  ;Set Nibble

                MOV     R14,#100
                CALL    sleep


                BSET    P1L.2                   ;Pulse
                MOV     R3,#800
                CALL    nop_wait
                BCLR    P1L.2
                CALL    nop_wait

                ;CALL  check_bf

                RET


check_bf:       ;BCLR  P1L.0
                ;BSET  P1L.1
wait_bf:        ;JB    P1L.7,wait_bf
                RET


nop_wait:
                ;Anzahl der OP in R3
                CMPD1   R3,#0                   ;Vergleich R3 mit 0 und Dek. um 1
                JMPR    cc_NE,nop_wait
                RET







;----------------------------------------------------------------------
;Warte-Routine (R14*1 ms)
;----------------------------------------------------------------------
sleep:          MOV     T3,#0
                BSET    T3R

sl_loop:        CMPD1   R14,#0                  ;R14==0?, R14=R14-1
                JMPR    CC_EQ, sl_end           ;Wartezeit beendet=>sl_end
                CALL    timer3                  ;1 ms warten
                JMP     sl_loop                 ;zum Schleifenanfang

;Ende der Sleepzeit
sl_end:         BCLR    T3R                     ;Timer beenden
                RET                             ;Rcksprung

;Timerschleife
timer3:
                MOV     R4,T3                   ;Timer 7 in r4 laden
                CMP     R4,#156                 ;Periodenende?
                JMPR    cc_UGE, timeout         ;wenn ja -> timeout
                JMP     timer3                  ;weiter prfen

;Timerberlauf
timeout:        MOV     T3,#0                   ;Timer zurcksetzen
                RET                             ;Rcksprung in sl_loop

pa4cc2          ENDP

code_s          ENDS
                END


Vielen Dank schonmal für eure Hilfe

GruÃ?

Thomas

Meine Seite: http://www.tho-bai.de


    Antwort schreiben


Antworten:

Re: ext. LCD mit Assembler (von André H. - 16.05.2005 12:54)
    Re: ext. LCD mit Assembler (von TManiac - 8.06.2005 11:27)
        Re: ext. LCD mit Assembler (von Thomas - 4.09.2005 21:09)