TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: AngelGris en 19 de Junio de 2010, 23:40:15

Título: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 19 de Junio de 2010, 23:40:15
Bueno, eso del asunto.
Se la puede usar con protocolo de 4 u 8 bits y sirve para display 16x1 16x2 y 16x4.
Las lineas se corresponden con el mapa de memoria de los display WinStar y los comandos con los del integrado HD44780
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: manutek en 20 de Junio de 2010, 00:05:14
muy eleganrte la pruebo y te comento angelgris
salutes¡¡¡¡¡
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 20 de Junio de 2010, 11:14:22
Se me deslizo un pequeño error en la función InitLcd();

En la librería recibe un parámetro, pero hay que eliminar eso, dicha función no tiene que recibir parámetros. Creo que se produjo ese error porque estuve probando algunas cosas y seguramente no grabé los cambios posteriores.

Acabo de simularlo con un display de 40x2 y funcionó bien
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 04 de Febrero de 2011, 05:02:47
MUCHAS GRACIAS, HE JUGADO CON ESTA LIBRERIA Y ME FUNCIONA.


TE LO AGRADEZCO Y ESPERO NO TE IMPORTE, ME LA APROPIE PARA USARLA (TE NOMBRARE EN EL TITULO DE LA LIBRERIA) :lol:
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 04 de Febrero de 2011, 09:58:02
MUCHAS GRACIAS, HE JUGADO CON ESTA LIBRERIA Y ME FUNCIONA.


TE LO AGRADEZCO Y ESPERO NO TE IMPORTE, ME LA APROPIE PARA USARLA (TE NOMBRARE EN EL TITULO DE LA LIBRERIA) :lol:

  Claro que no me importa, la subí para que alguien mas la pueda usar. Me alegro que funcione.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: sebastian 100 en 27 de Marzo de 2011, 20:49:13
hola angelgris

primero gracias por compartir, me estoy pasando de ccs a ht y me viene genial.

pero, como haces para imprimir el valor de una variable??

probé con printf y me tira error

espero me puedas ayudar, saludos
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 27 de Marzo de 2011, 22:52:55
  En la librería está la función WriteStrLcd (* char) que es la que se encarga de imprimir un string en el LCD. Para convertir una variable de tipo int a string podés usar la función itoa y luego usar WriteStrLcd(* char) para imprimir el string obtenido mediante itoa.

  En el manual de HiTech hay un ejemplo del uso de itoa, ltoa, ftoa.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 28 de Marzo de 2011, 05:47:23
VALE, YO, ANGELGRIS, REALIZO LO QUE DICES, PERO NO ME VA:

Código: [Seleccionar]
//PRESENTA EN PANTALLA
FRECUENCIA = (COUNT * BASETIEMPO);
GotoxyLcd (5,2);
itoa(F_TEXT,FRECUENCIA,16);
WriteStrLcd (F_TEXT);
__delay_ms(200);
//FIN PRESENTA EN PANTALLA


DONDE FRECUENCIA Y BASETIEMPO ES DE TIPO int y (vaya con las mayusculas),  count tipo short.

al escribir no me aparece nada....


??
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 28 de Marzo de 2011, 05:48:33
expongo la declaracion de variables:

Código: [Seleccionar]
unsigned short COUNT, CAPCH15;
int BASETIEMPO;
int FRECUENCIA;
char F_TEXT[8];

saludos
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 28 de Marzo de 2011, 09:58:43
  Este es el pequeño código que estoy simulando en Proteus y funciona bien.

Código: C
  1. #include <htc.h>
  2. #include <stdlib.h>
  3.  
  4.   __CONFIG (LVPDIS & WDTDIS & INTIO & MCLRDIS);
  5.  
  6. #define PIC_CLK   4000000
  7. #define _XTAL_FREQ 4000000
  8.  
  9. #define LcdDataPort PORTB
  10. #define LcdControlPort PORTB
  11. #define LcdD4 4
  12. #define LcdENBit 0
  13. #define LcdRSBit 1
  14. #define LcdRWBit 2
  15.  
  16. #include "SuperLcd.c"
  17.  
  18. void main(void)
  19. {
  20.   char texto[10];
  21.   int valor = 125;
  22.  
  23.   TRISB = 0;
  24.   TRISA = 0;
  25.   InitLcd();
  26.   WriteStrLcd("Hola");
  27.   GotoxyLcd(5,2);
  28.   itoa (texto,valor,10);
  29.   WriteStrLcd(texto);
  30.   while(1);
  31. }

  Todavía no pude hacer pruebas en físico ya que no tengo LCD. Tal vez haya algún fallo en la libreía y el Proteus la simula bien pero no funciona en realidad.... no se...
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 29 de Marzo de 2011, 03:44:09
YO SIGO SIN QUE ME VAYA... :5]

PERO AUNQUE SEA UN ENGORRO, POSTEO EL PROGRAMA COMPLETO, POR SI VEIS ALGO.

El programa, en si es en el que voy practicando a hacer cosas con el 16f1937., por ello en el trabajo con el LCD, y existen rutinas de RS-232 (ya probadas). y lo ultimo fue conseguir hechar andar el mtouch (que funciona).

la pega es que cuando esta sin pulsar la tecla o pulsando, quiero que en pantalla aparezca la frecuencia, pero no me va...
el resto de texto que pongo en pantalla si va.

yo el reloj lo he subido a 16mhz, por lo del touch, pero la pantalla va ok. lo que no me hace es el itoa, pues me lo deja en blanco....


saludos
Código: [Seleccionar]
/*
**********************************************************************
*                  PROGRAMA DE PRUEBAS                               *
**********************************************************************
*      SOFTWARE CREADO POR J.L. LAFUENTE                             *
**********************************************************************
*   Date INIC:          2011                                         *
*   Date END:                                                        *
*   File Version:  1.0  *
**********************************************************************
**********************************************************************
*   Files required:                                                  *
*                                        *
**********************************************************************
*   Notes:                                                           *
*                                        *
**********************************************************************
*/
//********************************************************************
//INCLUDES
//********************************************************************
#include <htc.h>
#include <pic16f1937.h>
#include <stdio.h>
#include <stdlib.h>
//#include "delayhd.h"
//#include "delay.h"
//
//********************************************************************
//PALABRAS DE CONFIGURACION
//********************************************************************
__CONFIG( FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_ON & FCMEN_OFF);
__CONFIG( WRT_OFF & VCAPEN_OFF & PLLEN_OFF & LVP_OFF & STVREN_OFF & 0xFBFF & 0xEFFF ); // EL PEULTIMO ES EL BORV_27...Y EL ULTIMO EL DEBUG ON
__INTERRUPT();
//
//********************************************************************
//DEFINEs PRINCIPALES
//********************************************************************
#define _XTAL_FREQ 16000000
//CONFIGURACION DE LA LCD
#define LcdControlPort PORTA // Uso el puerto A para los bits de control
#define LcdRWBit 2 // El bit 2 del puerto A para RW
#define LcdRSBit 3 // El bit 3 del puerto A para RS
#define LcdENBit 1 // El bit 1 del puerto A para EN
#define LcdDataPort  PORTD // Uso el puerto D para los datos
#define LcdD4 0 // Solo utilizar para protocolo de 4 Bits
//CONFIGURACION DE LA LCD
//para el puerto serie

#define PIC_CLK 16000000
 #define TxPin RC6
 #define RxPin RC7
 #define BaudRate 9600
//para el puerto serie

//#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
//#define STROBE() ((RB0=0),(RB0 =1))
//#define STROBE2() ((RB3=0),(RB3 =1))

