Hallo,
Ik ben sinds kort begonnen met het programmeren van PIC's. Laatst heb ik een LCD schermpje bij Dick Best gekocht http://www.dickbest.nl/webshop/index.php?act=viewProd&productId=15…
Ik heb op de bovenste regel mijn naam kunnen krijgen, maar het lukt me maar niet om deze ook op de onderste regel te krijgen.
;RC7-RC4 = DB7-DB4 ; RC3=E ; RC2=RW ; RC1=RS
start
;decleration
BIT_E EQU 3
BIT_RW EQU 2
BIT_RS EQU 1
TEMP EQU 0x020 ;TEMP STORAGE
V_DLY EQU 0x021 ; Variable for DLY
V_DLY1 EQU 0x022 ; for DLY1
org 0x19 ;start of program at
goto START
;initialise
INITPIC
bsf STATUS,RP0 ;sellect bank 1
movlw b'00000000'
movwf TRISC ;set as output
bcf STATUS,RP0 ;select bank 0
clrf PORTC
return
INITLCD ;INITIALIZE LCD
MOVLW 0xFE ;WAIT LONG
CALL DLY1 ;254 * 0.5 = DELAY OF 127ms
MOVLW B'00111000' ;FUNCTION SET - 8 BIT, BIT_E = HIGH
MOVWF PORTC
BCF PORTC,BIT_E ; BIT_E = LOW
MOVLW 0x0A ;wait for about 5ms
CALL DLY1
MOVLW B'00111000' ;FUNCTION SET - 8 BIT, BIT_E=HIGH
MOVWF PORTC
BCF PORTC,BIT_E
MOVLW 0x02 ;
CALL DLY1
MOVLW B'00111000' ;FUNCTION SET - 8 BIT, BIT_E = high
MOVWF PORTC
BCF PORTC,BIT_E ;BIT_E=LOW
;above i have done same command 3 times, this may be not necessary, i just followed datasheet
CALL LCDBUSY ;BUSY FLAG CAN BE CHECKED NOW!
MOVLW B'00101000' ;FUNCTION SET - 4 BIT ,BIT_E = HIGH
MOVWF PORTC
BCF PORTC,BIT_E ;..........EVERY INSTRUCTION WILL BE OF 2 CYCLE FROM HERE
CALL LCDBUSY ;..FUNCTION SET..
MOVLW B'00101000'
MOVWF PORTC
BCF PORTC,BIT_E ;1 CYCLE COMPLETE
MOVLW B'10001000'
MOVWF PORTC
BCF PORTC,BIT_E ;2 CYCLE
CALL LCDBUSY ;DISPLAY CONTROL -
MOVLW B'00001000' ; 1ST NIBBLE AND BIT_E=1,BIT_RW=0,BIT_RS=0
MOVWF PORTC
BCF PORTC,BIT_E ;1 CYCLY
MOVLW B'11111000' ;DISPLAY CONTROL NIBBLE (DISP=ON,CURSOR=ON,BLINK=ON) AND BIT_E=1,BIT_RW=0,BIT_RS=0
MOVWF PORTC
BCF PORTC,BIT_E ;2 CYCLE
CALL LCDBUSY ;CLEAR DISPLAY AND HOME CURSOR
MOVLW B'00001000'
MOVWF PORTC
BCF PORTC,BIT_E
MOVLW B'00011000'
MOVWF PORTC
BCF PORTC,BIT_E
CALL LCDBUSY ;ENTRY SET -
MOVLW B'00001000' ; BIT_E=1,BIT_RW=0,BIT_RS=0
MOVWF PORTC
BCF PORTC,BIT_E ;1 CYCLE
MOVLW B'01101000' ;ENTRY SET - INCREMENT,NO DISP SHIFT(CUR SHIFT),BIT_E=1,BIT_RW=0,BIT_RS=0
MOVWF PORTC
BCF PORTC,BIT_E ;2 CYCLE
RETURN
LCDBUSY
BSF STATUS,RP0 ;SELLECT BANK 1
MOVLW B'11110000'
MOVWF TRISC ;SET RB7-RB4 INPUT
BCF STATUS,RP0 ;SELLECT BANK 0
BSF PORTC,BIT_RW
BCF PORTC,BIT_RS
BSF PORTC,BIT_E
MOVF PORTC,W ;READ
BCF PORTC,BIT_E ;1 CYCLE complete
BSF PORTC,BIT_RW
BCF PORTC,BIT_RS
BSF PORTC,BIT_E
NOP ;DO NOTTHING COZ BUSY FLAG IS IN FIRST NIBBLE
BCF PORTC,BIT_E ;2nd CYCLE complete
ANDLW 0x80
BTFSS STATUS,Z ;CHECK BUSY
GOTO LCDBUSY ;LOOP IF BUSY
BCF PORTC,BIT_RW ;**
BSF STATUS,RP0 ;NOT BUSY SO MAKE PORT B O/P
MOVLW 0x000
MOVWF TRISC
BCF STATUS,RP0
RETURN
;LCD COMMANDS--- i have written routines for only 2 basic commands,
; one has to write routines for shifting display/crussor, home crussor etc.
;it's easy just follow datasheet and i'll include it someday!
LINE2 ;by selecting DDRAM address = 0x40 in case of 16x4 line LCD, see datasheet of HD44780
MOVLW B'11001000'
MOVWF PORTC
BCF PORTC,BIT_E
MOVLW B'00001000'
MOVWF PORTC
BCF PORTC,BIT_E
RETURN
LCDWRITE ;Writes data/character in W register to sellected CG/DD RAM, see its use in START routine
MOVWF TEMP
CALL LCDBUSY
MOVF TEMP,W
ANDLW B'11110000'
IORLW B'00001010' ;BIT_E=1,BIT_RW=0,BIT_RS=1
MOVWF PORTC
BCF PORTC,BIT_E ;1 CYCLE COMPLETE
SWAPF TEMP,W ;SWAP NIBBLES AND STORE IN W REGISTER
ANDLW B'11110000'
IORLW B'00001010' ;BIT_E=1,BIT_RW=0,BIT_RS=1
MOVWF PORTC
BCF PORTC,BIT_E ;2 CYCLE COMPLETE
RETURN
;Delay routines
;500uS delay with 4MHz
DLY
MOVLW D'165'
MOVWF V_DLY
DLY_LOOP
DECFSZ V_DLY, F
GOTO DLY_LOOP
RETURN
; w times DLY
DLY1
MOVWF V_DLY1
DLY1_LOOP
CALL DLY
DECFSZ V_DLY1, F
GOTO DLY1_LOOP
RETURN
START
CALL INITPIC ;initialize PIC
CALL INITLCD ;initialize LCD
MOVLW D'84' ;T ;Write to DDRAM which is displayed in LCD, DDRAM already sellected at initialization
CALL LCDWRITE
MOVLW D'72' ;H
CALL LCDWRITE
MOVLW D'79' ;O
CALL LCDWRITE
MOVLW D'77' ;M
CALL LCDWRITE
MOVLW D'65' ;A
CALL LCDWRITE
MOVLW D'83' ;S
CALL LCDWRITE
MOVLW D'32' ;spatie
CALL LCDWRITE
MOVLW D'83' ;S
CALL LCDWRITE
MOVLW D'84' ;T
CALL LCDWRITE
MOVLW D'69' ;E
CALL LCDWRITE
MOVLW D'71' ;G
CALL LCDWRITE
MOVLW D'77' ;M
CALL LCDWRITE
MOVLW D'69' ;E
CALL LCDWRITE
MOVLW D'89' ;Y
CALL LCDWRITE
MOVLW D'69' ;E
CALL LCDWRITE
MOVLW D'82' ;R
CALL LCDWRITE
CALL LINE2 ;set crussor to line 2
MOVLW D'84' ;T ;Write to DDRAM which is displayed in LCD, DDRAM already sellected at initialization
CALL LCDWRITE
MOVLW D'72' ;H
CALL LCDWRITE
MOVLW D'79' ;O
CALL LCDWRITE
MOVLW D'77' ;M
CALL LCDWRITE
MOVLW D'65' ;A
CALL LCDWRITE
MOVLW D'83' ;S
CALL LCDWRITE
MOVLW D'32' ;spatie
CALL LCDWRITE
MOVLW D'83' ;S
CALL LCDWRITE
MOVLW D'84' ;T
CALL LCDWRITE
MOVLW D'69' ;E
CALL LCDWRITE
MOVLW D'71' ;G
CALL LCDWRITE
MOVLW D'77' ;M
CALL LCDWRITE
MOVLW D'69' ;E
CALL LCDWRITE
MOVLW D'89' ;Y
CALL LCDWRITE
MOVLW D'69' ;E
CALL LCDWRITE
MOVLW D'82' ;R
CALL LCDWRITE
LOOP NOP
GOTO LOOP ;endless loop
ENDIk kan ook geen teksten op de 2de regel krijgen door spaties te gebuiken(dus bovenste deel helemaal vol). Daarom denk ik dat het aan de initialisatie van het aantal regels ligt. Het kan ook nog liggen aan het stuk: Line2. Mijn vraag is dus ook kan iemand fouten ontdekken in de code?(er zijn stukken van de code van internet)
nonkel_dw
nonkel dw
Als je op de 2de lijn tekst wil krijgen moet je de pointer van het scherm op de 2de lijn zetten. Hier kan je best even de datasheet voor nalezen. De drivers durven soms al wel eens verschillen...
Met de schermen waar ik mee werk was het 0x40h... Zoals je doet...
Daarna zou ik ook even wachten tot het display klaar is
succes!
Soms zit de 2e regel op de plek van de 3e. De 2e (en 4e) is dan niet zichtbaar.
Dus probeer het eens op regel 3? (Ik weet de offset hiervan even niet uit mijn hoofd.)