Hallo!
Mühe mich schon seit einiger Zeit ab, mit der Initialisierung eines LCDs mithilfe eines PICs.
Wie schon bemerkt handelt es sich um den P16F84A und ein 4x27 LCD mit 2xHD44780.
Hier ist übrigens etwas über die Vorgehensweise bei der Initialisierung des LCDs zu finden: http://home.arcor.de/stowoda/Text-LCDs.pdf
Wenn ich den Saft einschalte dann seh ich manchmal einen Cursor und anschliessend ein Rautezeichen in der ersten Zeile, manchmal tauchen die Zeichen aber an anderen Stellen auf nicht immer am Anfang. Jedoch immer in der ersten Zeile.Code:list p=16f84a ;*************************************************************************** ; PINBELEGUNG ; ; ; PORTA: 0 - RS ; 1 - RW ; 2 - E1 1.Controller ; 3 - E2 2.Controller ; 4 - ; ; PORTB: 0 - D0 ; . - .. ; . - .. ; 7 - D7 ; ;************************************************************************** #include <P16F84A.INC> __CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC ;*********************************************** ; VARIABLEN schleife equ 0x20 schleife2 equ 0x21 schleife3 equ 0x22 Daten equ 0x23 count equ 0x24 count2 equ 0x25 #define RS PORTA, 0 #define RW PORTA, 1 #define E1 PORTA, 2 #define E2 PORTA, 3 ;*********************** ;Initialisierung Init bsf STATUS, RP0 movlw B'00000000' movwf TRISA movwf TRISB bcf STATUS, RP0 clrf PORTA clrf PORTB ;**************************** ;LCD Initialisierung LCD_Init movlw 0x30 movwf Daten movlw D'15' ; 15 ms movwf count call Wait_ms call LCD_write_conf ; 30h ins Steuerregister movlw D'5' ; 5 ms movwf count call Wait_ms call LCD_write_conf ; 30h ins Steuerregister call Wait_us ; 100 us call LCD_write_conf ; 30h ins Steuerregister movlw 0x30 ; System Set, eine Zeile movwf Daten call LCD_write_conf movlw B'00001000' ; LCD off movwf Daten call LCD_write_conf movlw B'00000001' ; LCD clear movwf Daten call LCD_write_conf movlw B'00000110' ; Entry mode set movwf Daten call LCD_write_conf movlw B'00001101' ; LCD on movwf Daten call LCD_write_conf ;************************************************** ; TEST, sende den Buchstaben A zum LCD movlw B'00110000' movwf Daten call LCD_write Main goto Main ;************************************************************* LCD_write_conf bcf RS ; RS=0 --> Steuerregister bcf RW ; RW=0 --> Schreiben nop bsf E1 nop movf Daten, w movwf PORTB nop bcf E1 ; fallende Flanke von E nop return ;****************************************************************** LCD_write call Wait_us call Wait_us bsf RS bcf RW nop bsf E1 nop movlw Daten movwf PORTB nop bcf E1 nop return ;******************************************************** ;Warteschleife Wait_ms movf count, 0 movwf schleife Wait2 movlw .110 ; Konstante movwf schleife2 Wait3 nop nop nop nop nop nop ; nop ; decfsz schleife2, F ; goto Wait3 ; decfsz schleife, F goto Wait2 return ;*************************************************************** ; Warteschleife 100us Wait_us movlw .25 ; Konstante movwf schleife2 Wait_us2 nop nop ; nop ; decfsz schleife2, F ; goto Wait_us2 ; return end
Nach mehrmaliger Betätigung des Reset-Tasters sehe ich verschiedene Resultate und der Cursor springt, anscheinend zufällig in der ersten Zeile rum.
Kann es sein, dass in meinem Code das Timing nicht stimmt?
Könnte das jemand nachprüfen ( ob die Verzögerungsschleifen richtig gebaut sind? )
mfg und thx







Zitieren

Lesezeichen