Endlich habe ich alles in den Griff bekommen! 
Habe nun alle "Bugs" gefunden und bin nun in der Lage Zeichen auf dem LCD anzeigen zu lassen. Nach Tagen...
Hier der neue CODE:
Code:
list p=16f84a
;*******************************************************************************
;* PIN Belegung
;*
;* PORTA: 0 - RS
;* 1 - RW
;* 2 - E1
;* 3 - TEST LED
;*
;* PORTB: 0..7 - D0..D7
;*
;*******************************************************************************
;*******************************************************************************
#include <p16f84a.inc>
;*******************************************************************************
;* Config
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;******************************************************************************
; Variablen
count equ 0x20
time equ 0x21
confg equ 0x22
daten equ 0x23
flag equ 0x24
; Konstanten
#define RS PORTA, 0
#define RW PORTA, 1
#define E1 PORTA, 2
#define LED PORTA, 3
;_____________________________________________________________________________
;*****************************************************************************
; PROGRAMM START
;**************************
;* PIC Initialisierung *
;**************************
Init
bsf STATUS, RP0 ; Bank 1
movlw B'00000000' ; RA0 ..RA4 outputs
movwf TRISA ;
movlw B'00000000' ; PortB alle outputs
movwf TRISB
bcf STATUS, RP0 ; Bank 0
clrf PORTA
clrf PORTB
;**************************
;* LCD Initialisierung *
;**************************
InitLCD
movlw D'255' ; 250 ms Pause nach dem Einschalten
movwf time
call w_ms
movlw B'00110000'
movwf PORTB
bsf E1
nop
bcf E1
movlw .5 ; 5 ms Pause
movwf time
call w_ms
movlw B'00110000'
movwf PORTB
bsf E1
nop
bcf E1
movlw .20 ; 100 mikro sekunden warten
movwf time
call w_us
movlw B'00110000'
movwf PORTB
bsf E1
nop
bcf E1
movlw B'00110000' ; function set, 8-bit 2-zeilig, 5x7
call Lcd_set
movlw B'00001000' ; off
call Lcd_set
movlw B'00000110' ; entry mode, increment, cursr shift
call Lcd_set
movlw B'00000011' ; cursor home
call Lcd_set
movlw B'00001111' ; on
call Lcd_set
;**********************************************
;* Zeichen Test *
;* *
;* (test)!! *
;**********************************************
bsf LED
call w_ms
bcf LED
movlw '1'
movwf daten
call wrte
bsf LED
bcf LED
movlw '2'
movwf daten
call wrte
bsf LED
bcf LED
movlw '3'
movwf daten
call wrte
bsf LED
bcf LED
movlw '4'
movwf daten
call wrte
bsf LED
bcf LED
movlw '5'
movwf daten
call wrte
bsf LED
bcf LED
noend
goto noend
;************************************
;* LCD Config (write) *
;* Steuerbefehle ausführen *
;************************************
Lcd_set ; OK
movwf confg
call BusyFlag ; !! RS RW = 0 zu dem Zeitpunkt !!
movf confg, w
movwf PORTB ; Daten schreiben
bsf E1
nop
bcf E1 ; Disable LcdBus
return
;***********************************
;* LCD Ausgabe *
;* Zeichen ausgeben *
;***********************************
wrte
bsf LED ; Test LED on
movwf daten
call BusyFlag
movf daten, w
movwf PORTB ; Daten schreiben
bsf RS ; Daten
bsf E1 ; Enable LcdBus
nop
bcf E1 ; Disable LcdBus
bcf RS ;
bcf LED ; Test LED off
return
;**************************
;* CHCK BusyFlag *
;**************************
BusyFlag
bsf LED ; Test LED on
bsf STATUS, RP0 ; make Port B0..7 input
movlw B'11111111'
movwf TRISB
bcf STATUS, RP0
BusyLoop
bcf RS
bsf RW ; LESEN
bsf E1
nop
movf PORTB, w
movwf flag
bcf E1
nop
bsf E1 ; Enable
nop
bcf E1
btfsc flag, 7 ; teste bit 7
goto BusyLoop
bcf RW
bsf STATUS, RP0 ; make Port B4..7 output
movlw B'00000000'
andwf TRISB, f
bcf STATUS, RP0
bcf LED ; Test LED off
return
;*************************
;* Warteschleife µs *
;*************************
w_us
loop nop
nop
decfsz time, f
goto loop
return
;*************************
;* Warteschleife ms *
;*************************
w_ms
movlw .112
movwf count
loop_ms nop
nop
nop
nop
nop
nop
decfsz count, f
goto loop_ms
decfsz time, f
goto w_ms
return
end
falls es jemandem irgendwie weiterhelfen sollte...
Gruß
Lukas
Lesezeichen