Haremos el programa para controlar un LCD con un pic16f84a con 8 lineas de datos, pondremos el programa completo para no confundir al lector con las librerias que tendria que convertirlas en archivo de tipo .INC
list p=16f84 ;Procesador PIC16f84
#include "pic16f84"
DATO_A equ 0xc ;Registro del dato A
DATO_B equ 0xd ;Registro del dato B
RESUL equ 0xe ;Registro de resultados
TEMPO1 equ 0xf ;Registro temporal 1
TEMPO2 equ 0x10 ;Registro temporal 2
OFFSET equ 0x11 ;Variable de desplazamientos de mensajes
Digito EQU 1Fh ;Cursor para leer la tabla de datos.
ORG 00h ;Direccion del Vector de RESET
GOTO INICIO ;Comienza el programa
ORG 05h ;detras del Vector Interrupcion
;-------CONFIGURACION LCD-----------
LCD_E BSF PORTA,2 ;Activa señal E
NOP ;Espera 1uS
BCF PORTA,2 ;Desactiva señal E
RETURN
LCD_BUSY BSF PORTA,1 ;Pone el LCD en modo lectura
BSF STATUS,5 ;Selecciona el Banco 1
MOVLW 0xFF
MOVWF TRISB ;Puerta B actua de entrada
BCF STATUS,5 ;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,5 ;Selecciona el Banco 1
CLRF TRISB ;Puerta B actua como salida
BCF STATUS,5 ;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 LCD_BUSY ;Espera a que se libere el LCD
GOTO LCD_E ;Genera pulso en señal E
LCD_DATOS BCF PORTA,0 ;Desactiva RS (Modo instrucci¢n)
MOVWF PORTB ;Valor ASCII a sacar por RB
CALL LCD_BUSY ;Espera a que se libere el LCD
BSF PORTA,0 ;Activa RS (Modo dato)
GOTO LCD_E ;Genera pulso en señal E
LCD_INI MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
RETURN
LCD_PORT BSF STATUS,5 ;Selecciona el banco 1 de datos
CLRF TRISB ;RB se programa como salida
MOVLW b'00011000' ;RA4, RA3 son entradas
MOVWF TRISA ;el resto como salidas
BCF STATUS,5 ;Selecciona el banco 0 de datos
BCF PORTA,0 ;Desactiva RS del modulo LCD
BCF PORTA,2 ;Desactiva E del modulo LCD
DELAY_5MS movlw 0x1a ;retardo de 5ms
movwf DATO_B
clrf DATO_A
DELAY_1 decfsz DATO_A,1
goto DELAY_1
decfsz DATO_B,1
goto DELAY_1
return
;----PROGRAMA PRINCIPAL------
INICIO CLRF Digito ;Pone a 0 la variable digito
CALL LCD_PORT Puertos en modo LCD
BCF PORTA,0 ;Desactiva RS del modulo LCD
BCF PORTA,2 ;Desactiva E del modulo LCD
START CALL LCD_INI ;Inicia LCD (CFG puertos...)
START_1 MOVLW b'00000001' ;Borrar LCD y Home
CALL LCD_REG
MOVLW b'00000110' ;
CALL LCD_REG
MOVLW b'00001100' ;LCD On, cursor Off,Parpadeo Off
CALL LCD_REG
MOVLW 0x80 ;Direccion caracter
CALL LCD_REG
REPETIR MOVF Digito,w ;W=Digito
CALL DATO_1 ;Coge el caracter
IORLW 0 ;Compara
BTFSC STATUS,2 ;Es el ultimo?
GOTO acabar ;Si
CALL LCD_DATOS ;Visualiza caracter
INCF Digito,f ;Incrementa numero de Digito
GOTO REPETIR ;Vuelve a escribir
acabar nop
goto acabar ;Buclee infinito
DATO_1 ADDWF PCL,1
RETLW 'p'
RETLW 'r'
RETLW 'o'
RETLW 'y'
RETLW 'e'
RETLW 'c'
RETLW 't'
RETLW 'o'
RETLW 's'
RETLW ' '
RETLW '2'
RETLW '0'
RETLW '1'
RETLW '1'
RETLW 0x00
END
Aqui esta el archivo HEX. probado , lo bajan del siguiente link:
http://www.4shared.com/file/37iqavfh/lcd.html
list p=16f84 ;Procesador PIC16f84
#include "pic16f84"
DATO_A equ 0xc ;Registro del dato A
DATO_B equ 0xd ;Registro del dato B
RESUL equ 0xe ;Registro de resultados
TEMPO1 equ 0xf ;Registro temporal 1
TEMPO2 equ 0x10 ;Registro temporal 2
OFFSET equ 0x11 ;Variable de desplazamientos de mensajes
Digito EQU 1Fh ;Cursor para leer la tabla de datos.
ORG 00h ;Direccion del Vector de RESET
GOTO INICIO ;Comienza el programa
ORG 05h ;detras del Vector Interrupcion
;-------CONFIGURACION LCD-----------
LCD_E BSF PORTA,2 ;Activa señal E
NOP ;Espera 1uS
BCF PORTA,2 ;Desactiva señal E
RETURN
LCD_BUSY BSF PORTA,1 ;Pone el LCD en modo lectura
BSF STATUS,5 ;Selecciona el Banco 1
MOVLW 0xFF
MOVWF TRISB ;Puerta B actua de entrada
BCF STATUS,5 ;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,5 ;Selecciona el Banco 1
CLRF TRISB ;Puerta B actua como salida
BCF STATUS,5 ;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 LCD_BUSY ;Espera a que se libere el LCD
GOTO LCD_E ;Genera pulso en señal E
LCD_DATOS BCF PORTA,0 ;Desactiva RS (Modo instrucci¢n)
MOVWF PORTB ;Valor ASCII a sacar por RB
CALL LCD_BUSY ;Espera a que se libere el LCD
BSF PORTA,0 ;Activa RS (Modo dato)
GOTO LCD_E ;Genera pulso en señal E
LCD_INI MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
RETURN
LCD_PORT BSF STATUS,5 ;Selecciona el banco 1 de datos
CLRF TRISB ;RB se programa como salida
MOVLW b'00011000' ;RA4, RA3 son entradas
MOVWF TRISA ;el resto como salidas
BCF STATUS,5 ;Selecciona el banco 0 de datos
BCF PORTA,0 ;Desactiva RS del modulo LCD
BCF PORTA,2 ;Desactiva E del modulo LCD
DELAY_5MS movlw 0x1a ;retardo de 5ms
movwf DATO_B
clrf DATO_A
DELAY_1 decfsz DATO_A,1
goto DELAY_1
decfsz DATO_B,1
goto DELAY_1
return
;----PROGRAMA PRINCIPAL------
INICIO CLRF Digito ;Pone a 0 la variable digito
CALL LCD_PORT Puertos en modo LCD
BCF PORTA,0 ;Desactiva RS del modulo LCD
BCF PORTA,2 ;Desactiva E del modulo LCD
START CALL LCD_INI ;Inicia LCD (CFG puertos...)
START_1 MOVLW b'00000001' ;Borrar LCD y Home
CALL LCD_REG
MOVLW b'00000110' ;
CALL LCD_REG
MOVLW b'00001100' ;LCD On, cursor Off,Parpadeo Off
CALL LCD_REG
MOVLW 0x80 ;Direccion caracter
CALL LCD_REG
REPETIR MOVF Digito,w ;W=Digito
CALL DATO_1 ;Coge el caracter
IORLW 0 ;Compara
BTFSC STATUS,2 ;Es el ultimo?
GOTO acabar ;Si
CALL LCD_DATOS ;Visualiza caracter
INCF Digito,f ;Incrementa numero de Digito
GOTO REPETIR ;Vuelve a escribir
acabar nop
goto acabar ;Buclee infinito
DATO_1 ADDWF PCL,1
RETLW 'p'
RETLW 'r'
RETLW 'o'
RETLW 'y'
RETLW 'e'
RETLW 'c'
RETLW 't'
RETLW 'o'
RETLW 's'
RETLW ' '
RETLW '2'
RETLW '0'
RETLW '1'
RETLW '1'
RETLW 0x00
END
Aqui esta el archivo HEX. probado , lo bajan del siguiente link:
http://www.4shared.com/file/37iqavfh/lcd.html
tiene errores
ResponderEliminarde todas maneras muchas gracias, ha de ser un error pequeño.
ResponderEliminarpor si lo corriges mi e-mail:
ResponderEliminarturbopascal1@hotmail.com
muchas gracias de antemano
ya lo hice funcionar, solo falta declarar unas variables, lo probe en isis proteus, pero:
ResponderEliminarno funciona, se queda esperando la respuesta del display
L_BUSY BTFSC PORTB,7 ;Chequea el bit BUSY
GOTO L_BUSY ;Est a "1" (Ocupado)
ahora en Pic simulator IDE funciona muy bien
pienso que en la realidad si funcionara, pero no se, dime tu opinion.
gracias por tu pronta respuesta.
turbopascal1@hotmail.com
lo importante es que funciona en maqueta real o protoboard, pero tambien corre en pic simulator IDE
ResponderEliminarel archivo HEX. ya esta probado en protoboard es lo que cuenta , los problemas de otros simuladores no lo se , creo que a veces depende de q sistema operativo usan.
ResponderEliminarHOLAA MARI NO ME LLEGA A FUNCIONAR ESTE PROGRAMA CREES QUE ME PUEDAS AYUDAR Y ENVIARME A CORREO OMARCH99@HOTMAIL.COM
ResponderEliminarok, solo dime q mensaje quieres visualizar
ResponderEliminarok, solo dime q mensaje quieres visualizar
ResponderEliminarme gustaría agregarle una activación para algo de potencia, voy a probar con tu codigo
ResponderEliminar:) gracias.
Claro este circuito es lo basico con lcd y se le puede aumentar al programa lo q uds quieran, suerte.
ResponderEliminarhola.. y para la segunda linea como ago? gracias
ResponderEliminarHola, una pregunta que especificaciones tiene el lcd???
ResponderEliminarEs un Lcd comun de 2 lineas por 16 caracteres, puede ser de la marca hitachi o cualquier otra marca.
ResponderEliminarque poca madre, no le entiendo nada
ResponderEliminar