Autor Tema: subo pequeña libreria para LCD en Hitech C  (Leído 19779 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
subo pequeña libreria para LCD en Hitech C
« 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
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #1 en: 20 de Junio de 2010, 00:05:14 »
muy eleganrte la pruebo y te comento angelgris
salutes¡¡¡¡¡
No es la conciencia del hombre la que determina su ser, sino, por el contrario, es su ser social el que determina su conciencia

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #2 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
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #3 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:

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #4 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado sebastian 100

  • PIC12
  • **
  • Mensajes: 58
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #5 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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #6 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #7 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....


??

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #8 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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #9 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...
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #10 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


}



}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #11 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Rodricity

  • PIC10
  • *
  • Mensajes: 43
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #12 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...

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #13 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

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: subo pequeña libreria para LCD en Hitech C
« Respuesta #14 en: 29 de Marzo de 2011, 09:26:33 »
rodricity:

todo es bien recibido, para aprender

muchas gracias