Jag sitter här hemma nu och sliter håret av mig i frustration. I snart två veckor nu har jag suttit och läst igenom ett flertal exempel och tutorials som sägs beskriva hur man kommunicerar med en LCD modul med HD44780. Trots det har jag inte lyckats att skriva ett fungerande protokoll än och det börjar bli riktigt irriterande. Som en sista utväg ber jag därför er om hjälp med detta.
Det som händer just nu är att jag får ett ifyllt block på LCD modulen, samt en blinkade cursor bredvid(fyllt block varvat med 2 ifyllda linjer längst ner). Resten är tomma.
I mitt fall använder jag mig utav en PIC16F886 MCU med följande kod(utdrag ur koden):
Kod: Markera allt
list p=16F886
#include <p16F886.inc>
errorlevel -302
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
(...Mer kod...)
RegEdit MACRO _reg, _dat, _mode
#IF _mode == 0x01
banksel _reg
movlw _dat
movwf _reg
#ENDIF
#IF _mode == 0x02
banksel _dat
movfw _dat
banksel _reg
movwf _reg
#ENDIF
ENDM
DelayMs MACRO _ms, _mode
#IF _mode == 0x01
movlw _ms
call sDelay
#ENDIF
#IF _mode == 0x02
movfw _ms
call sDelay
#ENDIF
ENDM
(...Mer kod...)
Start:
RegEdit TRISA, 0x00, 0x01
RegEdit PORTA, 0x00, 0x01
RegEdit TRISB, 0x00, 0x01
RegEdit PORTB, 0x00, 0x01
RegEdit TRISC, 0x00, 0x01
RegEdit PORTC, 0x00, 0x01
clrf ANSEL
clrf ANSELH
call LCD_Init
MainLoop:
goto MainLoop
(...Mer kod...)
sDelay: ; Adds a delay that lasts X milliseconds
movwf vDC
#IF _clockFreq == .4 ; Are we running at 4 MHz?
sDelay1:
movlw 0xC7
movwf vDC+1
movlw 0x01
movwf vDC+2
sDelay2:
decfsz vDC+1, f
goto $+2
decfsz vDC+2, f
goto sDelay2
decfsz vDC, f
goto sDelay1
#ENDIF
#IF _clockFreq == .8 ; Are we running at 8 MHz?
sDelay1:
movlw 0x8E
movwf vDC+1
movlw 0x02
movwf vDC+2
sDelay2:
decfsz vDC+1, f
goto $+2
decfsz vDC+2, f
goto sDelay2
decfsz vDC, f
goto sDelay1
#ENDIF
return
LCD_Init:
DelayMs .255, 0x01
movlw 0b00101000 ; Set 4 bit mode
call LCD_Cmd
movlw 0b00001111 ; Set display on/off and cursor command
call LCD_Cmd
movlw 0b00000110 ; Entry mode set
call LCD_Cmd
movlw 0b00000010 ; Move to home
call LCD_Cmd
movlw 0b00000001 ; Clear display
call LCD_Cmd
return
LCD_Cmd:
movwf vTemp
swapf vTemp, w ;send upper nibble
andlw 0x0f ;clear upper 4 bits of W
movwf PORTB
bcf PORTA, 0 ;RS line to 1
call Pulse_e ;Pulse the E line high
movf vTemp, w ;send lower nibble
andlw 0x0f ;clear upper 4 bits of W
movwf PORTB
bcf PORTA, 0 ;RS line to 1
call Pulse_e ;Pulse the E line high
DelayMs .5, 0x01
return
LCD_CharD:
addlw 0x30
LCD_Char:
movwf vTemp ;display character in W register
swapf vTemp, w ;send upper nibble
andlw 0x0f ;clear upper 4 bits of W
movwf PORTB
bsf PORTA, 0 ;RS line to 1
call Pulse_e ;Pulse the E line high
movf vTemp, w ;send lower nibble
andlw 0x0f ;clear upper 4 bits of W
movwf PORTB
bsf PORTA, 0 ;RS line to 1
call Pulse_e ;Pulse the E line high
DelayMs .5, 0x01
return
Pulse_e:
bsf PORTA, 1
nop
bcf PORTA, 1
return

All hjälp uppskattas
