Problema con PIC16F628A y LCD Alfanumerico 2x16 - Caracteres incorrectos

Hola, estoy intentando controlar un display LCD Alfanumerico de 2x16 caracteres con un PIC16F628A utilizando el siguiente código en Basic:
Código:
Define CONF_WORD = 0x3f70

AllDigital

Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTB
Define LCD_RSBIT = 2
Define LCD_EREG = PORTB
Define LCD_EBIT = 3

Lcdinit 0  'inicializo el lcd sin cursor.

loop:
Lcdout "ABCDEFGHIJKLMNOP"  'muestra el texto
WaitMs 1000  'espero un segundo
Lcdcmdout LcdClear  'borro el display
WaitMs 1000  'espero un segundo
Goto loop  'vuelvo a loop: para repetir indefinidamente.
El código en Assambler y en Hexadecimal lo compilo directamente con el PIC Simulator IDE, el Assambler es el siguente:
Assambler:
Código:
; Begin
    R0L EQU 0x20
    R0H EQU 0x21
    R1L EQU 0x22
    R1H EQU 0x23
    R2L EQU 0x24
    R2H EQU 0x25
    R3L EQU 0x26
    R3H EQU 0x27
    R4L EQU 0x28
    R4H EQU 0x29
    R5L EQU 0x2A
    R5H EQU 0x2B
    ORG 0x0000
    BCF PCLATH,3
    BCF PCLATH,4
    GOTO L0002
    ORG 0x0004
    RETFIE
L0002:
; 1: Define CONF_WORD = 0x3f70
; 2: 
; 3: AllDigital
    MOVLW 0x07
    MOVWF 0x1F
; 4: 
; 5: Define LCD_BITS = 4
; 6: Define LCD_DREG = PORTB
; 7: Define LCD_DBIT = 4
; 8: Define LCD_RSREG = PORTB
; 9: Define LCD_RSBIT = 2
; 10: Define LCD_EREG = PORTB
; 11: Define LCD_EBIT = 3
; 12: 
; 13: Lcdinit 0 'inicializo el lcd sin cursor.
    BCF 0x06,3
    BCF 0x06,2
    BSF STATUS,RP0
    BCF 0x06,3
    BCF 0x06,2
    MOVLW 0x0F
    ANDWF 0x06,F
    BCF STATUS,RP0
    MOVLW 0x64
    MOVWF R0L
    MOVLW 0x00
    MOVWF R0H
    CALL W001
    MOVLW 0x33
    CALL LC02
    MOVLW 0x33
    CALL LC02
    MOVLW 0x33
    CALL LC02
    MOVLW 0x22
    CALL LC02
    MOVLW 0x28
    CALL LC02
    MOVLW 0x0C
    CALL LC02
    MOVLW 0x01
    CALL LC02
; 14: 
; 15: loop: 
L0001:
; 16: Lcdout "ABCDEFGHIJKLMNOP" 'muestra el texto…
    MOVLW 0x41
    CALL LC01
    MOVLW 0x42
    CALL LC01
    MOVLW 0x43
    CALL LC01
    MOVLW 0x44
    CALL LC01
    MOVLW 0x45
    CALL LC01
    MOVLW 0x46
    CALL LC01
    MOVLW 0x47
    CALL LC01
    MOVLW 0x48
    CALL LC01
    MOVLW 0x49
    CALL LC01
    MOVLW 0x4A
    CALL LC01
    MOVLW 0x4B
    CALL LC01
    MOVLW 0x4C
    CALL LC01
    MOVLW 0x4D
    CALL LC01
    MOVLW 0x4E
    CALL LC01
    MOVLW 0x4F
    CALL LC01
    MOVLW 0x50
    CALL LC01
; 17: WaitMs 1000 'espero un segundo
    MOVLW 0xE8
    MOVWF R0L
    MOVLW 0x03
    MOVWF R0H
    CALL W001
; 18: Lcdcmdout LcdClear 'borro el display
    MOVLW 0x01
    CALL LC02
; 19: WaitMs 1000 'espero un segundo
    MOVLW 0xE8
    MOVWF R0L
    MOVLW 0x03
    MOVWF R0H
    CALL W001
; 20: Goto loop 'vuelvo a loop: para repetir indefinidamente.
    GOTO L0001
; End of program
L0003:    GOTO L0003
; Waitms Routine
W001:    MOVF R0L,F
    BTFSC STATUS,Z
    GOTO W002
    CALL W003
    DECF R0L,F
    NOP
    NOP
    NOP
    NOP
    NOP
    GOTO W001