//
//********************************************************************
//OTROS INCLUDEs
//********************************************************************
#include <LIB_LCD.H>
#include <LIB_UART.H>
//
// CONSTANTES
char PRESSTHRESHOLD_H, PRESSTHRESHOLD_L;
char RELEASETHRESHOLD_L;
//
//variables
char PASSARG1;
char COUNT_H,COUNT_L;
char CAPCH15_H, CAPCH15_L;
unsigned short CAPCH15;
int COUNT;
int BASETIEMPO;
int FRECUENCIA;
char TEXT[10];
//
//********************************************************************
//CONFIGURACION DE PUERTOS
//********************************************************************
void INIT(void)//OSCILADOR CON OSCON Y TIMER CON OPTION_REG
{
OSCCON = 0b11111011;//OSCCON = 0b11101011; //RELOJ INTERNO
OSCTUNE = 0b00000000;
INTCON=0b00000000; //DESABILITA TODAS LAS INTERRUPCIONES

//INICIALIZACION DE VAR.
CAPCH15_H = 0;
CAPCH15_L = 0;
COUNT_L =0;
COUNT_H=0;
COUNT=0;
CAPCH15=0;
//INIC PORTA
//IOCA  = 0x00; WPUA  = 0x00;
PORTA = 0x00; LATA = 0x00; ANSELA = 0b00000000; TRISA = 0b00000000;
//INIC PORTB
//IOCB  = 0x00;
WPUB = 0X00;
PORTB = 0x00; LATB = 0x00; ANSELB = 0x00; TRISB = 0b00000000;
//INIC PORTC
PORTC = 0x00; LATC = 0x00;  TRISC = 0b10000000;
//INIC PORTD
PORTD = 0x00; LATD = 0x00; ANSELD = 0b10000000; TRISD = 0b10000000;
//CONFIGURA EL TIMER0
OPTION_REG = 0b11000101;
//CONFIGURA EL TIMER0
TMR0IE =1;

//CONFIGURA EL TIMER1
T1CON=0b11000100; //TIMER1 CONTROL REGISTER
T1GCON=0b01100001; //CONFIGURA EL GATE
//CONFIGURA EL TIMER1
//el cap sensing
//T0XCS = 0;
//TMR0CS=0;
CPSCON0=0b10001100;
CPSCON1=0b00001111;
//
TMR1GE = 1; //EL GATE
//OTROS
BASETIEMPO = 243;
}
//
//********************************************************************
//RUTINA DE INTERRUPCIONES
//********************************************************************
static void interrupt isr(void)
{
di();
if (TMR0IF==1)
{

//if (RB0 == 0) {RB0 = 1;} else {RB0 = 0;}//MARCA
if (T1GVAL == 0) {RB1 = 0;} else {RB1 = 1;}
if (T1GVAL == 0)
{

TMR1ON = 0; //STOP TIMER1 - NOT REALLY NECESARY
COUNT_L = TMR1L; //SAVE ITS CONTENTS
COUNT_H = TMR1H;
switch (CPSCON1) //VEMOS QUE CANAL ES EL ACTIVO
{
case 0x0F:
{
CPSCON1 = 0b00001111; //AQUI PREPARAS EL REGISTRO PARA EL SIGUIENTE CANAL PARA LA PROXIMA VEZ
if ((CAPCH15_L == 0x00) && (CAPCH15_H == 0x00))
{

//ISFIRSTTIME_15:

CAPCH15_L = TMR1L;
CAPCH15_H = TMR1H;
CAPCH15 = CAPCH15_H;
CAPCH15 = CAPCH15 << 8;
CAPCH15 = CAPCH15 | CAPCH15_L;
goto BUTTONCHEKEND;//GOTO BUTTON CHECK ENDS;
}
else
{
//if (RB1 = 0) {RB1 = 1;__delay_us(10);RB1 = 0;} else {RB1 = 1;__delay_us(10);RB1 = 0;}

COUNT = COUNT_H;
COUNT = COUNT <<8;
COUNT = COUNT | COUNT_L;

if (COUNT < CAPCH15)
{ //AL SER MAS PEQUEÑO ACTUAMOS
RB2 = 1;
//PRESENTA EN PANTALLA
FRECUENCIA = (COUNT * BASETIEMPO);
GotoxyLcd (5,2);
itoa(TEXT,FRECUENCIA,10);
WriteStrLcd (TEXT);
__delay_ms(200);
//FIN PRESENTA EN PANTALLA
goto BUTTONCHEKEND;
}
else
{ //ES QUE ESTA NO PULSADO (RELEASE)
//CHECAMOS DE NUEVO PERO AÑADIENDO EL RELEASE THRESHOLD PARA TENER HYSTERESYS
//CAPCH15_L= COUNT_L;
// CAPCH15_H = COUNT_H;
RB2 = 0;
//PRESENTA EN PANTALLA
FRECUENCIA = (COUNT * BASETIEMPO);
GotoxyLcd (5,2);
itoa (TEXT,FRECUENCIA,10);
WriteStrLcd (TEXT);
__delay_ms(200);
//FIN PRESENTA EN PANTALLA
goto BUTTONCHEKEND;
}

}
// break;
}
//break;
// }
//aqui chequear mas canales si quieres
default://la opcion por defecto
{
}
}//fin del switch
BUTTONCHEKEND:
// TMR1ON = 1; //nota de truco de graham

TMR0 = 0xFF;

mm: if (T1GVAL == 1)
{

TMR1L=0;
TMR1H = 0;
TMR0 = 0;
TMR1ON = 1;
TMR0IF = 0;
ei();

return; //sale de la interrupción
}
else
{
// if (RB3 = 0) {RB3 = 1;__delay_us(10);RB3 = 0;} else {RB3 = 1;__delay_us(10);RB3 = 0;}
goto mm;//BUTTONCHEKEND;
}




}
else
{
goto BUTTONCHEKEND;//GOTO BUTTON CHECK ENDS;
}

//ei();
}
else //si no es por timer0
{
TMR1L=0;
TMR1H = 0;
TMR0IF = 0;
TMR0 = 0;
TMR1ON = 1;

ei();
return;
}



}//fin de isr
//
//
void main(void)
{
INIT();

//const char * pantalla = "PRUEBAS LCD EN C";

InitLcd();
WriteStrLcd ("   PRUEBAS "); // escribe en la primer linea la palabra Hola
GotoxyLcd (1,2);
WriteStrLcd ("Fr: "); // escribe en la segunda linea la palabra apuntada por la variable pantalla
//InitSoftUart();
/*     Putst_s ("Hola");   // envia el string "Hola" al puerto serie
      Putst_s ("\n");     // envia el salto de linea al puerto serie
      Putst_s (pantalla);  // envia el string apuntado por pantalla al puerto serie
*/
//CONSTANTES DE SENSIBILIDAD Y HYSTERESIS
PRESSTHRESHOLD_H = 0b00000000;
PRESSTHRESHOLD_L = 0b00010110;
RELEASETHRESHOLD_L = 0b00000101;
//
RB0 = 0;
RB1=0;
//****************************************************
//SECCION PARA PREPARAR EL T1GVAL A NUESTRO GUSTO
//QUE EMPIECE EN 1 CONTANDO
//if (T1GVAL == 0) {RB1 = 0;} else {RB1 = 1;}//MARCA
if (T1GVAL == 0)
{
TMR0 = 0xFF;
T: if (T1GVAL == 0)
{
goto T;
}
else
{
TMR0IE = 1;
TMR0IF = 0;
TMR1L=0;
TMR1H=0;
TMR0 = 0;
TMR1ON=1;
ei();
}
}
//****************************************************

//if (T1GVAL == 0) {RB1 = 0;} else {RB1 = 1;}//MARCA



while (1) //BUCLE INFINITO
{

//if (T1GVAL == 0) {RB1 = 0;} else {RB1 = 1;}//MARCA


}



}
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 29 de Marzo de 2011, 09:12:53
  Por lo que veo, estás usando itoa y writestrlcd e incluso retardos de 200ms dentro de la rutina de interrupción. No es aconsejable que una interrupción dure tanto tiempo, lo ideal sería activar algunos flags y luego procesarlos en el programa principal.

  A mi me han fallado, incluso en Proteus, algunos programas hechos así. Parecería ser que los datos de las variables desaparecieran misteriosamente.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Rodricity en 29 de Marzo de 2011, 09:22:38
 Yo tengo una libreria para usar LCD's con tres pines y un registro de desplazamiento

 ojo, que digo 3 pines en total, no 3+enable+RS

 Si quieren se las subo con un ejemplo...
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 29 de Marzo de 2011, 09:25:44
eso estoy comprobando con el debugger (real ice)....

