ext. LCD mit Assembler Kategorie: Progr. Assembler, TaskingTools, OS (von Thomas, http://www.tho-bai.de - 29.03.2005 17:20) | ||
| ||
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) |