stowoda
22.08.2005, 17:22
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
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
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.
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
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
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
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.
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