resulta que hay variables que no deben de estar a cero y se ponen a cero!!.

pero en las ultimas veces resulta que la variable frecuencia si esta, y lo que no hace es justo el writestrlcd(TEXT).

puede ser que no funcione bien como tu dices desde la interrupcion??

y claro, como hago, es decir, saco esa porcion de la rutina de interrupcion y uso la interrupcion para capturar los datos del conteo y ya esta?

probare a ver que pasa

gracias como siempre
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 29 de Marzo de 2011, 09:26:33
rodricity:

todo es bien recibido, para aprender

muchas gracias
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 29 de Marzo de 2011, 09:32:16
angelgris, eres la .... (caña): :-/

has acertado...

he probado a sacar esta porcion al main del programa y funciona:

Código: [Seleccionar]
//PRESENTA EN PANTALLA
FRECUENCIA = (COUNT * 243);
itoa(TEXT,FRECUENCIA,10);
GotoxyLcd (5,2);
WriteStrLcd(TEXT);
__delay_ms(200);
//FIN PRESENTA EN PANTALLA

de esta manera me presenta los datos.

ahora que lo que quiero es la frecuencia, pero no me sale la frecuencia....

es hora de ver que formula estoy usando....


por cierto, si en vez de un int, quisiera un float, es igual, porque en el manual me lio porque no habla de convertir, sino de dirrecion de donde convierte...

saludos


PD:  estaria bien hacer un hilo de hitech, como hacen de otros hilos para empezar paso a paso y anotar estas cosas como lo de  no poneer cierto codigo en las rutinas de interrupcion...

Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 29 de Marzo de 2011, 09:39:07
  Acá dejo un pequeño ejemplo de como activo unas flag en la interrupción del CCP y luego la proceso en el main para mostrar la frecuencia....

  En este ejemplo hago uso de la función ftoa para convertir la frecuencia, pero en una prueba anterior hacía uso de itoa, fijense que incluso sigue estando en el código sólo que la línea está comentada.

Código: C
  1. #include <htc.h>
  2. #include <stdlib.h>
  3. #include "Def16f87xa.h"  // acá hay algunas definiciones para el pic hechas por mi
  4.  
  5. #define PIC_CLK         10000000
  6. #define _XTAL_FREQ      10000000
  7. #include "delayhd.h"
  8.  
  9. #define LcdDataPort             PORTB
  10. #define LcdControlPort  PORTB
  11. #define LcdD4                   4
  12. #define LcdRSBit                0
  13. #define LcdENBit                1
  14. #define LcdRWBit                2
  15. #include "SuperLcd.c"
  16.  
  17. bit captura;
  18. unsigned int Periodo;
  19. unsigned int ValorCcp1;
  20. unsigned int ValorAnterior;
  21.  
  22. char texto[7];
  23. float Frecuencia;
  24.  
  25. void interrupt isr(void)
  26. {
  27.   static char veces;
  28.  
  29.   ValorCcp1 = get_ccpr1();
  30.   veces++;
  31.   if (veces == 2)
  32.   {
  33.     captura = 1;
  34.     veces = 0;
  35.   }
  36.   else
  37.     ValorAnterior = ValorCcp1;
  38.   CCP1IF = 0;
  39. }
  40.  
  41.  
  42. void main(void)
  43. {
  44.   char * texto;
  45.   int * seba;
  46.  
  47.   TRISA = 0;
  48.   TRISB = 0b00001000;
  49.   setup_comparator (NC_NC_NC_NC);             // esta en las definiciones mias es para deshabilitar los comparadores
  50.   setup_timer1 (T1_INTERNAL | T1_DIV_1);    // configuro el timer1
  51.   setup_ccp1 (CCP_CAPTURE_RE);                 // configuro el CCP1
  52.   InitLcd();
  53.   CCP1IF = 0;
  54.   enable_interrupt (INT_CCP1);                  // habilito interrupcion CCP            CCP1IE = 1
  55.   enable_interrupt (GLOBAL);                     // habilito interrupciones globales   GIE = 1
  56.   while (1)
  57.   {
  58.     if (captura == 1)
  59.     {
  60.       disable_interrupt (INT_CCP1);   // deshabilito interrupcion CCP1     CCP1IE = 0
  61.       ClearLcd();
  62.       Periodo = ValorCcp1 - ValorAnterior;
  63.       GotoxyLcd (1,2);      
  64.       Frecuencia = (float) (2.5e6/Periodo);
  65.       //itoa (texto,Frecuencia,10);
  66.       texto = ftoa (Frecuencia, seba);
  67.       WriteStrLcd (texto);
  68.       WriteStrLcd (" Hz");
  69.       captura = 0;
  70.       CCP1IF = 0;                                                    // borro el flag de la interrupcion del CCP
  71.       enable_interrupt (INT_CCP1);                          // habilito interrupcion CCP            CCP1IE = 1
  72.     }
  73.   }
  74. }

  justo estaba escribiendo esto cuando entro tu respuesta.... tal vez te sirva para tu nueva pregunta

  En cuanto a no poner cierto código en la rutina de interrupción es valedero para cualquier lenguaje y cualquier compilador. Siempre la idea es que la interrupción dure el menor tiempo posible.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: micro_pepe en 30 de Marzo de 2011, 11:42:24
Como podria hacerse para representar caracteres definidos en la cg ram con esta librería ?

Saludos.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Suky en 30 de Marzo de 2011, 12:57:34
Por ejemplo:

Código: C
  1. char const CharactersCGRAM[64]={0,0,0,0,0,0,0,0x1F,
  2.                                                         0,0,0,0,0,0,0x1F,0x1F,
  3.                                                         0,0,0,0,0,0x1F,0x1F,0x1F,
  4.                                                         0,0,0,0,0x1F,0x1F,0x1F,0x1F,
  5.                                                         0,0,0,0x1F,0x1F,0x1F,0x1F,0x1F,
  6.                                                         0,0,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
  7.                                                         0,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,
  8.                                                         0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
  9.  
  10. // Guarda en la CGRAM el caracter en el banco seleccionado.-
  11. // <Caracter> es la dirección de la primer fila del caracter a enviar.-
  12. void vLcdWriteCgram(unsigned char Bank,char Character){
  13.         unsigned char AddressBank,i;
  14.  
  15.         AddressBank=0x40 + 0x08*Bank;
  16.         WriteByteLcd(AddressBank,0);
  17.         // Cargamos los 8 registros.-
  18.         for(i=0;i<8;i++){
  19.                 WriteByteLcd(CharactersCGRAM[Character + i],1);
  20.         }
  21.         WriteByteLcd(0x80,0); // Se da por terminada la escritura.-
  22. }
  23.  
  24. // Incializa Memoria CGRAM.-
  25. void vLcdInitCgram(void){
  26.         unsigned char j;
  27.        
  28.         for(j=0;j<8;j++){
  29.                 vLcdWriteCgram(j,j*8);  
  30.         }
  31. }

Y para escribir el caracter:

Código: C
  1. WriteCharLcd(0);
  2. ...
  3. WriteCharLcd(7);

Yo lo uso de esa manera para esta librería: http://www.micros-designs.com.ar/libreria-generica-en-c-control-lcd/ Solo le cambié los nombre a las funciones llamadas  ;-)


Saludos!
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: micro_pepe en 30 de Marzo de 2011, 20:11:52

Y para escribir el caracter:

Código: C
  1. WriteCharLcd(0);
  2. ...
  3. WriteCharLcd(7);

Yo lo uso de esa manera para esta librería: http://www.micros-designs.com.ar/libreria-generica-en-c-control-lcd/ Solo le cambié los nombre a las funciones llamadas  ;-)


Saludos!

¿ Y como se utiliza tu libreria ? Con cualquier función que use (vGotoxyLCD, vInitLCD,...) me dá el mismo error:

Código: [Seleccionar]
Error   [1098] E:\.....; 351. conflicting declarations for variable "_vGotoxyLCD"
Error   [1098] E:\.....; 139. conflicting declarations for variable "_vInitLCD"
......
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Suky en 30 de Marzo de 2011, 21:07:59
¿Tenes el archivo GenericTypeDefs.h? Por el momento no tengo instalado Hi-Tech como ver que es lo que ha pasado  :? Usa la de AngelGris que funciona muy bien  ;-)

