Hola, soy nuevo en esto de programar en PICs y necesito poner un mensaje en una LCD, trate de hacer un programa que enviara un texto y no me salio el codigo y quisiera preguntarles como quedaria el codigo para desplegar en una pantalla LCD lo siguiente:
1er Renglon: LCD
2do Renglon: Encendido
El PIC que estoy ocupando es el PIC16F876, la LCD es de 16x2 y el programa que estoy ocupando es el MPlab. Y mi intento de programa es el sig
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; Programa: envio de datos a la pantalla LCD
processor 16F876
#include "P16F876.inc"
INCLUDE <P16f876.inc>
__CONFIG _XT_OSC&_WDT_OFF&_PWRTE_ON&_BODEN_OFF&_LVP_OFF&_CPD_OFF&_WRT_ENABLE_OFF&_DEBUG_OFF&_CP_OFF
Digito equ 0x21
PDel0 equ 0x22
PDel1 equ 0x23
org 0x00
goto INICIO
org 0x05
INICIO CALL CONFIG
CALL LCD_INICIO
CLRF Digito
CLRF PORTB
MOVLW 0X01
CALL LCD_REG
MOVLW 0X3C
CALL LCD_REG
MOVLW 0X0C
CALL LCD_REG
MOVLW 0x80
CALL LCD_REG
REPETIR MOVF Digito,w
CALL DATO_1
IORLW 0
BTFSC STATUS,2
MOVLW 0xC0
CALL LCD_REG
MOVF Digito,w
CALL DATO_2
BTFSC STATUS,2 ;Es el ultimo?
GOTO TRABARSE ;Si
CALL LCD_DATOS ;Visualiza caracter
INCF Digito,f ;Incrementa numero de Digito
GOTO REPETIR ;Vuelve a escribir
TRABARSE nop
goto TRABARSE ;Buclee infinito (el programa se cicla)
NO_MOLESTES BSF PORTA,1 ;Pone el LCD en modo lectura
BSF STATUS,RP0 ;Selecciona el Banco 1
MOVLW 0xFF
MOVWF TRISB ;Puerto B actua de entrada
BCF STATUS,RP0 ;Selecciona el Banco 0
BSF PORTA,2 ;Activa el LCD (Señal E)
NOP
L_BUSY BTFSC PORTB,7 ;Chequea el bit BUSY
GOTO L_BUSY ;Est a "1" (Ocupado)
BCF PORTA,2 ;Desactiva el LCD (Se¤al E)
BSF STATUS,RP0 ;Selecciona el Banco 1
CLRF TRISB ;Puerta B actua como salida
BCF STATUS,RP0 ;Selecciona el Banco 0
BCF PORTA,1 ;Pone el LCD en modo escritura
RETURN
LCD_REG BCF PORTA,0 ;Desactiva RS (Modo instruccion)
MOVWF PORTB ;Saca el codigo de instruccion
CALL NO_MOLESTES ;Espera a que se libere el LCD
CALL LCD_E ;Genera pulso en señal E
RETURN
LCD_E BSF PORTA,2 ;Activa señal E
NOP
NOP
NOP ;Espera 1uS
BCF PORTA,2 ;Desactiva señal E
RETURN
LCD_INICIO movlw .21 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .142 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
LCD_DATOS BCF PORTA,0 ;Desactiva RS (Modo instrucci¢n)
MOVWF PORTB ;Valor ASCII a sacar por RB
CALL NO_MOLESTES ;Espera a que se libere el LCD
BSF PORTA,0 ;Activa RS (Modo dato)
GOTO LCD_E ;Genera pulso en señal E
RETURN
DATO_1 ADDWF PCL,1
RETLW "L"
RETLW "C"
RETLW "D"
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW 0x00
return
DATO_2 ADDWF PCL,1
RETLW "E"
RETLW "N"
RETLW "C"
RETLW "E"
RETLW "N"
RETLW "D"
RETLW "I"
RETLW "D"
RETLW "O"
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW " "
RETLW 0x00
return
;:::::::::::::::::::::::
CONFIG BSF STATUS,5 ;Pasamos a posicionar en el bank 1
BCF STATUS,6
MOVLW 0x06
MOVWF ADCON1
MOVLW 0xFF ;Cargamos el valor a w
MOVWF TRISA ;El puerto A funciona como entrada
CLRF TRISC ;Se configura PORTC como salida.
CLRF TRISB ;El puerto B nos sirve de salida
BCF STATUS,5 ;Se regresa al bank 0 de memoria
RETURN
END