W002:    MOVF R0H,F
    BTFSC STATUS,Z
    RETURN
    CALL W003
    DECF R0H,F
    DECF R0L,F
    GOTO W001
W003:    MOVLW 0x0C
    MOVWF R2H
W004:    DECFSZ R2H,F
    GOTO W004
    NOP
    NOP
    MOVLW 0x12
    MOVWF R1L
W005:    DECFSZ R1L,F
    GOTO W006
    CALL W007
    CALL W007
    NOP
    NOP
    RETURN
W006:    CALL W007
    GOTO W005
W007:    MOVLW 0x0D
    MOVWF R2L
W008:    DECFSZ R2L,F
    GOTO W008
    NOP
    RETURN
; Waitus Routine - Byte Argument
X001:    MOVLW 0x0A
    SUBWF R4L,F
    BTFSS STATUS,C
    RETURN
    GOTO X002
X002:    MOVLW 0x06
    SUBWF R4L,F
    BTFSS STATUS,C
    RETURN
    GOTO X002
; Waitus Routine - Word Argument
Y001:    MOVLW 0x10
    SUBWF R4L,F
    CLRW
    BTFSS STATUS,C
    ADDLW 0x01
    SUBWF R4H,F
    BTFSS STATUS,C
    RETURN
    GOTO Y002
Y002:    MOVLW 0x0A
    SUBWF R4L,F
    CLRW
    BTFSS STATUS,C
    ADDLW 0x01
    SUBWF R4H,F
    BTFSS STATUS,C
    RETURN
    GOTO Y002
; Lcdout Routine
LC01:    MOVWF R4L
    BSF 0x06,2
    MOVLW 0x0F
    ANDWF 0x06,F
    MOVF R4L,W
    ANDLW 0xF0
    IORWF 0x06,F
    CALL LCX1
    SWAPF R4L,F
    MOVLW 0x0F
    ANDWF 0x06,F
    MOVF R4L,W
    ANDLW 0xF0
    IORWF 0x06,F
    CALL LCX1
    MOVLW 0x64
    MOVWF R4L
    CALL X001
    RETURN
LCX1:    BSF 0x06,3
    NOP
    BCF 0x06,3
    RETURN
; Lcdcmdout Routine
LC02:    MOVWF R4L
    BCF 0x06,2
    MOVLW 0x0F
    ANDWF 0x06,F
    MOVF R4L,W
    ANDLW 0xF0
    IORWF 0x06,F
    CALL LCX1
    SWAPF R4L,F
    MOVLW 0x0F
    ANDWF 0x06,F
    MOVF R4L,W
    ANDLW 0xF0
    IORWF 0x06,F
    CALL LCX1
    MOVLW 0x88
    MOVWF R4L
    MOVLW 0x13
    MOVWF R4H
    CALL Y001
    RETURN
; Configuration word settings
    ORG 0x2007
    DW 0x3F70
; End of listing
    END
En el PIC Simulator IDE este código me lo simula perfecto, pero en el display físico aparecen caracteres completamente distintos a los que debería mostrar (ver imágenes adjuntas).

EL LCD es un Winstar WH1602L, adjunto la hoja de datos.

¿Alguien podría decirme a que se debe esta discrepancia entre los datos enviados y los mostrados?

Muchas gracias

PD: soy novato en el tema uControladores y solo se lenguaje Basic (Estoy intentando aprender C#).
 

Adjuntos

  • Simulacion en PSI.jpg
    Simulacion en PSI.jpg
    264.2 KB · Visitas: 55
  • LCD Físico.JPG
    LCD Físico.JPG
    219 KB · Visitas: 63
  • LCD WH1602L.pdf
    457.4 KB · Visitas: 39
Última edición:
el problema puede ser con respecto al oscilador el cual debes tener en cuenta al grabar el programa en el pic, que por lo general se usa uno de 4 Mhz.
 
Estoy usando el oscilador interno, tendría que declararlo también?
"Define CLOCK_FREQUENCY = 4" luego del "Define CONF_WORD = 0x3f70"
Voy a probar.

Edito 21/05

Probé con eso sin resultados favorables, ¿Alguna idea?
Espero que no este dañado el LCD...
 
Última edición:
hola
comprueba sobre todo que los pines de datos esten conectados correctamente al display, ya que cada fabricante de display coloca dichos pines en orden distintos.
El codigo de la letra "q" es capicuo, asi que si invertistes los bits, esta letra si se representara correctamente.
 
Atrás
Arriba