Saludos!
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 31 de Marzo de 2011, 09:31:01
AGELGRIS:

estoy estudiando tu ejemplo (que tengo que ir despacito) ;-)....

ya te contare si no entiendo algo o si lo termino cogiendo.

lo de hacer la libreria con caracter propio esta bien, habrá que probar en un segundo paso.

Tambien me atrevo a aventurar upregunta para el futuro:

¿es factible manejar una lcd grafica con hitech, en el caso de que si es igual que para una de 2x16, y que es mejor mirar una que funcione a 5v o a 3v, porque cada vez hacemos mas cositas a 3v, pero a lo mejor hoy por hoy mejor a 5v ¿no?. ¿habra que dejar el hitech o nos quedamos con el.

yO MANEJE UNA CON mIKROBASIC Y ERA CHUPAO PERO con el hitech, me veo perdiendo mucho el tiempo para realizar cosillas. Por contra con el mikrobasic hacia las cosas mas rapido, pero no te entras con profundidad....


saludos
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Suky en 31 de Marzo de 2011, 10:13:06
Tambien me atrevo a aventurar upregunta para el futuro:

¿es factible manejar una lcd grafica con hitech, en el caso de que si es igual que para una de 2x16, y que es mejor mirar una que funcione a 5v o a 3v, porque cada vez hacemos mas cositas a 3v, pero a lo mejor hoy por hoy mejor a 5v ¿no?. ¿habra que dejar el hitech o nos quedamos con el.

Con cualquier lenguaje eres capaz de manejar cualquier dispositivo, tendrá sus distintas dificultades. Eso si, el control de un LCD Gráfico no se parece en nada a un LCD de caracteres, en el gráfico se trabaja pixel por pixel. Después con el tema de las diferentes tensiones hay C.I. que son adaptadores de niveles bi-direccionales, eso no es un problema.


Saludos!
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 31 de Marzo de 2011, 12:12:45
Tambien me atrevo a aventurar upregunta para el futuro:

¿es factible manejar una lcd grafica con hitech, en el caso de que si es igual que para una de 2x16, y que es mejor mirar una que funcione a 5v o a 3v, porque cada vez hacemos mas cositas a 3v, pero a lo mejor hoy por hoy mejor a 5v ¿no?. ¿habra que dejar el hitech o nos quedamos con el.

Con cualquier lenguaje eres capaz de manejar cualquier dispositivo, tendrá sus distintas dificultades. Eso si, el control de un LCD Gráfico no se parece en nada a un LCD de caracteres, en el gráfico se trabaja pixel por pixel. Después con el tema de las diferentes tensiones hay C.I. que son adaptadores de niveles bi-direccionales, eso no es un problema.


Saludos!


ok, te refieres a usar los convertidores de dc-dc ¿no?....

por otro lado, claro veo que c18 y pic18 hablan de librerias, etc, cosa que en mikroc tambien tiene, pero desde que empece con hitech es todo a mano, y la verdad que tela, no se si sera buena opcion pasarme a un  pic18 o pic24, pero es que el pc16f1937 es muy completito....


un salukdo y mil gracias
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Suky en 31 de Marzo de 2011, 12:49:44
Tambien me atrevo a aventurar upregunta para el futuro:

¿es factible manejar una lcd grafica con hitech, en el caso de que si es igual que para una de 2x16, y que es mejor mirar una que funcione a 5v o a 3v, porque cada vez hacemos mas cositas a 3v, pero a lo mejor hoy por hoy mejor a 5v ¿no?. ¿habra que dejar el hitech o nos quedamos con el.

Con cualquier lenguaje eres capaz de manejar cualquier dispositivo, tendrá sus distintas dificultades. Eso si, el control de un LCD Gráfico no se parece en nada a un LCD de caracteres, en el gráfico se trabaja pixel por pixel. Después con el tema de las diferentes tensiones hay C.I. que son adaptadores de niveles bi-direccionales, eso no es un problema.


Saludos!

ok, te refieres a usar los convertidores de dc-dc ¿no?....


No, adaptadores de nivel. Por ejemplo:

http://focus.ti.com/logic/docs/translationresults.tsp?sectionId=458&voltageIn=3.3&searchDirection=2&voltageOut=5.0#voltintf


Saludos!
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: micro_pepe en 31 de Marzo de 2011, 18:31:33
Estoy probando la libreria de AngelGris con un display de 4x20, y no funciona correctamente.

El codigo es este:

Código: [Seleccionar]
#include <htc.h>
#include <stdlib.h>
#include "pic1687x.h"

#define _XTAL_FREQ 10000000 // Cristal 10MHz
#define LcdControlPort PORTB // Uso el puerto A para los bits de control
#define LcdRWBit 0 // El bit 0 del puerto A para RW
#define LcdRSBit 1 // El bit 0 del puerto A para RS
#define LcdENBit 2 // El bit 0 del puerto A para EN
#define LcdDataPort  PORTB // Uso el puerto B para los datos
#define LcdD4 4 // Solo utilizar para protocolo de 4 Bits

#include "SuperLcd.C" // Incluimos nuestra libreria

void main(void)
{
  const char * pantalla = "Mundo";

  InitLcd();
  GotoxyLcd (1,1);
  WriteStrLcd ("Hola"); // escribe en la primer linea la palabra Hola
  GotoxyLcd (1,4);
  WriteStrLcd (pantalla); // escribe en la segunda linea la palabra apuntada por la variable pantalla
  while(1);
}

Gracias por todo.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: micro_pepe en 31 de Marzo de 2011, 18:44:36
Estoy probando la libreria de AngelGris con un display de 4x20, y no funciona correctamente.

El codigo es este:



Bueno, lo acabo de resolver, mirando la libreria de Suky en la función de AngelGris estaban erroneas las direcciones de la Ram, para la linea 3 tenia 0x10 y para la 4 0x50, cuando debe de ser 0x14 y 0x54.

PD: Por cierto, el main en hitech ¿es un bucle infinito? si no pongo el bucle while(1); al final, la información en el LCD parpadea.

Saludos.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 31 de Marzo de 2011, 20:26:34
  Mira vos, que cosa extraña. Yo me basé en un datasheet del Winstar WH1604A para sacar las direcciones de memoria. Adjunto una captura del datasheet donde se especifican las direcciones. ¿O tal vez serán diferentes entre un de 16x4 y uno de 20x4?

Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 01 de Abril de 2011, 02:04:26
ademas:

si lo has resuelto, bien, pero en la defiion de puertos, dices que usas el port A para el control y el B para datos (en los comentarios), pero realmente veo que usas el PortB en ambos casos y no me queda claro que se pueda usar el mismo puerto...


un saludo
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 01 de Abril de 2011, 09:52:43
ademas:

si lo has resuelto, bien, pero en la defiion de puertos, dices que usas el port A para el control y el B para datos (en los comentarios), pero realmente veo que usas el PortB en ambos casos y no me queda claro que se pueda usar el mismo puerto...


un saludo

  Sí LAFUMAT, se puede usar tranquilamente el mismo puerto para control y para datos. Obviamente teniendo la precaución de no querer utilizar los mismos bits para data que para control.
  En el ejemplo que muestra micro_pepe está perfecto ya que utiliza el nibble bajo para el control y el nibble alto para los datos.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: micro_pepe en 01 de Abril de 2011, 12:08:36
  Mira vos, que cosa extraña. Yo me basé en un datasheet del Winstar WH1604A para sacar las direcciones de memoria. Adjunto una captura del datasheet donde se especifican las direcciones. ¿O tal vez serán diferentes entre un de 16x4 y uno de 20x4?

Sí, es curioso, quizás alguien nos resuelva la duda.

Otra cuestión, al final de todo lo escrito se queda el cursor visible ¿Como se puede eliminar?

