PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD ansteuern??



frank85
22.07.2007, 17:50
Hallo. Hab Probleme mein LCD anzusteuern. Habe diesen code vom Herrn Sprut und habe ihn soweit auf mein Board umgeschrieben. Bin ihn paar mal durchgegangen und finde keinen Fehler. MPLAB akzeptiert ihn jedenfalls, aber mein Board nicht. Wäre sehr dankbar wenn jemand mal einen Blick darauf werfen würde. Vielen dank im vorraus.




list p=18f8520 ;der Prozessortyp wird festgelegt
include "p18f8520.inc"

;PIN-Belegung
;************************************************* ************************************
;
; PORTJ: RJ2 - Register select (RS)
; RJ3 - Read and Write (R/W not)
; RJ4 - Enable (E)
;
; PORTH: RH0 - D0
; RH1 - D1
; .
; .
; RH7 - D7
;************************************************* ************************************


;Configuration bits
CONFIG OSC = HS ; HS 20 MHz
CONFIG PWRT = ON ; power up timer on
CONFIG BOR = OFF ; brown out detect off
CONFIG WDT = Off ; watchdog off
CONFIG LVP = OFF ; lvp off
;************************************************* ************************************
; Variablen festlegen


LcdDaten EQU 0x20
LcdStatus EQU 0x23
loops EQU 0x24
loops2 EQU 0x25


; PIC wird initialisiert
org 0x0002C
goto Init


Init clrf TRISA ; alle PINs als output gesetzt
clrf PORTA ; alle PINs auf low ziehen
clrf TRISH ; alle PINs als output gesetzt
clrf PORTH ; alle PINs auf low ziehen
clrf TRISJ ; alle PINs als output gesetzt
clrf PORTJ ; alle PINs auf low ziehen

call InitLCD ; springe zur LCD Initialisierung

; am LCD "Hallo" ausgeben

movlw B'01001000' ; 'H' in Bitweise
movwf LcdDaten
call OutLcdDaten

movlw 'a'
movwf LcdDaten
call OutLcdDaten

movlw 'l'
movwf LcdDaten
call OutLcdDaten

movlw 'l'
movwf LcdDaten
call OutLcdDaten

movlw 'o'
movwf LcdDaten
call OutLcdDaten

sleep
;************************************************* ****************
;Zeitverzögerung um loops * 1 ms
; 10MHz externer Takt bedeutet 2,5MHz interner Takt
; also dauert 1 ms genau 2500 Befehle
; 249 Schleifen a 10 Befehle sind 996 Befehle = 0.996 ms
; die restlichen 25 Befehle für Einsprung und Rücksprung

WAIT
top movlw .249 ; 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

bcf PORTJ, 2
bcf PORTJ, 3
bsf PORTJ, 4 ; Enable low -> high
nop
bcf PORTJ, 4 ; Enable high -> low

movlw D'50' ; 50 ms Pause
movwf loops
call WAIT

movlw B'00110000' ; 1
call Control8Bit
movlw B'00110000' ; 2
call Control8Bit
movlw B'00110000' ; 3
call Control8Bit

movlw B'00000001' ; 4 löschen und cusor home
call OutLcdControl
movlw B'00111000' ; 5 function set, 8-bit 2-zeilig, 5x8
call OutLcdControl
movlw B'00001000' ; 6 display off
call OutLcdControl
movlw B'00000110' ; 7 entry mode, increment, disabldisplay-shift
call OutLcdControl
movlw B'00000011' ; 8 cursor home
call OutLcdControl
movlw B'00001011' ; 9 display on
call OutLcdControl
return

Control8Bit
movwf PORTH
bsf PORTJ, 4
nop
bcf PORTJ, 4
movlw D'10'
movwf loops
call WAIT
return


; darauf warten, daß das Display bereit zur Datenannahme ist
LcdBusy
bsf PORTA, 1 ; Test LED 1 on
movlw B'11111111' ; alle PINs inputs
movwf TRISH

BusyLoop
bcf PORTJ, 2 ; Steuerregister
bsf PORTJ, 3 ; lesen
bsf PORTJ, 4 ; Enable
nop
movf PORTH, w
movwf LcdStatus
bcf PORTJ, 4 ; Disable
btfsc LcdStatus, 7 ; teste bit 7
goto BusyLoop
bcf PORTJ, 3
clrf TRISH
bcf PORTA, 1 ; Test LED 1 off
return

; ein Byte mit Steuerdaten von LcdDaten zum Display übertragen
OutLcdControl
movwf LcdDaten
call LcdBusy
movf LcdDaten, w
movwf PORTH
bsf PORTJ, 4 ;Enable
nop
bcf PORTJ, 4 ; Disable LcdBus
return

; ein Datenbyte von LCDDaten zum Display übertragen
OutLcdDaten
bsf PORTA, 2 ; Test LED 2 on
call LcdBusy
movf LcdDaten, w
movwf PORTH
bsf PORTJ, 2 ; Daten
bsf PORTJ, 4 ; Enable LcdBus
nop
bcf PORTJ, 4 ;Disable
bcf PORTJ, 2
bcf PORTA, 2 ; Test LED 2 on
return

end

frank85
23.07.2007, 22:53
Ich habe es hinbekommen :D

Die PINs vom PORTH des PIC18F8520 sind nach dem Reset nicht als digitale I/O configuriert. Sondern zur hälfe analog. Zum glück habe ich die Simulation im MPLAB gefunden. Mit der ich dann auch genau sehen konnte wie die PINS gesetzt wurden. Falls jemand Fragen dazu hätte, ich stehe gerne zu Verfügung.