Sonic111
04.11.2007, 00:23
Hallo zusammen !
Ich habe mich heute zum ersten mal mit Displays beschäftigt (Displaytech 161A).
Als Vorlage habe ich den Quellcode von sprut genommen.
Ich komme aber beim Init nicht weiter. Das Display schaltet auf 8 Zeichen, aber die nächste Anweisung "Display Off" funktioniert nicht, das Display geht nicht aus.
Ich finde den Fehler nicht, Kabelanschlüsse sind ok.
Könnt Ihr mir helfen ? Was ist denn beim Init falsch, wieso geht das Display nicht aus ?
Gruß
Heiko
Das ist mein Programm :
list p=16f84a
;************************************************* *************
;* Pinbelegung
;* ----------------------------------
;* PORTA:
;* 0 - RS
;* 1 - R/W
;* 2 - E
;* 3 -
;* 4 -
;* PORTB:
;* 0 - 7 LCD Display DB0 - DB7
;*
;*
;************************************************* *************
; Includedatei für den 16F84 einbinden
#include <P16f84A.INC>
; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;************************************************* *************
; Variablen festlegen
loops EQU 0x24
loops2 EQU 0x25
; Constanten festlegen
LcdE equ 2 ; enable Lcd (An PortA)
LcdRW equ 1 ; read Lcd (An PortA)
LcdRS equ 0 ; Daten Lcd (An PortA)
;************************************************* *******
; Das Programm beginnt mit der Initialisierung
Init
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortA/B alle output
movwf TRISB ; Internes Register im PIC für PORTB ändern
movwf TRISA ; Internes Register im PIC für PORTA ändern
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTB ; PortB auf Null
clrf PORTA ; PortA auf Null
call InitLCD ; Display initialisieren
sleep
Main
goto Main
;************************************************* ****************
;Zeitverzögerung um loops * 1 ms
; 4MHz externer Takt bedeutet 1MHz interner Takt
; also dauert 1 ms genau 1000 Befehle
; 110 Schleifen a 9 Befehle sind 990 Befehle = 0.99 ms
; die restlichen 10 Befehle für Einsprung und Rücksprung
WAIT
top movlw .110 ; timing adjustment variable (1ms)
movwf loops2
top2 nop ; sit and wait
nop
nop
nop
nop
nop
decfsz loops2, F ; inner loops complete?
goto top2 ; no, go again
;
decfsz loops, F ; outer loops complete?
goto top ; no, go again
retlw 0 ; yes, return from subWAIT
;************************************************* *********
; Initialisierung des LCD-Displays
InitLCD
movlw D'255' ; 250 ms Pause nach dem Einschalten
movwf loops
call WAIT
movlw B'00000000' ;1
movwf PORTA
movlw B'00110000'
movwf PORTB
call EnableSignal
movlw D'5' ; 5 ms Pause
movwf loops
call WAIT
movlw B'00000000' ;2
movwf PORTA
movlw B'00110000'
movwf PORTB
call EnableSignal
movlw D'5' ; 5 ms Pause
movwf loops
call WAIT
movlw B'00000000' ;3
movwf PORTA
movlw B'00110000'
movwf PORTB
call EnableSignal
nop
movlw D'150' ; 150 ms Pause
movwf loops
call WAIT
movlw B'00000000' ;4 Function Set - Display auf 8 Zeichen
movwf PORTA
movlw B'00111000'
movwf PORTB
call EnableSignal
; --- Bis hier OK.
movlw B'00000000' ; Display Aus - funktioniert nicht, warum ?
movwf PORTA
movlw B'00001000'
movwf PORTB
call EnableSignal
; movlw B'00000000' ; 6 Display Clear - erstmal heraus
; movwf PORTA
; movlw B'00000001'
; movwf PORTB
; call EnableSignal
; nop
; movlw B'00000000' ; 7 Entry Mode Set
; movwf PORTA
; movlw B'00000110'
; movwf PORTB
; call EnableSignal
return
EnableSignal
bsf PORTA, LcdE ; Enable Impuls setzen
nop
movlw D'50' ; 50 ms Pause
movwf loops
call WAIT
bcf PORTA, LcdE ; Enable Impuls löschen
return
Ich habe mich heute zum ersten mal mit Displays beschäftigt (Displaytech 161A).
Als Vorlage habe ich den Quellcode von sprut genommen.
Ich komme aber beim Init nicht weiter. Das Display schaltet auf 8 Zeichen, aber die nächste Anweisung "Display Off" funktioniert nicht, das Display geht nicht aus.
Ich finde den Fehler nicht, Kabelanschlüsse sind ok.
Könnt Ihr mir helfen ? Was ist denn beim Init falsch, wieso geht das Display nicht aus ?
Gruß
Heiko
Das ist mein Programm :
list p=16f84a
;************************************************* *************
;* Pinbelegung
;* ----------------------------------
;* PORTA:
;* 0 - RS
;* 1 - R/W
;* 2 - E
;* 3 -
;* 4 -
;* PORTB:
;* 0 - 7 LCD Display DB0 - DB7
;*
;*
;************************************************* *************
; Includedatei für den 16F84 einbinden
#include <P16f84A.INC>
; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;************************************************* *************
; Variablen festlegen
loops EQU 0x24
loops2 EQU 0x25
; Constanten festlegen
LcdE equ 2 ; enable Lcd (An PortA)
LcdRW equ 1 ; read Lcd (An PortA)
LcdRS equ 0 ; Daten Lcd (An PortA)
;************************************************* *******
; Das Programm beginnt mit der Initialisierung
Init
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortA/B alle output
movwf TRISB ; Internes Register im PIC für PORTB ändern
movwf TRISA ; Internes Register im PIC für PORTA ändern
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTB ; PortB auf Null
clrf PORTA ; PortA auf Null
call InitLCD ; Display initialisieren
sleep
Main
goto Main
;************************************************* ****************
;Zeitverzögerung um loops * 1 ms
; 4MHz externer Takt bedeutet 1MHz interner Takt
; also dauert 1 ms genau 1000 Befehle
; 110 Schleifen a 9 Befehle sind 990 Befehle = 0.99 ms
; die restlichen 10 Befehle für Einsprung und Rücksprung
WAIT
top movlw .110 ; timing adjustment variable (1ms)
movwf loops2
top2 nop ; sit and wait
nop
nop
nop
nop
nop
decfsz loops2, F ; inner loops complete?
goto top2 ; no, go again
;
decfsz loops, F ; outer loops complete?
goto top ; no, go again
retlw 0 ; yes, return from subWAIT
;************************************************* *********
; Initialisierung des LCD-Displays
InitLCD
movlw D'255' ; 250 ms Pause nach dem Einschalten
movwf loops
call WAIT
movlw B'00000000' ;1
movwf PORTA
movlw B'00110000'
movwf PORTB
call EnableSignal
movlw D'5' ; 5 ms Pause
movwf loops
call WAIT
movlw B'00000000' ;2
movwf PORTA
movlw B'00110000'
movwf PORTB
call EnableSignal
movlw D'5' ; 5 ms Pause
movwf loops
call WAIT
movlw B'00000000' ;3
movwf PORTA
movlw B'00110000'
movwf PORTB
call EnableSignal
nop
movlw D'150' ; 150 ms Pause
movwf loops
call WAIT
movlw B'00000000' ;4 Function Set - Display auf 8 Zeichen
movwf PORTA
movlw B'00111000'
movwf PORTB
call EnableSignal
; --- Bis hier OK.
movlw B'00000000' ; Display Aus - funktioniert nicht, warum ?
movwf PORTA
movlw B'00001000'
movwf PORTB
call EnableSignal
; movlw B'00000000' ; 6 Display Clear - erstmal heraus
; movwf PORTA
; movlw B'00000001'
; movwf PORTB
; call EnableSignal
; nop
; movlw B'00000000' ; 7 Entry Mode Set
; movwf PORTA
; movlw B'00000110'
; movwf PORTB
; call EnableSignal
return
EnableSignal
bsf PORTA, LcdE ; Enable Impuls setzen
nop
movlw D'50' ; 50 ms Pause
movwf loops
call WAIT
bcf PORTA, LcdE ; Enable Impuls löschen
return