Saludos.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Suky en 01 de Abril de 2011, 12:14:10
  Mira vos, que cosa extraña. Yo me basé en un datasheet del Winstar WH1604A para sacar las direcciones de memoria. Adjunto una captura del datasheet donde se especifican las direcciones. ¿O tal vez serán diferentes entre un de 16x4 y uno de 20x4?

Sí, es curioso, quizás alguien nos resuelva la duda.

Otra cuestión, al final de todo lo escrito se queda el cursor visible ¿Como se puede eliminar?

Saludos.

Podes leer el datasheet del LCD, hay comandos para controlar el cursor, apagado, visible, parpadeando, ect...


Código: C
  1. WriteByteLcd(COMANDO,0);


Saludos!
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 01 de Abril de 2011, 12:26:20
  No me acuerdo si en esa librería está la siguiente función que sí está en la que tengo en el rígido actualmente

Código: C
  1. void SetCursorLcd (unsigned char On, unsigned char Blink)
  2.   {
  3.     unsigned char salida;
  4.  
  5.     salida = 0b11<<1;
  6.     salida = (salida|(bit)On)<<1;
  7.     salida = salida|(bit)Blink;
  8.     WriteByteLcd (salida,0);
  9.   }

  Ahora estoy viendo que es muy mejorable dicha función...
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: micro_pepe en 01 de Abril de 2011, 13:20:18

Otra cuestión, al final de todo lo escrito se queda el cursor visible ¿Como se puede eliminar?

Saludos.

Podes leer el datasheet del LCD, hay comandos para controlar el cursor, apagado, visible, parpadeando, ect...


Código: C
  1. WriteByteLcd(COMANDO,0);


Saludos!

[/quote]

Efectivamente con eso se borra el cursor, me imagino que en CCS lo hacia automaticamente. El comando es 0b00001100.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 02 de Abril de 2011, 11:24:05
  Dejo la versión que recién terminé de cambiar de la librería

