Autor Tema: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F  (Leído 3330 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« en: 09 de Enero de 2014, 17:39:55 »
buenas tardes a todos ya tengo tiempito de no pasar por aca, y pues donde buscar la mejor ayuda aqui en el foro.
hace unos dias una amiga me pidio ayudarla en su proyecto de graduacion de la universidad, el trabajo es crear o modificar librerias para pic18f4550 y pic18f45k22 para trabajar en la easypic de mikroe, bueno ya tengoo casi todas las librerias pero hay una que me esta dando guerra y es la libreria de lcd, yo encontre una por internet que estaba en ruso y la modifique y me funciono pero con los pines de datos de rb4-rb7 y los pines de enable y rs en rd2 y rd0 respectivamente, ahora que quiero pasarla para que trabaje en la easy pic que los pines son todo el puerto b, pines de datos del rb0-rb3 , rs=rb4 y en=rb5, modifique esto en la libreria pero no me funciona he cambiado la inicializacion, he hecho algunos cambios en escribir en la lcd y nada...aqui esta el codigo de la libreria, estoy trabajndo con mpla xc8, les agradesco su ayuda.
lcd2.h
Código: [Seleccionar]
/*
 * B4,B5,B6,B7 pinlerini kullanarak 4 bit iletisim kullanir.
 * Cursor kapalidir.
 * RW kullanilmadigi icin direk topraga baglanabilir.
 *
 * 2x16 LCD Kullanim Klavuzu
 * lcd_init(); ile LCD'nin ilk ayarlarini yap
 * lcd_clear(); ile LCD'yi sil
 * putsLCD("deneme"); seklinde yazi yazdir.
 * putcLCD('F'); seklinde tek ascii kodu yazdir.
 * lcd_gotoxy(1,13); seklinde LCD'nin istenilen yerine git.
 */

#include <xc.h>

#define rs LATB4
#define rw LATB6
#define e  LATB5
#define rs_tris TRISBbits.RB4
#define rw_tris TRISBbits.RB6
#define e_tris  TRISBbits.RB5

#define lcd_port PORTB
#define lcd_tris TRISBbits
////////////////////////////////////////////

/* LCD'de kullanilan komutlarin tanimlamasi*/
#define CLEAR 1 // Ekrani temizler
#define HOME 2 // Imleci sol ust koseye getirir
#define SHIFT_CUR_LEFT 4 // Imlecin belirttigi adres azalarak gider
#define SHIFT_CUR_RIGHT 5
#define SHIFT_DISP_LEFT 6 // Imlecin belirttigi adres artarak gider
#define SHIFT_DISP_RIGHT 7
#define DISPLAY_OFF 11
#define ImlecGizle 12 // Gostergeyi ac, kursor gorunmesin
#define CURSOR_OFF 13
#define BLINK_OFF 14 // Yanip sonen blok kursor
#define DISPLAY_ON 15 // Yanip sonen blok kursor
#define ImlecGeri 16 // Kursoru bir karakter geri kaydir
#define KaydirSaga 24 // Gostergeyi bir karakter saga kaydir
#define KaydirSola 28 // Gostergeyi bir karakter sola kaydir
#define EkraniKapat 8 // Gostergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir baslangic adresi
// (DDRAM adres)
#define IkinciSatir 192 // ikinci satirin baslangic adresi
#define KarakUretAdres 64 // Karakter ureteci adresini belirle
// (CGRAM adres)
/* LCD'de Kullanilan Fonksiyon Secimi */
#define EIGHT_BIT_2_5X7 56 // 8 bit ara birim, 2 satir, 5*7 piksel
#define EIGHT_BIT_1_5X7 48 // 8 bit ara birim, 1 satir, 5*7 piksel
#define FOUR_BIT_2_5X7 40 // 4 bit ara birim, 2 satir, 5*7 piksel
#define FOUR_BIT_1_5X7 32 // 4 bit ara birim, 1 satir, 5*7 piksel
extern void putcLCD(unsigned char);
extern void lcd_clear(void);
extern void putsLCD(const char *s);
extern void lcd_gotoxy(unsigned char x, unsigned char y);
extern void lcd_init(void);
extern void lcd_cmd(unsigned char c);


lcd.c
Código: [Seleccionar]
#include "lcd2.h" // lcd.h dosyasi tanimlanip, degerler aliniyor

void lcd_busy() {
    unsigned char i;
    for (i = 0; i < 10; i++)
        __delay_us(25);
}

void lcd_cmd(unsigned char c) // Komut g�nderme fonksiyonu
{
    rw = 0;
    rs = 0;
    e = 1;
    lcd_port = c >> 4;
    e = 0;
    lcd_busy();
    e = 1;
    lcd_port = c & 0x0F;
    e = 0;
    lcd_busy();
}

void putcLCD(unsigned char c) {
    rw = 0;
    rs = 1;
    e = 1;
    lcd_port = c >> 4;
    e = 0;
    lcd_busy();
    e = 1;
    lcd_port = c & 0x0F;
    e = 0;
    lcd_busy();
}

void lcd_clear(void) // LCD siliniyor
{
    lcd_cmd(0x1);
    __delay_ms(2);
}

void putsLCD(const char * s) {
    lcd_busy();
    while (*s) {
        putcLCD(*s++);
    }
}

void lcd_gotoxy(unsigned char x, unsigned char y) {
    unsigned char direccion;

    if (y != 1)
        direccion = 0x40;
    else
        direccion = 0;

    direccion += x - 1;
    lcd_cmd(0x80 | direccion);
}

void lcd_init() {

    lcd_tris.RB0 = 0;
    lcd_tris.RB1 = 0;
    lcd_tris.RB2 = 0;
    lcd_tris.RB3 = 0;

    rs_tris = 0;
    rw_tris = 0;
    e_tris = 0;

    rs = 0;
    e = 0;
    rw = 0;

    __delay_ms(15);

    e = 1;

    lcd_cmd(0x02);

    __delay_ms(2);

    lcd_cmd(FOUR_BIT_2_5X7);
    lcd_cmd(SHIFT_DISP_LEFT);
    lcd_cmd(DISPLAY_ON);
    lcd_clear();
    lcd_cmd(BirinciSatir);
}

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #1 en: 09 de Enero de 2014, 19:20:10 »
Hola,

estás pisando señales al escribir el puerto completo. Podrías probar usando:

Código: [Seleccionar]
#include "lcd2.h" // lcd.h dosyasi tanimlanip, degerler aliniyor

void lcd_busy() {
    unsigned char i;
    for (i = 0; i < 10; i++)
        __delay_us(25);
}

inline void writePort(char data)
{
char aux = lcd_port & 0xF0;
aux |= data;
lcd_port = aux;
}

void lcd_cmd(unsigned char c) // Komut g�nderme fonksiyonu
{
    rw = 0;
    rs = 0;
    e = 1;
    writePort (c >> 4);
    e = 0;
    lcd_busy();
    e = 1;
    writePort (c & 0x0F);
    e = 0;
    lcd_busy();
}

void putcLCD(unsigned char c) {
    rw = 0;
    rs = 1;
    e = 1;
    writePort (c >> 4);   
    e = 0;
    lcd_busy();
    e = 1;
    writePort (c & 0x0F);
    e = 0;
    lcd_busy();
}

void lcd_clear(void) // LCD siliniyor
{
    lcd_cmd(0x1);
    __delay_ms(2);
}

void putsLCD(const char * s) {
    lcd_busy();
    while (*s) {
        putcLCD(*s++);
    }
}

void lcd_gotoxy(unsigned char x, unsigned char y) {
    unsigned char direccion;

    if (y != 1)
        direccion = 0x40;
    else
        direccion = 0;

    direccion += x - 1;
    lcd_cmd(0x80 | direccion);
}

void lcd_init() {

    lcd_tris.RB0 = 0;
    lcd_tris.RB1 = 0;
    lcd_tris.RB2 = 0;
    lcd_tris.RB3 = 0;

    rs_tris = 0;
    rw_tris = 0;
    e_tris = 0;

    rs = 0;
    e = 0;
    rw = 0;

    __delay_ms(15);

    e = 1;

    lcd_cmd(0x02);

    __delay_ms(2);

    lcd_cmd(FOUR_BIT_2_5X7);
    lcd_cmd(SHIFT_DISP_LEFT);
    lcd_cmd(DISPLAY_ON);
    lcd_clear();
    lcd_cmd(BirinciSatir);
}
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #2 en: 09 de Enero de 2014, 19:52:13 »
hola gracias por contestar, bueno te cuento que acabo de probar y nada, en proteus sale como que el cursor va corriendo espacio hacia la derecha pero en la easypic no sale nada, en el programa tengo que solo imprima la letra v aqui esta el codigo:
Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "lcd2.h"

#pragma config PLLDIV = 1
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 1
#pragma config FOSC = HS
#pragma config BOR = ON
#pragma config BORV = 2
#pragma config WDTPS = 32768
#pragma config CCP2MX = ON
#pragma config PBADEN = ON
#pragma config MCLRE = ON
#pragma config STVREN = ON
#pragma config MCLRE = ON

void Delay1Second() {
    int i = 0;
    for (i = 0; i < 100; i++)
        __delay_ms(10);
}

void main() {
    TRISA = 0b00000000;
    TRISB = 0b00000000;
    TRISC = 0b00000000;
    TRISD = 0b00000000;
    TRISE = 0b00000000;
    PORTA = 0b00000000;
    PORTB = 0b00000000;
    PORTC = 0b00000000;
    PORTD = 0b00000000;
    PORTE = 0b00000000;
    __delay_ms(25);
    lcd_init();

    while (1) {
        putcLCD("T");
        Delay1Second();
    }
}
no se que mas puedo hacer o que tengo malo...

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 624
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #3 en: 09 de Enero de 2014, 20:44:54 »
tengo una duda, ¿Que version de EasyPIC tiene?, le pregunto porque yo tengo la version 6 y el pin rw va a tierra, y usted  en una de sus configuraciones pone #define rw LATB6, ese pin se puede usar en su easypic?

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #4 en: 09 de Enero de 2014, 22:05:00 »
La version 6 pero en la libreria siempre esta en 0 osea es lo mismo si lo usamos o no siempre esta a tierra...no que tengo malo o cual es el problema

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #5 en: 10 de Enero de 2014, 10:55:56 »
  Yo creo que está mal la rutina de inicialización del display. Según datasheet del 44780 para protocolo de cuatro bits

Código: C
  1. esperar mas de 15ms
  2. enviar 0x30
  3. esperar mas de 4.1ms
  4. enviar 0x30
  5. esperar mas de 100us
  6. enviar 0x30
  7.  
  8. ----despues de la instruccion anterior ya se puede checkear el bit de busy---------
  9.  
  10. enviar 0x20
  11.  
  12. y luego se envian 4 bytes mas que dependeran de la configuracion elegida
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #6 en: 10 de Enero de 2014, 14:48:27 »
Como es eso de chequeareñ bit de busy?...esa inicializacion yo la hice y nada...la volveré a hacer a ver como me va...pero eso del bit de busy no entiendo...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #7 en: 10 de Enero de 2014, 16:45:59 »
Como es eso de chequeareñ bit de busy?...esa inicializacion yo la hice y nada...la volveré a hacer a ver como me va...pero eso del bit de busy no entiendo...

 Para checkear el bit de busy es necesario utilizar el pin RW, pero si en tu placa RW queda conectado a GND no se puede checkear dicho bit. Por lo tanto deberás colocar una espera relativamente larga entre byte y byte que quieras enviar.
  En el datasheet te muestra los tiempos que insume cada operación pero aclara que si una instrucción es enviada sin checkear el bit de busy el tiempo entre la primer instrucción y la siguiente sera mucho mayor al tiempo de la propia instrucción.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #8 en: 10 de Enero de 2014, 17:51:18 »
bueno con los delays los estoy haciendo ahorita...pero no entiendo como hacer la inicializacion...tambien hay que poner el pin de enable en alto y en bajo o como??

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #9 en: 10 de Enero de 2014, 19:26:05 »
AYUDAAAA he hecho de todo y nada no funciona como que se queda congelado el lcd o no se...que mas puedo hacer? o como crear una libreria apartir de esta o de otra para saber bien que es lo que tengo malo...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #10 en: 10 de Enero de 2014, 19:41:13 »
  Te adjunto una que hice para poder utilizar los PIC16Fxxxx, pero también podrías intentar utilizar la propia librería que trae XC8
  En el caso de mi librería, hace uso del pin RW, por lo tanto te tocará modificar esa parte del código. Es en la función lcd_put() que leo el bit de busy, por lo tanto en lugar de dicha lectura tendrás que colocar un delay. Hay instrucciones del 44780 que insumen más de 1.5mS así que podrías comenzar probando con delay de 5 o 10mS para ver que ocurre.

  Hasta ahora no la probé en físico, sólo la simulé en proteus y funciona bien. Además, ésta librería es una adaptación de una anterior que ya había subido al foro y hubo gente que la probó en físico y les ha funcionado bien.

xlcd.h
Código: C
  1. #ifndef XCLCD_H
  2. #define XCLCD_H
  3.  
  4. #ifndef _XC_H_
  5. #include <xc.h>
  6. #endif
  7.  
  8. /******************************************************************************
  9.  *  Parametros configurables por el usuario                                   *
  10.  ******************************************************************************/
  11.  
  12. /*
  13.  * El valor de _XTAL_FREQ debe coincidir con el valor definido
  14.  * en el programa principal
  15.  */
  16.  
  17. /*
  18.  * LCDEN define el pin EN para el lcd
  19.  * LCDRS define el pin RS para el lcd
  20.  * LCDRW define el pin RW para el lcd
  21.  * LCDDATA define el puerto de datos
  22.  */
  23.  
  24. /*
  25.  * Si se utiliza un pic con resgistros LAT
  26.  * se pueden definir los pines utilizando LAT<x>bits.LAT<x><y>
  27.  * siendo <x> la letra del puerto correspondiente y <y> el bit
  28.  * Tambien se puede definir de la misma manera el puerto de datos
  29.  */
  30.  
  31. /*
  32.  * TRISLCDEN define el bit TRIS para el pin EN
  33.  * TRISLCDRS define el bit TRIS para el pin RS
  34.  * TRISLCDRW define el bit TRIS para el pin RW
  35.  * LCDTRIS define el TRIS correspondiente al puerto de datos
  36.  */
  37.  
  38. /*
  39.  * PROTOCOL4BIT define si se utiliza protocolo de 4 bits
  40.  * PROTOCOL8BIT define si se utiliza protocolo de 8 bits
  41.  */
  42.  
  43. /*
  44.  * En caso de utilizar protocolo de 4 bits
  45.  * UPPER define si se utiliza el nibble alto del puerto
  46.  * LOWER define si se utiliza el nibble bajo del puerto
  47.  */
  48.  
  49. #ifndef _XTAL_FREQ
  50. #define _XTAL_FREQ 20000000
  51. #endif
  52.  
  53. #define LCDEN PORTBbits.RB0
  54. #define LCDRS PORTBbits.RB1
  55. #define LCDRW PORTBbits.RB2
  56. #define TRISLCDEN TRISBbits.TRISB0
  57. #define TRISLCDRS TRISBbits.TRISB1
  58. #define TRISLCDRW TRISBbits.TRISB2
  59. #define LCDDATA PORTB
  60. #define LCDTRIS TRISB
  61. #define PROTOCOL4BIT
  62. #define UPPER
  63.  
  64.  
  65. /******************************************************************************
  66.  *  Definicion de valores para lcd_setdisplay                                 *
  67.  ******************************************************************************/
  68. /*
  69.  * Los valores se pueden combinar utilizando el operador &
  70.  */
  71.  
  72. #define displayoff 0b11110111
  73. #define displayon  0b11110011
  74. #define cursoroff  0b11110011
  75. #define cursoron   0b11110001
  76. #define blinkoff   0b11110011
  77. #define blinkon    0b11110010
  78.  
  79. /******************************************************************************
  80.  *  Definicion de valores para lcd_shift                                      *
  81.  ******************************************************************************/
  82. /*
  83.  * Los valores se pueden combinar utilizando el operador &
  84.  */
  85.  
  86. #define shiftdisplay 0b11100100
  87. #define shiftcursor  0b11101100
  88. #define shiftleft    0b11101100
  89. #define shiftright   0b11101000
  90.  
  91. /******************************************************************************
  92.  *  Definicion de valores para lcd_entrymode                                  *
  93.  ******************************************************************************/
  94. /*
  95.  * Los valores se pueden combinar utilizando el operador &
  96.  */
  97.  
  98. #define increment 0b11111001
  99. #define decrement 0b11111010
  100. #define shifton   0b11111000
  101. #define shiftoff  0b11111001
  102.  
  103. /******************************************************************************
  104.  *  Definicion de funciones                                                   *
  105.  ******************************************************************************/
  106.  
  107. void lcd_init(void);
  108. void lcd_put(unsigned char, unsigned char);
  109. void lcd_puts(const unsigned char*);
  110. void lcd_gotoxy(unsigned char, unsigned char);
  111. bit lcd_busy(void);
  112. void lcd_putini(unsigned char);
  113. void lcd_createchar(unsigned char, const unsigned char*);
  114. void lcd_setdisplay(unsigned char);
  115. void lcd_shift(unsigned char);
  116. void lcd_entrymode(unsigned char);
  117.  
  118. #define lcd_putch(x) lcd_put(x,1)
  119. #define lcd_clear() lcd_put(0x01,0)
  120. #define lcd_home() lcd_put(0x02,0)
  121. #define lcd_off() lcd_put(0x08,0)
  122. #define lcd_on() lcd_put(0x0C,0)
  123.  
  124. #endif  /* XCLCD_H */


xlcd.c
Código: C
  1. #include "xclcd.h"
  2.  
  3. #if !defined(LCDEN) || !defined(LCDRS) || !defined(LCDRW)
  4. #error Faltan definir los pines de control
  5. #elif !defined(TRISLCDEN) || !defined(TRISLCDRS) || !defined(TRISLCDRW)
  6. #error Falta definir la direccion de los pines de control
  7. #elif !defined(LCDDATA) || !defined(LCDTRIS)
  8. #error Falta definir el puerto y/o el tris de datos
  9. #elif !defined(PROTOCOL4BIT) && !defined(PROTOCOL8BIT)
  10. #error Falta definir el protocolo
  11. #elif defined(PROTOCOL4BIT) && !defined(UPPER) && !defined(LOWER)
  12. #error Falta definir el nibble
  13. #else
  14.  
  15. void lcd_init(void)
  16. {
  17.     unsigned char veces;
  18.  
  19.     LCDEN = 0;
  20.     LCDRS = 0;
  21.     LCDRW = 0;
  22.     TRISLCDRS = 0;
  23.     TRISLCDRW = 0;
  24.     TRISLCDEN = 0;
  25.     __delay_ms(15);
  26.     for (veces = 3; veces > 0; veces--)
  27.     {
  28.     lcd_putini(0x30);
  29.     __delay_ms(5);
  30.     }
  31. #if defined(PROTOCOL8BIT)
  32.     lcd_put(0x38,0);                          // Dos lineas, caracter 5x8
  33. #elif defined(PROTOCOL4BIT)
  34.     lcd_putini(0x20);                         // Protocolo de 4 bits
  35.     lcd_put(0x28,0);                          // Dos lineas, caracter 5x8
  36. #endif
  37.     lcd_put(0x0C,0);                          // Cursor, blink apagado
  38.     lcd_put(0x01,0);                          // Borrar display
  39.     lcd_put(0x06,0);
  40. }
  41.  
  42. void lcd_putini(unsigned char data)
  43. {
  44.     unsigned char lasttris;
  45.  
  46.     lasttris = LCDTRIS;
  47. #if defined(PROTOCOL8BIT)
  48.     LCDTRIS = 0;
  49.     LCDDATA = data;
  50. #elif defined(PROTOCOL4BIT)
  51. #if defined(UPPER)
  52.     LCDTRIS &= 0x0F;
  53.     LCDDATA = (LCDDATA & 0x0F) | data;
  54. #elif defined(LOWER)
  55.     LCDTRIS &= 0xF0;
  56.     data = data >> 4;
  57.     LCDDATA = (LCDDATA & 0xF0) | data;
  58. #endif
  59. #endif
  60.     LCDEN = 1;
  61.     __delay_us(1);
  62.     LCDEN = 0;
  63.     LCDTRIS = lasttris;
  64. }
  65.  
  66. void lcd_put(unsigned char data, unsigned char reg)
  67. {
  68.     unsigned char lasttris;
  69.  
  70.     lasttris = LCDTRIS;
  71.     while(lcd_busy() == 1);
  72.     LCDRS = reg;
  73.     LCDRW = 0;
  74. #if defined(PROTOCOL8BIT)
  75.     LCDTRIS = 0;
  76.     LCDDATA = data;
  77.     LCDEN = 1;
  78.     __delay_us(1);
  79.     LCDEN = 0;
  80. #elif defined(PROTOCOL4BIT)
  81. #if defined(UPPER)
  82.     LCDTRIS &= 0x0F;
  83.     LCDDATA = (LCDDATA & 0x0F) | (data & 0xF0);
  84.     LCDEN = 1;
  85.     __delay_us(1);
  86.     LCDEN = 0;
  87.     __delay_us(1);
  88.     LCDDATA = (LCDDATA & 0x0F) | (data << 4);
  89.     LCDEN = 1;
  90.     __delay_us(1);
  91.     LCDEN = 0;
  92. #elif defined(LOWER)
  93.     LCDTRIS &= 0xF0;
  94.     LCDDATA = (LCDDATA & 0xF0) | (data >> 4);
  95.     LCDEN = 1;
  96.     __delay_us(1);
  97.     LCDEN = 0;
  98.     __delay_us(1);
  99.     LCDDATA = (LCDDATA & 0xF0) | (data & 0x0F);
  100.     LCDEN = 1;
  101.     __delay_us(1);
  102.     LCDEN = 0;
  103. #endif
  104.  
  105. #endif
  106.     LCDTRIS = lasttris;
  107. }
  108.  
  109.  
  110. bit lcd_busy(void)
  111. {
  112.     unsigned char lasttris;
  113.     unsigned char busy;
  114.  
  115.     lasttris = LCDTRIS;
  116.     LCDRS = 0;
  117.     LCDRW = 1;
  118. #if defined(PROTOCOL8BIT)
  119.     LCDTRIS = 0xFF;
  120.     LCDEN = 1;
  121.     __delay_us(1);
  122.     busy = LCDDATA;
  123.     LCDEN = 0;
  124. #elif defined(PROTOCOL4BIT)
  125. #if defined(UPPER)
  126.     LCDTRIS = (LCDTRIS & 0x0F) | 0xF0;
  127.     LCDEN = 1;
  128.     __delay_us(1);
  129.     busy = LCDDATA;
  130.     LCDEN = 0;
  131.     __delay_us(1);
  132.     LCDEN = 1;
  133.     __delay_us(1);
  134.     LCDEN = 0;
  135. #elif defined(LOWER)
  136.     LCDTRIS = (LCDTRIS & 0xF0) | 0x0F;
  137.     LCDEN = 1;
  138.     __delay_us(1);
  139.     busy = LCDDATA << 4;
  140.     LCDEN = 0;
  141.     __delay_us(1);
  142.     LCDEN = 1;
  143.     __delay_us(1);
  144.     LCDEN = 0;
  145. #endif
  146. #endif
  147.     LCDTRIS = lasttris;
  148.     if ((busy & 0x80) == 0x80) return 1;
  149.     else
  150.         return 0;
  151. }
  152.  
  153. void lcd_gotoxy(unsigned char x, unsigned char y)
  154. {
  155.     x--;
  156.     y--;
  157.     if (y == 0) lcd_put((0x80 + x),0);
  158.     else
  159.         lcd_put((0xC0 + x),0);
  160. }
  161.  
  162. void lcd_puts(const unsigned char* st)
  163. {
  164.     while (*st != 0)
  165.     {
  166.         lcd_put(*st,1);
  167.         st++;
  168.     }
  169. }
  170.  
  171. void lcd_createchar(unsigned char asciicode, const unsigned char* ascii)
  172. {
  173.     unsigned char line;
  174.     unsigned char caracter;
  175.  
  176.     for (line = 0; line < 7; line++)
  177.     {
  178.         caracter = ((asciicode & 0x07) << 3) | 0x40 + line;
  179.         lcd_put(caracter,0);
  180.         lcd_put(*ascii,1);
  181.         ascii++;
  182.     }
  183.     caracter = ((asciicode & 0x07) << 3) | 0x47;
  184.     lcd_put(caracter,0);
  185.     lcd_put(0,1);
  186.     lcd_clear();
  187. }
  188.  
  189. void lcd_setdisplay(unsigned char state)
  190. {
  191.     lcd_put(~state,0);
  192. }
  193.  
  194. void lcd_shift(unsigned char state)
  195. {
  196.     lcd_put(~state,0);
  197. }
  198.  
  199. void lcd_entrymode(unsigned char state)
  200. {
  201.     lcd_put(~state,0);
  202. }
  203. #endif
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #11 en: 11 de Enero de 2014, 17:41:28 »
buenas tardes a todos...ayer leyendo un documento donde un profesor de la universidad que da la clase de microcontroladores explico como hacer funcionar un lcd16x2 el codigo es pequeño a el le funciono con el pic16f887 y lo que hice yo fue cambiar el puerto usando latb...ahora me sale unos errores que antes no me salian...ya no se que mas hacer para hacer funcionar el lcd con el pic18f4550...aqui esta el codigo es siimple pero a el le funciono.
Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

#pragma config PLLDIV = 5
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2
#pragma config FOSC = HS // You can write this way
#pragma config FCMEN = OFF   // OR this way
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config BORV = 3
#pragma config VREGEN = OFF
#pragma config WDT = OFF
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF

#define RS LATB4
#define EN_PIN LATB5

void Delay1Second() {
    int i = 0;
    for (i = 0; i < 100; i++)
        __delay_ms(10);
}

void init_4bit_LCD() {
    LATB = 0x03;
    ClockPulse();
    __delay_us(4500); // wait min 4.1ms
    LATB = 0x03;
    ClockPulse();
    __delay_us(4500); // wait min 4.1ms
    LATB = 0x03;
    ClockPulse();
    __delay_us(150); // wait min 150 uS
    LATB = 0x02;
    ClockPulse();
    //Function Set: 4 bit interface, 2 lines, 5x8 dots simbols
    LCD_SendCommand(0x28);
    //Display ON, Cursor OFF, Blink OFF
    LCD_SendCommand(0x0C);
    //Clear Display
    LCD_SendCommand(0x01);
    __delay_us(1640);
    //Modo de Operacion
    LCD_SendCommand(0x06);
}

void ClockPulse() {
    EN_PIN = 1;
    __delay_us(40);
    EN_PIN = 0;
    __delay_us(40);
}

void LCD_SendCommand(unsigned char command) {
    LATB = (command & 0xF0) >> 4;
    ClockPulse();
    LATB = command & 0x0F;
    ClockPulse();
}

void LCD_SendChar(unsigned char ch) {
    LATB = (1 << RS) | ((ch & 0xF0) >> 4);
    ClockPulse();
    LATB = (1 << RS) | (ch & 0x0F);
    ClockPulse();
}

void main() {
    char *str = "Hola Mundo!";

    PORTB = 0x00;
    TRISB = 0x00;

    __delay_ms(25);

    init_4bit_LCD();

    for (int i = 0; str[i] != 0; i++) {
        LCD_SendChar(str[i]);
    }

    while (1) {
        LATB6 = 0;
        Delay1Second();
        LATB6 = 1;
        Delay1Second();

    }
}

y aqui estan los errores que me da ahora pero antes no me los daba...
Código: [Seleccionar]
TEST_LCD_PIC18F4550.c:39: warning: (361) function declared implicit int
TEST_LCD_PIC18F4550.c:50: warning: (361) function declared implicit int
TEST_LCD_PIC18F4550.c:60: error: (984) type redeclared
TEST_LCD_PIC18F4550.c:60: error: (1098) conflicting declarations for variable "ClockPulse" (TEST_LCD_PIC18F4550.c:39)
no se a que se deban esos errores...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #12 en: 11 de Enero de 2014, 18:44:14 »
  Para poder usar tanto __delay_us() como __delay_ms() debes definir _XTAL_FREQ, y su valor debe coincidir con la frecuencia de trabajo del CPU.

  Supongo que uno de los errores está en la definición de ClockPulse(), ya que no recibe parámetros te falta colocar void dentro de los paréntesis.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #13 en: 13 de Enero de 2014, 15:30:18 »
hola a todos, bueno les cuento que ya hice que la simulacion me funcionara modifique un poco el codigo y por fin me funciono en proteus...ahora le problema esta ya cunado programo el pic ya para probarlo real...pareciera como que el pic se queda trabado, al final del codigo puse que se encendiera un led y se apagara y ni eso hace cuando programo el pic...que puedo tener mal? seran los bits de configuracion?. aqui les dejo el codigo y la simulacion en proteus...
lcd.h
Código: [Seleccionar]
/******************************************************
 *              LIBRERIA LCD 16x2 PIC18               *
 *                                                    *
 * Pines : RB0, RB1, RB2, RB3                         *
 * Modo :  4-bits                                     *
 * LCD 16x2                                           *
 * Init_4bit_LCD(); Inicializa el LCD                 *
 * LCD_Clear(); Limpia la LCD                         *
 * LCD_SendString("String"); Escribe string en la LCD *
 * LCD_SendChar('F'); Escribe caracteres en la LCD    *
 * LCD_GotoXY(3,1); Selecciona la Posicion de la LCD  *
 ******************************************************/

#include <xc.h>

/******************************************/
/* Conexiones del LCD al Microcontrolador */
#define RS_PIN LATBbits.LATB4 //
#define EN_PIN LATBbits.LATB5
#define LCD_DataPort LATB

/* Configuracion del Display y cursor */
#define DON 0b00001111  /* Display encendido   */
#define DOFF 0b00001011  /* Display apagado     */
#define CURSOR_HOME 0b00000010  /* Cursor encendido    */
#define CURSOR_ON 0b00001111  /* Cursor encendido    */
#define CURSOR_OFF 0b00001101  /* Cursor apagado      */
#define BLINK_ON 0b00001111  /* Cursor con parpadeo */
#define BLINK_OFF 0b00001110  /* Cursor sin parpadeo */
#define CLEAR 0b00000001  /* Display encendido   */

/* Modo de entrada */
#define INCREMENT 0b00000110  /* Incrementa la posicion del cursor */
#define DECREMENT 0b00000100  /* Decrementa la posicion del cursor */


/* Configuracion de los desplazamientos del cursor y del Display*/
#define SHIFT_CUR_LEFT 0b00010011  /* Corrimiento del cursor a la izquierda  */
#define SHIFT_CUR_RIGHT 0b00010111  /* Corrimiento del cursor a la derecha    */
#define SHIFT_DISP_LEFT 0b00011011  /* Corrimiento del display a la izquierda */
#define SHIFT_DISP_RIGHT 0b00011111  /* Corrimiento del display a la derecha   */


/* Funciones de inicializacion */
#define NIBLE                   0b00000010  /* interface a 4 bits */
#define FOUR_BIT 0b00101111  /* Interface a 4-bit  */
#define EIGHT_BIT 0b00111111  /* Interface a 8-bit  */
#define LINE_5X7 0b00110011  /* Una linea, caracter 5x7 */
#define LINE_5X10 0b00110111  /* Una linea, caracter 5x10 */
#define LINES_5X7 0b00111011  /* Dos lineas. character 5x7 */


/* Lineas de trabajo */
#define DDRAM_LINEA_1 0b10000000 /* Linea 1 */
#define DDRAM_LINEA_2 0b11000000 /* Linea 2 */
#define DDRAM_LINEA_3 0b10010000 /* Linea 3 */
#define DDRAM_LINEA_4 0b11010000 /* Linea 4 */


extern void LCD_SendChar(unsigned char);
extern void LCD_Clear(void);
extern void LCD_SendString(const char *s);
extern void LCD_GotoXY(unsigned char x, unsigned char y);
extern void Init_4bit_LCD(void);
extern void LCD_SendCommand(unsigned char c);
void Clock_Pulse(void);


lcd.c
Código: [Seleccionar]
/*************************************************
 *           Desarrollado con la ayuda           *
 *              del archivo pdf LCD              *
 *              proporcionado por el             *
 *         Ingeniero Ivan de Jesus Deras         *
 *************************************************/

#include "lcd2.h"

void Clock_Pulse() {
    EN_PIN = 1;
    __delay_us(40);
    EN_PIN = 0;
    __delay_us(40);
}

void LCD_SendCommand(unsigned char c) {
    LCD_DataPort = (c & 0xF0) >> 4;
    Clock_Pulse();

    LCD_DataPort = c & 0x0F;
    Clock_Pulse();

    LCD_DataPort = 0x00;
    __delay_ms(40);
}

void LCD_SendChar(unsigned char c) {
    LCD_DataPort = (c & 0xF0) >> 4;
    RS_PIN = 1;
    Clock_Pulse();
    RS_PIN = 0;

    LCD_DataPort = (c & 0x0F);
    RS_PIN = 1;
    Clock_Pulse();
    RS_PIN = 0;

    LCD_DataPort = 0x00;
    __delay_ms(40);
}

void LCD_Clear(void) {
    LCD_SendCommand(0x1);
    __delay_ms(2);
}

void LCD_SendString(const char * s) {
    while (*s) {
        LCD_SendChar(*s++);
    }
}

void LCD_GotoXY(unsigned char x, unsigned char y) {
    unsigned char direccion;

    if (y != 1)
        direccion = 0x40;
    else
        direccion = 0;

    direccion += x - 1;
    LCD_SendCommand(0x80 | direccion);
}

void Init_4bit_LCD() {
    EN_PIN = 0;
    RS_PIN = 0;

    __delay_ms(20);

    LCD_DataPort = 0x02;
    Clock_Pulse();

    LCD_DataPort = 0x00;

    __delay_ms(20);

    //Function Set: 4 bit interface, 2 lines, 5x8 dots simbols
    LCD_SendCommand(0x28);
    //Clear Display
    LCD_SendCommand(0x01);
    __delay_us(1640);
    //Modo de Operacion
    LCD_SendCommand(0x06);
}


Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: URGENTE AYUDA CON LIBRERIA LCD16X2 PIC18F
« Respuesta #14 en: 14 de Enero de 2014, 20:37:21 »
Buenas tardes a todos...ya logre hacer funcionar la lcd y la glcd con el pic18f4550...eran los bits de configuracion que algunos estaban malos...ahora necesito hacer funcionar todo eso con el pic18f45k22 pero no se cuales son los bits de configuracion...alguien me los pueden pasar...que trabaje a 8Mhz