TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: zerovlc en 25 de Junio de 2009, 14:21:44
-
hola buenas, mi proyecto es muy simple, he construido una insoladora con leds UV, utilizo un PIC16f84A y para mostrar algo de info como el tiempo de insolado y cuando termina la insolacion utilizo un display lcd powertip 1602hsl, mi problema con este proyecto es el siguiente, he construido la placa con los leds despues de realizar los calculos de a que distancia los tengo ke colocar, hice un progrma con ccs para el control de pic y utilizando la libreria que lleva y el portb del pic comunicarse con el lcd y utilizar el puerto a como entradas la cuestion es que he probado a programar tanto en c como en asm mi programa pero no logro mostrar informacion en display solo aparece la primera linea en negro, he revisado conexiones y comprobado continuidad, para el codigo en asm utilizo la libreria de retardos que viene en el libro del pic16f84 y la libreria de lcd de 4 bits para el control del lcd pero me sigue apareciendo lo mismo, alguien ha trabajado con ese tipo de display y ha logrado mostrar informacion me da igual si es codigo asm o c,visual basic, ya que controlo la programacion bastante bien pero no se xk no sale infor por la pantalla es un proyecto bonito y sencillo de realizar ya que en un coste muy bajo tenemos una insoladora casera con un tiempo de insolado entre 1 y 3 minutos mas o menos GRACIAS
PD:si alguien esta interesado en mi proyecto le puedo pasar el codigo tanto en c como en asm
-
No es mala idea lo que comentas pero no has intentado simularlo en Proteus o por que no como dices muestra el Codigo C y veamos si ahi esta el Error ya que por lo que dices las conexciones no son
-
Postea el codigo (en C y en ASM) y vemos.
Que controlador tiene tu LCD?
S
-
no si en proteus me funciona, pero creo que el problema reside en la incializacion del display y eso se hace con una libreria solo que para ese display no tengo ni idea aqui os dejo a continuacion el codigo en c
la libreria LCD_16F84.c es la libreia lcd que viene con ccs
#include "E:\ingenieria\2º año\informatica industrial\programas de pics\c\PROYECTO\main.h"
#fuses XT,NOWDT,NOPUT,NOPROTECT
#use delay(clock=4000000)
#include <LCD_16F84.c>
#define input_pin_a2==0;
#define input_pin_a0==0;
#define input_pin_a1==0;
void main()
{
int contador=1;
//lcd_init();
//printf(lcd_putc," %d volts ",variable_adc);pasar variable a lcd
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
lcd_init();
set_tris_a(11111);
set_tris_b(000000);
input(pin_a0==1);
input(pin_a1==1);
lcd_putc("\f Bienvenido");
delay_ms(2000);
lcd_putc("\f a la insoladora\n de");
delay_ms(2000);
lcd_putc("\fJuan");
delay_ms(2000);
lcd_putc("\fIntroduce tiempo:");
do
{
if(input(pin_a0)==1)
{
printf(lcd_putc,("\f tiempo: %d min"),contador);
contador++;
delay_ms(800);
}else if(input(pin_a1)==1)
{
lcd_putc("\f INSOLANDO... ");
do
{
input(pin_a0==0);
output_high(pin_a2);
delay_ms(60000);
contador--;
}while(contador>1);
output_low(pin_a2);
delay_ms(100);
lcd_putc("\f...TERMINADO...");
delay_ms(1000);
contador=1;
lcd_putc("\fIntroduce tiempo:");
}
} while(true);
} // fin de programa
ahora os dejo el codigo en asm las libreria de lcd4bit.inc y retardos.inc son las que vienen con el libro pic16f84a, hice el codigo en asm porque pense que como en proteus con el codigo en c funcionaba pero me aparecia algun warning pense que podria ser eso y lo hice en ensamblador pero ni aun asi sigue haciendo lo mismo si teneis cualquier duda me lo decis porque no se por donde tirar, ya que lo unico que creo que pueda ser es la libreria de control del display que al ser la generica que vienen con los programas y el libro y no sean compatibles
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
x
salidas equ b'00001111'
entradas equ b'00101'
CBLOCK 0x0C
ENDC
ORG 0
call LCD_Inicializa
inicio
call Retardo_20ms
call Retardo_20ms
movlw d'0'
movwf x
call LCD_Borra
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw 'B'
call LCD_Caracter
movlw 'i'
call LCD_Caracter
movlw 'e'
call LCD_Caracter
movlw 'n'
call LCD_Caracter
movlw 'v'
call LCD_Caracter
movlw 'e'
call LCD_Caracter
movlw 'n'
call LCD_Caracter
movlw 'i'
call LCD_Caracter
movlw 'd'
call LCD_Caracter
movlw 'o'
call LCD_Caracter
call LCD_Linea2
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw 'a'
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw 'l'
call LCD_Caracter
movlw 'a'
call LCD_Caracter
call Retardo_2s
;mensage de "Bienvenido a la" se muestra tb 2seg
call LCD_Borra
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw 'I'
call LCD_Caracter
movlw 'n'
call LCD_Caracter
movlw 's'
call LCD_Caracter
movlw 'o'
call LCD_Caracter
movlw 'l'
call LCD_Caracter
movlw 'a'
call LCD_Caracter
movlw 'd'
call LCD_Caracter
movlw 'o'
call LCD_Caracter
movlw 'r'
call LCD_Caracter
movlw 'a'
call LCD_Caracter
call LCD_Linea2
movlw ' '
call LCD_Caracter
movlw 'd'
call LCD_Caracter
movlw 'e'
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw 'J'
call LCD_Caracter
movlw 'u'
call LCD_Caracter
movlw 'a'
call LCD_Caracter
movlw 'n'
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw 'y'
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw 'J'
call LCD_Caracter
movlw 'o'
call LCD_Caracter
movlw 's'
call LCD_Caracter
movlw 'e'
call LCD_Caracter
call Retardo_2s
INSOLACION
call LCD_Borra
movlw 'I'
call LCD_Caracter
movlw 'n'
call LCD_Caracter
movlw 't'
call LCD_Caracter
movlw 'r'
call LCD_Caracter
movlw 'o'
call LCD_Caracter
movlw 'd'
call LCD_Caracter
movlw 'u'
call LCD_Caracter
movlw 'c'
call LCD_Caracter
movlw 'e'
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw 'T'
call LCD_Caracter
movlw 'i'
call LCD_Caracter
movlw 'e'
call LCD_Caracter
movlw 'm'
call LCD_Caracter
movlw 'p'
call LCD_Caracter
movlw 'o'
call LCD_Caracter
call LCD_Linea2
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movfw x
call LCD_ByteCompleto
call Retardo_500ms
btfss PORTB,1
goto sumar
goto insolar
sumar
btfss PORTB,0
goto INSOLACION
movfw x
addlw d'1'
movwf x
call LCD_Borra
movlw 'e'
call LCD_Caracter
movfw x
call LCD_ByteCompleto
call Retardo_500ms
goto INSOLACION
insolar
call LCD_Borra
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw 'I'
call LCD_Caracter
movlw 'N'
call LCD_Caracter
movlw 'S'
call LCD_Caracter
movlw 'O'
call LCD_Caracter
movlw 'L'
call LCD_Caracter
movlw 'L'
call LCD_Caracter
movlw 'A'
call LCD_Caracter
movlw 'N'
call LCD_Caracter
movlw 'D'
call LCD_Caracter
movlw 'O'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
call Retardo_500micros
bucleinsolado
banksel TRISB
clrf TRISB
banksel TRISA
movlw b'00000100'
movwf PORTB
call Retardo_20s
call Retardo_20s
call Retardo_20s
decfsz x
goto bucleinsolado
call LCD_Borra
call LCD_Borra
movlw ' '
call LCD_Caracter
movlw ' '
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw 'T'
call LCD_Caracter
movlw 'E'
call LCD_Caracter
movlw 'R'
call LCD_Caracter
movlw 'M'
call LCD_Caracter
movlw 'I'
call LCD_Caracter
movlw 'N'
call LCD_Caracter
movlw 'A'
call LCD_Caracter
movlw 'D'
call LCD_Caracter
movlw 'O'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
call Retardo_20s
call LCD_Borra
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw 'R'
call LCD_Caracter
movlw 'E'
call LCD_Caracter
movlw 'I'
call LCD_Caracter
movlw 'N'
call LCD_Caracter
movlw 'I'
call LCD_Caracter
movlw 'C'
call LCD_Caracter
movlw 'I'
call LCD_Caracter
movlw 'A'
call LCD_Caracter
movlw 'N'
call LCD_Caracter
movlw 'D'
call LCD_Caracter
movlw 'O'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
movlw '.'
call LCD_Caracter
call Retardo_2s
goto inicio
INCLUDE <LCD_4BIT.INC>
INCLUDE <retardos.INC>
END
gracias
-
Si el problema esta en la inicialización sería útil ver el código del LCD. Para ver si se definieron correctamente los pines a utilizar, etc. Hay muchos ejemplos en el foro que han tenido el mismo problema, habría que ver como lo han solucionado :wink:
-
Creo que esto no se puede hacer:
#define input_pin_a2==0;
El compilador debe generarte error con eso.
-
no, no da error ahora pongo las librerias de inicializacion, he leido en el foro pero utilizan la misma libreria que tengo y me parece que el problema es debido a la marca pero no se ya por donde tirar de todas formas adjunto las librerias tanto en c como en asm
codigo en ASM
;**************************** Librería "LCD_4BIT.INC" ***********************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2
; líneas por 16 caracteres, compatible con el modelo LM016L.
;
; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits. Las
; conexiones son:
; - Las 4 líneas superiores del módulo LCD, pines <DB7B4> se conectan a las 4
; líneas superiores del Puerto B del PIC, pines <RD7:RD4>.
; - Pin RS del LCD a la línea RA0 del PIC.
; - Pin R/W del LCD a la línea RA1 del PIC, o a masa.
; - Pin Enable del LCD a la línea RA2 del PIC.
;
; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librería RETARDOS.INC.
;
; ZONA DE DATOS *********************************************************************
CBLOCK
LCD_Dato
LCD_GuardaDato
LCD_GuardaTRISB
LCD_Auxiliar1
LCD_Auxiliar2
ENDC
LCD_CaracteresPorLinea EQU .16 ; Número de caracteres por línea de la pantalla.
#DEFINE LCD_PinRS PORTA,0
#DEFINE LCD_PinRW PORTA,1
#DEFINE LCD_PinEnable PORTA,2
#DEFINE LCD_BusDatos PORTB
; Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa
bsf STATUS,RP0 ; Configura las líneas conectadas al pines RS,
bcf LCD_PinRS
bcf LCD_PinEnable
bcf LCD_PinRW
bcf STATUS,RP0
bcf LCD_PinRW
bcf LCD_PinEnable
bcf LCD_PinRS
movlw b'00110000'
call LCD_EscribeLCD
call Retardo_4micros ; Escribe el dato en el LCD.
movlw b'00110000'
call LCD_EscribeLCD
call Retardo_4micros
movlw b'00110000'
call LCD_EscribeLCD
call Retardo_4micros
movlw b'00100000' ; Interface de 4 bits.
call LCD_EscribeLCD
call Retardo_4micros
; Ahora configura el resto de los parámetros:
call LCD_2Lineas4Bits5x7 ; LCD de 2 líneas y caracteres de 5x7 puntos.
call LCD_Borra ; Pantalla encendida y limpia. Cursor al principio
call LCD_CursorOFF ; de la línea 1. Cursor apagado.
call LCD_CursorIncr ; Cursor en modo incrementar.
return
; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.
LCD_EscribeLCD
andlw b'11110000' ; Se queda con el nibble alto del dato que es el
movwf LCD_Dato ; que hay que enviar y lo guarda.
movf LCD_BusDatos,W ; Lee la información actual de la parte baja
andlw b'00001111' ; del Puerto B, que no se debe alterar.
iorwf LCD_Dato,F ; Enviará la parte alta del dato de entrada
; y en la parte baja lo que había antes.
bsf STATUS,RP0 ; Acceso al Banco 1.
movf TRISB,W ; Guarda la configuración que tenía antes TRISD.
movwf LCD_GuardaTRISB
movlw b'00001111' ; Las 4 líneas inferiores del Puerto B se dejan
andwf PORTB,F ; como estaban y las 4 superiores como salida.
bcf STATUS,RP0 ; Acceso al Banco 0.
movf LCD_Dato,W ; Recupera el dato a enviar.
movwf LCD_BusDatos ; Envía el dato al módulo LCD.
bsf LCD_PinEnable ; Permite funcionamiento del LCD mediante un pequeño
bcf LCD_PinEnable ; pulso y termina impidiendo el funcionamiento del LCD.
bsf STATUS,RP0
movf LCD_GuardaTRISB,W ; la configuración del Puerto B.
movwf PORTB ;
bcf STATUS,RP0 ; Acceso al Banco 0.
return
; Subrutinas variadas para el control del módulo LCD -----------------------------------------
;
;Los comandos que pueden ser ejecutados son:
;
LCD_CursorIncr ; Cursor en modo incrementar.
movlw b'00000110'
goto LCD_EnviaComando
LCD_Linea1 ; Cursor al principio de la Línea 1.
movlw b'10000000' ; Dirección 00h de la DDRAM
goto LCD_EnviaComando
LCD_Linea2 ; Cursor al principio de la Línea 2.
movlw b'11000000' ; Dirección 40h de la DDRAM
goto LCD_EnviaComando
LCD_PosicionLinea1 ; Cursor a posición de la Línea 1, a partir de la
iorlw b'10000000' ; dirección 00h de la DDRAM más el valor del
goto LCD_EnviaComando ; registro W.
LCD_PosicionLinea2 ; Cursor a posición de la Línea 2, a partir de la
iorlw b'11000000' ; dirección 40h de la DDRAM más el valor del
goto LCD_EnviaComando ; registro W.
LCD_OFF ; Pantalla apagada.
movlw b'00001000'
goto LCD_EnviaComando
LCD_CursorON ; Pantalla encendida y cursor encendido.
movlw b'00001110'
goto LCD_EnviaComando
LCD_CursorOFF ; Pantalla encendida y cursor apagado.
movlw b'00001100'
goto LCD_EnviaComando
LCD_Borra ; Borra toda la pantalla, memoria DDRAM y pone el
movlw b'00000001' ; cursor a principio de la línea 1.
goto LCD_EnviaComando
LCD_2Lineas4Bits5x7 ; Define la pantalla de 2 líneas, con caracteres
movlw b'00101000' ; de 5x7 puntos y conexión al PIC mediante bus de
goto LCD_EnviaComando ; 4 bits.
; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
;
; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
; comando ha sido entregada a través del registro W. Trabaja en Modo Comando.
; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
; a través del registro W. Trabaja en Modo Dato.
;
LCD_EnviaComando
bcf LCD_PinRS ; Activa el Modo Comando, poniendo RS=0.
goto LCD_Envia
LCD_Caracter
bsf LCD_PinRS ; Activa el "Modo Dato", poniendo RS=1.
call LCD_CodigoCGROM ; Obtiene el código para correcta visualización.
LCD_Envia
movwf LCD_GuardaDato ; Guarda el dato a enviar.
call LCD_EscribeLCD ; Primero envía el nibble alto.
swapf LCD_GuardaDato,W ; Ahora envía el nibble bajo. Para ello pasa el
; nibble bajo del dato a enviar a parte alta del byte.
call LCD_EscribeLCD ; Se envía al visualizador LCD.
btfss LCD_PinRS ; Debe garantizar una correcta escritura manteniendo
call Retardo_2ms ; 2 ms en modo comando y 50 µs en modo cáracter.
call Retardo_50micros
return
; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
;
; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
;
; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
; que puedan ser visualizado en el módulo LM016L.
;
; Entrada: En (W) el código ASCII del carácter que se desea visualizar.
; Salida: En (W) el código definido en la tabla CGROM.
LCD_CodigoCGROM
movwf LCD_Dato ; Guarda el valor del carácter y comprueba si es
LCD_EnheMinuscula ; un carácter especial.
sublw 'ñ' ; ¿Es la "ñ"?
btfss STATUS,Z
goto LCD_EnheMayuscula ; No es "ñ".
movlw b'11101110' ; Código CGROM de la "ñ".
movwf LCD_Dato
goto LCD_FinCGROM
LCD_EnheMayuscula
movf LCD_Dato,W ; Recupera el código ASCII de entrada.
sublw 'Ñ' ; ¿Es la "Ñ"?
btfss STATUS,Z
goto LCD_Grado ; No es "Ñ".
movlw b'11101110' ; Código CGROM de la "ñ". (No hay símbolo para
movwf LCD_Dato ; la "Ñ" mayúscula en la CGROM).
goto LCD_FinCGROM
LCD_Grado
movf LCD_Dato,W ; Recupera el código ASCII de entrada.
sublw 'º' ; ¿Es el símbolo "º"?
btfss STATUS,Z
goto LCD_FinCGROM ; No es "º".
movlw b'11011111' ; Código CGROM del símbolo "º".
movwf LCD_Dato
LCD_FinCGROM
movf LCD_Dato,W ; En (W) el código buscado.
return
; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
;
; Visualiza espacios en blanco.
LCD_LineaEnBlanco
movlw LCD_CaracteresPorLinea
goto LCD_EnviaBlancos
LCD_UnEspacioBlanco
movlw .1
goto LCD_EnviaBlancos
LCD_DosEspaciosBlancos
movlw .2
goto LCD_EnviaBlancos
LCD_TresEspaciosBlancos
movlw .3
LCD_EnviaBlancos
movwf LCD_Auxiliar1 ; (LCD_Auxiliar1) se utiliza como contador.
LCD_EnviaOtroBlanco
movlw ' ' ; Esto es un espacio en blanco.
call LCD_Caracter ; Visualiza tanto espacios en blanco como se
decfsz LCD_Auxiliar1,F ; haya cargado en (LCD_Auxiliar1).
goto LCD_EnviaOtroBlanco
return
; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
;
; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
;
; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero
; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
;
; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
;
LCD_Byte
movwf LCD_Auxiliar2 ; Guarda el valor de entrada.
andlw b'11110000' ; Analiza si el nibble alto es cero.
btfss STATUS,Z ; Si es cero lo apaga.
goto LCD_VisualizaAlto ; No es cero y lo visualiza.
movlw ' ' ; Visualiza un espacio en blanco.
call LCD_Caracter
goto LCD_VisualizaBajo
LCD_ByteCompleto
movwf LCD_Auxiliar2 ; Guarda el valor de entrada.
LCD_VisualizaAlto
swapf LCD_Auxiliar2,W ; Pone el nibble alto en la parte baja.
call LCD_Nibble ; Lo visualiza.
LCD_VisualizaBajo
movf LCD_Auxiliar2,W ; Repite el proceso con el nibble bajo.
call LCD_Nibble ; Lo visualiza.
return
; Subrutina "LCD_Nibble" ----------------------------------------------------------------
;
; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
; - Si (W)=b'01010110', se visualizará "6".
; - Si (W)=b'10101110', se visualizará "E".
;
LCD_Nibble
andlw b'00001111' ; Se queda con la parte baja.
movwf LCD_Auxiliar1 ; Lo guarda.
sublw 0x09 ; Comprueba si hay que representarlo con letra.
btfss STATUS,C
goto LCD_EnviaByteLetra
movf LCD_Auxiliar1,W
addlw '0' ; El número se pasa a carácter ASCII sumándole
goto LCD_FinVisualizaDigito ; el ASCII del cero y lo visualiza.
LCD_EnviaByteLetra
movf LCD_Auxiliar1,W
addlw 'A'-0x0A ; Sí, por tanto, se le suma el ASCII de la 'A'.
LCD_FinVisualizaDigito
goto LCD_Caracter ; Y visualiza el carácter. Se hace con un "goto"
; para no sobrecargar la pila.
codigo en C
///////////////////////////////////////////////////////////////////////////
//// LCDD.C ////
//// Driver for common LCD modules ////
//// ////
//// lcd_init() Must be called before any other function. ////
//// ////
//// lcd_putc(c) Will display c on the next position of the LCD. ////
//// The following have special meaning: ////
//// \f Clear display ////
//// \n Go to start of second line ////
//// \b Move back one position ////
//// ////
//// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////
//// ////
//// lcd_getc(x,y) Returns character at position x,y on LCD ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2007 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////
// As defined in the following structure the pin connection is as follows:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.
// Un-comment the following define to use port B
#define use_portb_lcd TRUE-->para usar el puerto B del pic
struct lcd_pin_map { // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rs; // access to the LCD pins.
BOOLEAN rw; // The bits are allocated from
BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;
#if defined use_portb_lcd
//#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf81
#else
#locate lcd = 6
#endif
#define set_tris_lcd(x) set_tris_b(x)
#else
//#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf83
#else
#locate lcd = 8
#endif
#define set_tris_lcd(x) set_tris_d(x)
#endif
#ifndef lcd_type
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#endif
#define lcd_line_two 0x40 // LCD RAM address for the second line
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.
// The following are used for setting
// the I/O port direction register.
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
BYTE lcd_read_byte() {
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(15);//originalmente es delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}
void lcd_send_nibble( BYTE n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(15);//originalmente es delay_us(2);
lcd.enable = 0;
}
void lcd_send_byte( BYTE address, BYTE n ) {
lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init() {
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(30);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(10);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING);
}
void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;
if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}
char lcd_getc( BYTE x, BYTE y) {
char value;
lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
aqui estan las dos librerias que he usado las dos simuladas en proteus funcionan
-
hola buena foro, aun sigo con el problema y no soy capaz de solucionarlo, alguien tiene alguna idea
-
Dices que en proteus te funciona, por lo tanto la falla puede estar en el esquemático no? Puede ser que no este bien conectado el potenciometro del contraste?
-
mmmmm es ke el problema creo ke es con la libreria de inicializacion, xk el lcd es una powertip, y el pin de contraste solo me muestra una linea en negro por eso si alguien ha probado con esa pantalla hacer otra coas aunque sea para ver que libreria se usa xk tb he montado en protoboard y me aparecia lo mismo
-
hola buenas foro, por fin tube un hueco y ya lo tengo todo solucionado listo y funcionando
-
Hola zerovlc, observé que tuviste problemas con la inicialización del display lcd powertip 1602hsl, yo estoy usando un display similar, el AA16206, te agradecería me comentaras como resolviste el problema.
Tengo la tabla del fabricante para la inicialización y lo quiero usar a 4 bits, le doy los retardos requeridos, pero creo los codigos no los estoy colocando como debe ser puse: 11110000, luego 1111000 después 0001000 y finalmente 01110000. (resuminedo para no extenderme).
Saludos.
-
Hola Pulkron te he respondido por privado lo que puedes mirar, como posibles problemas, lo que no me acorcaba es que en el mismo post estan las librerias para una lcd en modo de 4 bits tanto en asm como en C
-
Muchas gracias zerovlc, voy a seguir tus recomendaciones y checar la librería que estoy usando con la de tu post.
Saludos.
-
zerovlc
Ya está operando el módulo LCD, gracias por tus recomendaciones.
Saludos.
-
ahhh muy biennn felicidadessss gracias a ti, al final con que tuviste el problema hera con la alimentacion o siemplemente algun problema con la libreria del lcd
-
El problema estaba en la librería del LCD porque los códigos que estaba poniendo no eran correctos.
Saludos.