Código: C
  1. /**************************************************************************
  2. *    Libreria para manejo de LCD en 4 u 8 bits para compilador HiTech     *
  3. ***************************************************************************
  4.  
  5. ***************************************************************************
  6. * Basado en el mapa de memoria de los display WinStar y los comandos del  *
  7. * HD44780.                                                                *
  8. * Sirve para display 16x1, 16x2 y 16x4                                    *
  9. ***************************************************************************
  10.  
  11. ***************************************************************************
  12. *                                                                         *
  13. * Antes de incluir este archivo en nuestro programa hay que definir       *
  14. * algunos parametros. Estos son                                           *
  15. *                                                                         *
  16. * _XTAL_FREQ        (es necesario para los delay utilizados internamente) *
  17. * LcdDataPort       (el puerto que se utilizara para los datos)           *
  18. * LcdControlPort    (el puerto que se utilizara para los bits de control) *
  19. * LcdRWBit          (el numero de bit que se utilizara para RW)           *
  20. * LcdRSBit          (el numero de bit que se utilizara para RS)           *
  21. * LcdENBit          (el numero de bit que se utilizara para EN)           *
  22. *                                                                         *
  23. * En el caso de querer usar protocolo de 4 Bits tambien hay que definir   *
  24. *                                                                         *
  25. * LcdD4             (el numero de bit que sera D4 hacia el display)       *
  26. *                                                                         *
  27. *                                                                         *
  28. *   LcdD4 solo puede ser 0 o 4. Si es 0 se utiliza el nibble bajo de      *
  29. * LcdDataPort para enviar los datos al display. Si es 1 se utiliza        *
  30. * el nibble alto.                                                         *
  31. *   Si no esta definido LcdD4, se usa protocolo de 8 bits. En este caso   *
  32. * se usan los 8 bits de LcdDataPort para enviar los datos al display.     *
  33. *                                                                         *
  34. ***************************************************************************
  35.  
  36. ***************************************************************************
  37. *                                                                         *
  38. *  En esta libreria se encuentran las siguientes funciones                *
  39. *                                                                         *
  40. * InitLcd()                 (inicializa del display)                      *
  41. * ClearLcd()                (borra el display y se posiciona en el inicio)*
  42. * GotoxyLcd(char,char)      (posiciona el cursor en el lugar indicado)    *
  43. * LcdOn()                   (enciende el display)                         *
  44. * LcdOff()                  (apaga el display)                            *
  45. * SetCursorLcd(char,char)   (configura el cursor)                         *
  46. * WriteCharLcd(char)        (envia un caracter al display)                *
  47. * WriteStrLcd(char*)        (envia un String al display)                  *
  48. *                                                                         *
  49. *  El parametro de la funcion anterior puede ser un puntero a un String   *
  50. * o el propio String.                                                     *
  51. *                                                                         *
  52. * ReadBytLcd()              (devuelve el byte leido en la posicion actual)*
  53. * WriteByteLcd(char,char)   (envia un byte al display)                    *
  54. *                                                                         *
  55. *  El segundo parametro de la funcion anterior puede ser 0 o 1 y es el    *
  56. * valor que va a tomar el pin RS.                                         *
  57. *  Por eso, esta funcion puede ser utilizada para enviar una instruccion  *
  58. * o un caracter al display.                                               *
  59. *                                                                         *
  60. *  Tambien se encuentran definidos los parametros CursorOn, CursorOff,    *
  61. * CursorBlinkOn y CursorBlinkOff que son utilizados por la funcion        *
  62. * SetCursorLcd(char).                                                     *
  63. *  Tambien estan definidos los parametros ShiftDisplay, ShiftCursor,      *
  64. * ShiftRight y ShiftLeft que son utilizados por la funcion LcdShift(char) *    
  65. ***************************************************************************
  66.  
  67. ***************************************************************************
  68. *                                                                         *
  69. *  Luego de utilizar las funciones, el puerto utilizado para LcdDataPort  *
  70. * retorna a su estado original.                                           *
  71. *  Es decir que el registro TRIS vuelve a configurarse como estaba antes  *
  72. * de utilizar las funciones. Y sobre el puerto vuelve a aparecer el mismo *
  73. * dato que habia antes de utilizar las funciones para el display          *
  74. *                                                                         *
  75. ***************************************************************************
  76.  
  77. * Ejemplo de configuracion y utilizacion
  78.  
  79.   #define _XTAL_FREQ 10000000    // Cristal 10MHz
  80.   #define LcdControlPort PORTC   // Uso el puerto A para los bits de control
  81.   #define LcdRWBit 0             // El bit 0 del puerto A para RW
  82.   #define LcdRSBit 1             // El bit 0 del puerto A para RS
  83.   #define LcdENBit 1             // El bit 0 del puerto A para EN
  84.   #define LcdDataPort  PORTB     // Uso el puerto B para los datos
  85.   //#define LcdD4 4              // Solo utilizar para protocolo de 4 Bits
  86.  
  87. #include "SuperLcd.C"            // Incluimos nuestra libreria
  88.  
  89. void main(void)
  90. {
  91.   const char * pantalla = "Mundo";
  92.  
  93.   .....
  94.   .....
  95.   .....
  96.   InitLcd();
  97.   WriteStrLcd ("Hola");          // escribe en la primer linea la palabra Hola
  98.   GotoxyLcd (1,2);
  99.   WriteStrLcd (pantalla);        // escribe en la segunda linea la palabra apuntada por la variable pantalla
  100.   SetCursorLcd (CursorOff | CursorBlinkOn); // apaga el cursor, y lo hace parpadear
  101.   LcdShift (ShiftDisplay | ShiftRight); // dezplaza el display hacia la derecha (texto a la izquierda)
  102. }
  103.  
  104. */
  105.  
  106. #if defined (LcdControlPort) && defined (LcdRWBit) && defined (LcdRSBit) && defined (LcdENBit) &&\
  107.     defined (LcdDataPort)
  108.   #if defined (LcdD4)                   //Define el bit de menos peso del nibble (puede ser 0 o 4)
  109.     #define Protocolo4Bits
  110.     #if (LcdD4 != 0) && (LcdD4 != 4)
  111.       #error Mal definido D4 del LCD
  112.         #endif
  113.   #endif
  114.  
  115.   #define CursorOff        0b1100
  116.   #define CursorOn         0b1110
  117.   #define CursorBlinkOff   0b1100
  118.   #define CursorBlinkOn    0b1101
  119.  
  120.   #define ShiftDisplay     0b11000
  121.   #define ShiftCursor      0b10000
  122.   #define ShiftRight       0b10100
  123.   #define ShiftLeft        0b10000
  124.  
  125.   unsigned char Mascara;
  126.   volatile bit TRISLcdRW @ (unsigned)&LcdControlPort*8 +0x80*8 +LcdRWBit;
  127.   volatile bit TRISLcdRS @ (unsigned)&LcdControlPort*8 +0x80*8 +LcdRSBit;
  128.   volatile bit TRISLcdEN @ (unsigned)&LcdControlPort*8 +0x80*8 +LcdENBit;
  129.   volatile bit LcdRW @ (unsigned)&LcdControlPort*8 +LcdRWBit;
  130.   volatile bit LcdRS @ (unsigned)&LcdControlPort*8 +LcdRSBit;
  131.   volatile bit LcdEN @ (unsigned)&LcdControlPort*8 +LcdENBit;
  132.   volatile char TRISLcdData @ (unsigned)&LcdDataPort + 0x80;
  133.  
  134.  
  135.   unsigned char ReadByteLcd(void)
  136.   {
  137.     unsigned char high, low;
  138.     unsigned char TRISAnterior;
  139.     unsigned char DatoAnterior;
  140.     unsigned char DatoLeido;
  141.  
  142.     DatoAnterior = LcdDataPort;
  143.     TRISAnterior = TRISLcdData;
  144.     #ifdef Protocolo4Bits
  145.       #if (LcdD4 == 0)
  146.         TRISLcdData |= 0x0F;
  147.       #elif (LcdD4 == 4)
  148.         TRISLcdData |= 0xF0;
  149.       #endif
  150.     #else
  151.       TRISLcdData = 0xFF;
  152.     #endif
  153.     LcdRS = 0;
  154.     LcdRW = 1;
  155.     LcdEN = 1;
  156.     __delay_us (1);
  157.     #ifdef Protocolo4Bits
  158.       high = LcdDataPort;
  159.       LcdEN = 0;
  160.       __delay_us (1);
  161.       LcdEN = 1;
  162.       __delay_us (1);
  163.       low = LcdDataPort;
  164.       LcdEN = 0;
  165.       #if (LcdD4 == 0)
  166.         high = high<<4;
  167.         low = low & 0x0F;  
  168.       #elif (LcdD4 == 4)
  169.         high = high & 0xF0;
  170.         low = low>>4;  
  171.       #endif
  172.       DatoLeido = high + low;
  173.     #else
  174.       DatoLeido = LcdDataPort;
  175.       LcdEN = 0;
  176.     #endif
  177.     TRISLcdData = TRISAnterior;
  178.     LcdDataPort = DatoAnterior;
  179.     return DatoLeido;
  180.   }
  181.  
  182.   void WriteNibbleLcd (unsigned char Data)
  183.   {
  184.     #ifdef Protocolo4Bits
  185.       #if (LcdD4 == 0)
  186.         LcdDataPort = (LcdDataPort & 0xF0) + (Data>>4);
  187.       #elif (LcdD4 == 4)
  188.         LcdDataPort = (LcdDataPort & 0x0F) + (Data & 0xF0);
  189.       #endif
  190.     #else
  191.       LcdDataPort = Data;
  192.     #endif
  193.     LcdEN = 1;
  194.     __delay_us(2);
  195.     LcdEN = 0;
  196.   }
  197.  
  198.   void WriteByteLcd(unsigned char Data, unsigned char dir)
  199.   {
  200.     unsigned char TRISAnterior;
  201.     unsigned char DatoAnterior;
  202.  
  203.     DatoAnterior = LcdDataPort;
  204.     TRISAnterior = TRISLcdData;    
  205.     TRISLcdData &= Mascara;
  206.     while ((ReadByteLcd() & 128) == 128);
  207.     __delay_us(10);
  208.     LcdRS = (bit)dir;
  209.     LcdRW = 0;
  210.     #ifdef Protocolo4Bits                       //Si uso 4 bits separa el byte en 2
  211.       WriteNibbleLcd(Data);
  212.       WriteNibbleLcd(Data<<4);
  213.     #else
  214.       WriteNibbleLcd(Data);                     //Si uso 8 bits envio el byte entero
  215.     #endif
  216.     TRISLcdData = TRISAnterior;
  217.     LcdDataPort = DatoAnterior;
  218.   }
  219.  
  220.   void WriteStrLcd (const char *palabra)
  221.   {
  222.     while (*palabra)
  223.       WriteByteLcd ((*palabra++),1);
  224.   }
  225.  
  226.   void GotoxyLcd (unsigned char x, unsigned char y)
  227.   {
  228.     if (y == 1) y = 0;
  229.     else
  230.       if (y == 2) y = 0x40;
  231.       else
  232.         if (y == 3) y = 0x10;
  233.         else
  234.           if (y == 4) y = 0x50;
  235.     x--;
  236.     WriteByteLcd (((y+x)|0x80),0);
  237.   }
  238.  
  239.   #define LcdShift(Estado) WriteByteLcd (Estado,0)
  240.   #define SetCursorLcd(Estado) WriteByteLcd (Estado,0)
  241.   #define WriteCharLcd(letra) WriteByteLcd (letra,1)
  242.   #define LcdOn() WriteByteLcd(0x0C,0)
  243.   #define LcdOff() WriteByteLcd(0x08,0)
  244.   #define ClearLcd() WriteByteLcd(0x01,0)
  245.  
  246.   void InitLcd(void)
  247.   {
  248.     unsigned char TRISAnterior;
  249.     unsigned char DatoAnterior;
  250.     unsigned char Contador;
  251.  
  252.     #ifdef Protocolo4Bits
  253.       #if (LcdD4 == 0)
  254.         Mascara = 0xF0;
  255.       #elif (LcdD4 == 4)
  256.         Mascara = 0x0F;
  257.       #endif
  258.     #else
  259.       Mascara = 0;
  260.     #endif
  261.     TRISLcdRW = 0;
  262.     TRISLcdRS = 0;
  263.     TRISLcdEN = 0;
  264.     LcdEN = 0;
  265.     TRISAnterior = TRISLcdData;
  266.     DatoAnterior = LcdDataPort;
  267.     LcdRW = 0;
  268.     LcdRS = 0;
  269.     TRISLcdData &= Mascara;
  270.     __delay_ms (15);
  271.     for (Contador= 3; Contador > 0; Contador--)
  272.     {
  273.       WriteNibbleLcd (0x30);
  274.       __delay_ms (5);
  275.     }
  276.     #ifdef Protocolo4Bits
  277.       WriteNibbleLcd (0x20);                    //indica que se escribe en 2 nibbles de 4 bits
  278.       WriteByteLcd (0x28,0);
  279.       // 30 para el st7066
  280.       // 32 para el st7066
  281.     #else
  282.       WriteByteLcd (0x38,0);
  283.     #endif
  284.     LcdOff(); //08
  285.     // 38 para el st7066?
  286.     ClearLcd(); //01
  287.     WriteByteLcd (0x06,0);  //06
  288.     //WriteByteLcd (0x0E,0);
  289.     LcdOn(); //0C
  290.     TRISLcdData = TRISAnterior;
  291.     LcdDataPort = DatoAnterior;
  292.   }
  293.  
  294. #else
  295.   #error Faltan definir parametros
  296. #endif

  Había un error en la función LcdOn(), que se traducía en un error en la inicialización del display y era que justamente dejaba el cursor encendido. El error era que enviaba el dato 0x0E y corregido enviando el dato 0x0C
  Agregué la función SetCursorLcd() y la función LcdShift(). (En realidad usando #defines)
  Definí los parámetros CursorOn, CursorOff, CursorBlinkOn, CursorBlinkOff para ser utilizados en la función SetCursorLcd(), pudiendo ser usados de la siguiente forma

Código: C
  1. SetCursorLcd(CursorOff | CursorBlinkOff);
  2. SetCursorLcd(CursorOff | CursorBlinkOn);
  3. SetCursorLcd(CursorOn | CursorBlinkOff);
  4. SetCursorLcd(CursorOn | CursorBlinkOn);

  Y también definí los parámetros ShiftDisplay, ShiftCursor, ShiftRight y ShiftLeft para ser utilizados en la función LcdShift(), pudiendo ser usados de la siguiente forma

Código: C
  1. LcdShift(ShiftDisplay | ShiftRight);
  2. LcdShift(ShiftDisplay | ShiftLeft);
  3. LcdShift(ShiftCursor | ShiftRight);
  4. LcdShift(ShiftCursor | ShiftLeft);

  Al utilizar LcdShift (ShiftDisplay | ShiftRight) se desplaza el display a la derecha pero visualmente es el texto desplazándose a la izquierda.

  Como verán sigue siendo una librería básica, pero bueh, es hasta donde da mi cabeza  :oops:
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 04 de Abril de 2011, 02:14:14
vaya, vais muy rapido para mi... jeje :D

genial, probaremos la nueva libreria...


saludos
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 07 de Abril de 2011, 03:43:10
hola:

yo sigo con lo mio angelgris, jeje, pasito a pasito.

he copiado tu ejemplo del ftoa y adapotado a mi programa.

me queda asi:

Código: [Seleccionar]
void SHOW_LCD(void)
{
char * SHOW_PRESS;
int * seba;
ClearLcd();
GotoxyLcd (1,1);
WriteStrLcd ("P= ");
//itoa(SHOW_PRESS,SENSOR_DATA,10);
SHOW_PRESS = ftoa (SENSOR_DATA, seba);
GotoxyLcd (4,1);
WriteStrLcd(SHOW_PRESS);
GotoxyLcd (1,2);
WriteStrLcd ("MODE: ");
GotoxyLcd (6,2);
WriteStrLcd (SHOW_MODE);
__delay_ms(200);

}


pero me da el siguiente error:

Error   [1098] C:\Archivos de programa\HI-TECH Software\PICC\9.80\sources\ftoa.c; 7. conflicting declarations for variable "_ftoa" (C:\pics\18_pruebas\pruebas.C:308)

y en la variables tengo asi:

Código: [Seleccionar]
float  SENSOR_DATA,POT_SER_DATA,POT_SEG_DATA,POT_MAX_DATA;
float SENSITIVITY = 0.009765625f;
char SHOW_PRESS[10];
char SHOW_MODE[10];



aparte que no entiendo muy bien el funcionamiento de ftoa, por el tema de los punteros.... (se agradece explicacion ;-))


