Hola, estoy intentando controlar un display LCD Alfanumerico de 2x16 caracteres con un PIC16F628A utilizando el siguiente código en Basic:
El código en Assambler y en Hexadecimal lo compilo directamente con el PIC Simulator IDE, el Assambler es el siguente:
Assambler:
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#).
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.
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
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
Última edición: