Gast
#20094
Hallo
ich habe da ein Problem mit einem Pic16F84, der soll bei einer
Quarzfreqenz von 32,768Khz ein LC-Display im 4bit-Modus ansteuern.
Zum Problem: Es klappt nicht! Genauer gesagt es klappt nicht bei Quarz,
denn sobalt ich einen 4MHz Quarz einsetze läuft das Programm auf anhieb.
Hier das Programm:
include p16f84.inc
_T equ b'01010100'
_l equ b'01101100'
_o equ b'01101111'
STATUS2 equ 20 ; REGISTER 20
LCDBSY2 equ 6
LCDDATA equ 21 ; REGISTER 21
E equ 1 ; PORTB,1
RS equ 2 ; PORTB,2
RW equ 3 ; PORTB,3
LCD equ PORTB
BSY equ 7 ; PORTB,7
;################################################################
clrf STATUS
clrf STATUS2
goto Start
Busy_Flag
movlw b'00000001'
andwf LCD,F
bsf STATUS,RP0
bsf LCD,BSY ; PORTB,7 ist Eingang
bcf STATUS,RP0
bsf LCD,RW
bsf LCD,E
bcf STATUS2,LCDBSY2
btfsc LCD,BSY
bsf STATUS2,LCDBSY2
bcf LCD,E
bsf LCD,E
bcf LCD,E
btfsc STATUS2, LCDBSY2
goto Busy_Flag
bsf STATUS,RP0
bcf LCD,BSY
bcf STATUS,RP0
return
SchreibeBefehlLCD
movwf LCDDATA
call Busy_Flag
goto Uebertagung
SchreibeDatenLCD
movwf LCDDATA
call Busy_Flag
bsf LCD, RS
Uebertagung
bcf LCD, RW
movf LCDDATA,W
andlw b'11110000'
bsf LCD, E
iorwf LCD,F
nop
bcf LCD, E
movlw b'00001111'
andwf LCD,F
swapf LCDDATA,W
andlw b'11110000'
bsf LCD,E
iorwf LCD, F
bcf LCD, E
return
;################################################################
Start
clrf LCD
bsf STATUS, RP0
clrf TRISB ; PORTB ist Ausgang
bcf STATUS, RP0
LCDINI bcf LCD, E
clrf LCD
bcf STATUS, RP1
bsf STATUS, RP0
bcf OPTION_REG,7
bsf TRISB,BSY
bcf STATUS, RP0
bcf LCD, RS
bsf LCD, RW
bsf LCD, E
btfsc LCD , BSY
goto LCDINI
bcf LCD, E
bcf LCD, RW
bsf STATUS, RP0
bcf TRISB,BSY
bcf STATUS, RP0
bsf LCD, 5
bsf LCD, E
bcf LCD, E ; Setze LCD Funktion auf 4bit- ; Uebertragung
movlw b'00101000' ; 4bit Datenlänge, 2-zeiliges
call SchreibeBefehlLCD ; Display, 5*7 Front
movlw b'00001111' ; Display ein, Curser ein,
call SchreibeBefehlLCD ; Curser blinkt
movlw b'00000001' ; lösche LCD, Curser auf 1Position
call SchreibeBefehlLCD
movlw b'00000110' ; Eingabemodus
call SchreibeBefehlLCD
movlw _T
call SchreibeDatenLCD
movlw _o
call SchreibeDatenLCD
movlw _l
call SchreibeDatenLCD
movlw _l
call SchreibeDatenLCD
loop
goto loop
end