saludos y mil gracias
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: LAFUMAT en 13 de Abril de 2011, 05:30:15
ok.

ya me voy poniendo al dia. lo voy viendo claro.

el caso es que al probar los comandos de como desplazar a la derecha, si veo que se ha desplazado, pero el efecto que quiero conseguir es que por ejemplo una linea (la 1 por ejemplo), le pongamos un texto mas largo de 16 caracteres y se desplace para ver el mensaje completo.

Entiendo ¡que el shiftright, es lo que hace ¿verdad?.


ahora probare lo que comentasteis sobre hacer simbolos...


saludos
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: micro_pepe en 21 de Abril de 2011, 14:46:25
¿Alguien ha probado esta libreria con PIC18?  Yo he conseguido compilar el codigo, pero no escribe nada en el LCD.

Saludos.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 21 de Abril de 2011, 15:52:57
  Intenté compilar y me tira algunos warning, posiblemente se deba al diferente manejo de la memoria entre los pic16 y los pic18.

  Por ejemplo, en los header de los 16 para definir cada bit del puerto dice algo como "volatile bit RB0 @ (unsigned)xxxxxx" y para los 18 dice algo como "extern volatile near bit RB0 @ (unsigned)xxxxxxxxxx"
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 21 de Abril de 2011, 16:29:13
  Hola micro_pepe, ya encontré el problema  :-/ :-/ :-/

  El inconveniente está en como manejo los TRIS y los bits de los puertos, ya que en la librería los manejaba en base a la diferencia de direcciones entre el registro del puerto y el registro del tris. Para que se entienda mejor, en los 16F el PORTx tiene x dirección y la dirección de su TRIS correspondiente es la de PORTx + 0x80. Pero en el 18F452 esa diferencia es de 0x12, por ello no funcionaba.

Así estaba originalmente la librería...

Código: C
  1. volatile bit TRISLcdRW @ (unsigned)&LcdControlPort*8 +0x80*8 +LcdRWBit;
  2.   volatile bit TRISLcdRS @ (unsigned)&LcdControlPort*8 +0x80*8 +LcdRSBit;
  3.   volatile bit TRISLcdEN @ (unsigned)&LcdControlPort*8 +0x80*8 +LcdENBit;
  4.   volatile bit LcdRW @ (unsigned)&LcdControlPort*8 +LcdRWBit;
  5.   volatile bit LcdRS @ (unsigned)&LcdControlPort*8 +LcdRSBit;
  6.   volatile bit LcdEN @ (unsigned)&LcdControlPort*8 +LcdENBit;
  7.   volatile char TRISLcdData @ (unsigned)&LcdDataPort + 0x80;

Y estos son los cambios mencionados...

Código: C
  1. volatile near bit TRISLcdRW @ ((unsigned)&LcdControlPort*8 +0x12*8) +LcdRWBit;
  2.   volatile near bit TRISLcdRS @ ((unsigned)&LcdControlPort*8 +0x12*8) +LcdRSBit;
  3.   volatile near bit TRISLcdEN @ ((unsigned)&LcdControlPort*8 +0x12*8) +LcdENBit;
  4.   volatile near bit LcdRW @ ((unsigned)&LcdControlPort*8) +LcdRWBit;
  5.   volatile near bit LcdRS @ ((unsigned)&LcdControlPort*8) +LcdRSBit;
  6.   volatile near bit LcdEN @ ((unsigned)&LcdControlPort*8) +LcdENBit;
  7.   volatile near char TRISLcdData @ ((unsigned)&LcdDataPort) + 0x12;

  Para que se entienda mejor aún, observá estas dos líneas....

Código: C
  1. volatile char TRISLcdData @ (unsigned)&LcdDataPort + 0x80; // original para los 16F
  2. volatile near char TRISLcdData @ ((unsigned)&LcdDataPort) + 0x12; // modificacion para el 18F452

  Me voy a tener que poner a trabajar sobre la librería para que se la pueda utilizar en cualquier PIC  :5]
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: micro_pepe en 21 de Abril de 2011, 20:53:14
  Hola micro_pepe, ya encontré el problema  :-/ :-/ :-/


Eres un genio  ;-) gracias por todo, ya tengo el pic18 funcionando.

Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: czeiss en 25 de Mayo de 2011, 05:59:09
Hola, a todos
Espero que me puedan ayudar.. ya que llevo bastante tiempo tratando de hacer funcionar un LCD, sin resultado. (En esto de programar en Hitech C, estoy comenzando)
Para acceder al LCD utilizo la libreria de Angel Gris. Y al realizar la simulacion en proteus, me reclama que el dispositivo LCD se encuentra ocupado.
Les adjunto el proyecto, haber si me pueden hechar una mano.
Desde ya gracias a todos.

Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 25 de Mayo de 2011, 14:37:36
  Estoy mirando tu código y veo que en la configuración estás habilitando el debugger. Eso hace uso de los pines RB6 y RB7, ¿no estará generando inconvenientes? ¿Qué pasa si deshabilitas el debugger?
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: czeiss en 25 de Mayo de 2011, 19:49:26
Hola
Gracias por responder.
Voy a deshabilitar el debugger y te cuento.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 25 de Mayo de 2011, 19:56:27
  Ese no es el problema, pero creo que ya lo encontré.

  Por defecto (después de un PowerOnReset) los pines que se configuren como entradas, quedarán como entradas analógicas. La librería pone como entrada el puerto que se esté utilizando para datos, para poder leer el bit de bussy, y así esperar a que se desocupe el display para mandarle el próximo dato.

  En tu pic, al hacer entradas al puerto B, quedan como entradas analógicas y por lo tanto no es interpretado correctamente el bit de bussy enviado por el display.

  Para solucionar eso, basta con poner

Código: C
  1. ANSEL = 0;
  2. ANSELH = 0;

  antes de llamar a InitLcd();
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: czeiss en 26 de Mayo de 2011, 03:50:42
Hola
Muchas gracias, ahora funciona me sacaste un peso de encima. Te pasaste AngelGris.
Ahora seguire practicando con HiTech C.
Me puedes recomendar un manual de HiTech para partir desde cero..
Nuavemente gracias.
Saludos

Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 26 de Mayo de 2011, 09:25:51
  He bajado varios libros de C, pero la mayoría tenían ejemplos en CCS o MikroC. Así que básicamente lei uno de ANSI-C y uno bastante básico de C que tenía algunos ejemplos comparativos entre la sintaxis de CCS y la de HiTech, el resto fue empezar a ver algunos ejemplos que trae el compilador y también la lectura de los archivos .h del propio compilador.

  Estos son los libros que leí...

"An introduction to programming the Microchip PIC in C"

"Aprenda lenguaje ANSI C como si estuviera en primero"
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 28 de Octubre de 2011, 23:56:58
  Aca dejo la última versión de la libreria. Modifiqué la forma en que manejo de los puertos para que se pueda utilizar tanto en la familia 16F como en la 18F.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: jukinch en 29 de Octubre de 2011, 01:29:50
Gracias Angelgris por compartirla :)
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: matucho en 16 de Julio de 2012, 23:19:39
Gracias, esta muy buena!
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Masterboy1980 en 16 de Septiembre de 2012, 23:14:12
oye, verás que pongo todo lo que indicas en el ejemplo para usar tu librería y me dice "faltan definir parámetros"

Build F:\HI-TECH_MPLAB\N_LCD_1.0 for device 16F877A
Using driver C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe

Make: The target "F:\HI-TECH_MPLAB\SuperLcd.p1" is out of date.
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" --pass1 F:\HI-TECH_MPLAB\SuperLcd.c -q --chip=16F877A -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Error   [103] F:\HI-TECH_MPLAB\SuperLcd.c; 300.32 #error: Faltan definir parametros
Make: The target "F:\HI-TECH_MPLAB\LCD_1.00.p1" is out of date.
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" --pass1 F:\HI-TECH_MPLAB\LCD_1.00.c -q --chip=16F877A -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"

********** Build failed! **********

eso es lo que me indica todo el tiempo.

uso la última librería que pones y los datos del ejemplo y le doy compilar y nada. Si pudieras por favor orientarme.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 16 de Septiembre de 2012, 23:40:58
  Por favor muestra el código que estás utilizando.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Masterboy1980 en 16 de Septiembre de 2012, 23:50:29
mira este es el código:

#define _XTAL_FREQ 4000000    // Cristal 4MHz 
  #define LcdRW RB0             // El bit 0 del puerto B para RW
  #define LcdRS RB1             // El bit 1 del puerto B para RS
  #define LcdEN RB2             // El bit 2 del puerto B para EN
  #define LcdRWTris TRISB0
  #define LcdRSTris TRISB1
  #define LcdENTris TRISB2 
  #define LcdDataPort PORTB     // Uso el puerto B para los datos
  #define LcdDataTris TRISB 
  #define LcdD4 4              // Solo utilizar para protocolo de 4 Bits
  #include <htc.h>
  #include "SuperLcd.c"         // Incluimos nuestra libreria
 

 void main(void)
{
  const char * pantalla = "Mundo";
 
  InitLcd();
  WriteStrLcd ("Hola");          // escribe en la primer linea la palabra Hola
  GotoxyLcd (1,2);
  WriteStrLcd (pantalla);        // escribe en la segunda linea la palabra apuntada por la variable pantalla
  SetCursorLcd (CursorOff | CursorBlinkOn); // apaga el cursor, y lo hace parpadear
  LcdShift (ShiftDisplay | ShiftRight); // dezplaza el display hacia la derecha (texto a la izquierda)
}

sin embargo como te podrás dar cuenta es el mismo que tu pones y verás que no compila.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 17 de Septiembre de 2012, 09:33:23
  Por lo general la primer línea del programa debe ser

Código: C
  1. #include <htc.h>

tu la estás colocando luego de los #define, prueba con ese cambio para ver que ocurre.

  Yo utilicé la librería con la versión 9.8 del compilador.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Masterboy1980 en 17 de Septiembre de 2012, 21:22:48
efectivamente ya lo hice y sigue marcando el mismo error, yo estoy utilizando el MPLAB v8.87 con el compilador HI-TECH 9.83... es curioso pues a todos los demás parece funcionarles bien si acaso algunos inconvenientes y yo topé con pared con ese detalle.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Suky en 17 de Septiembre de 2012, 21:36:03
La manera adecuada sería crear un SuperLCD.h donde allí colocar los #define que corresponde la micro, o sea:

Código: C
  1. #ifndef __SUPER_LCD_H_
  2. #define __SUPER_LCD_H_
  3.   #define _XTAL_FREQ 4000000
  4.   #include <htc.h>
  5.   #define LcdRW RB0             // El bit 0 del puerto B para RW
  6.   #define LcdRS RB1             // El bit 1 del puerto B para RS
  7.   #define LcdEN RB2             // El bit 2 del puerto B para EN
  8.   #define LcdRWTris TRISB0
  9.   #define LcdRSTris TRISB1
  10.   #define LcdENTris TRISB2  
  11.   #define LcdDataPort PORTB     // Uso el puerto B para los datos
  12.   #define LcdDataTris TRISB  
  13.   #define LcdD4 4              // Solo utilizar para protocolo de 4 Bits
  14.  
  15. void WriteByteLcd(unsigned char Data, unsigned char dir);
  16. void InitLcd(void);
  17. void GotoxyLcd (unsigned char x, unsigned char y);
  18. void WriteStrLcd (const char *palabra);
  19.  
  20.   #define LcdShift(Estado) WriteByteLcd (Estado,0)
  21.   #define SetCursorLcd(Estado) WriteByteLcd (Estado,0)
  22.   #define WriteCharLcd(letra) WriteByteLcd (letra,1)
  23.   #define LcdOn() WriteByteLcd(0x0C,0)
  24.   #define LcdOff() WriteByteLcd(0x08,0)
  25.   #define ClearLcd() WriteByteLcd(0x01,0)
  26.  
  27.  
  28. #endif

En SuperLCD.c colocar al principio #include "SuperLCD.h" y los mismo en el main.c

Es una mala costumbre incluir los *.c, me parece que viene del uso de CCS  :mrgreen:

Saludos!
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Masterboy1980 en 17 de Septiembre de 2012, 23:45:52
De la misma manera que el anterior caso y ahora incluyendo el archivo de cabecera que muestras tampoco funciona, sigue diciendo Faltan definir parámetros.
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: Suky en 18 de Septiembre de 2012, 00:26:25
 :shock: Ahi ya no se que será, porque claramente se ve que están todos los parametros necesarios y establecidos de la mejor manera :tongue:
Título: Re: subo pequeña libreria para LCD en Hitech C
Publicado por: AngelGris en 18 de Septiembre de 2012, 09:28:26
  Acabo de bajar la librería y compilar un ejemplo de reloj y funcionó bien, siempre trabajando con la versión 9.80 del compilador.

  Puedes intentar lo siguiente... edita la librería y elimina las siguientes primeras lineas de código.

Código: C
  1. #if defined (LcdRW) && defined (LcdRS) && defined (LcdEN) &&\
  2.     defined (LcdDataPort)
  3.   #if defined (LcdD4)                   //Define el bit de menos peso del nibble (puede ser 0 o 4)
  4.     #define Protocolo4Bits
  5.     #if (LcdD4 != 0) && (LcdD4 != 4)
  6.       #error Mal definido D4 del LCD
  7.         #endif
  8.   #endif

 y también elimina las siguientes últimas líneas de código

Código: C
  1. #else
  2.   #error Faltan definir parametros
  3. #endif

  Dichas líneas están justamente para que genere un error cuando te faltó definir algún parámetro o cuando está mal definido LcdD4.