una pregunta estoy tratando de configurar la lcd 2x16 para pic 24fj64gb002 pero he tenido problemas no escribe se ubica en la posicion pero a momento de escribir no lo hace me he ayudado con este tema de xc8 pero estoy utilizando xc16 y he tratado de adaptarlo al compilador las ddiferentes librerias de este curso pero no ha dado resultado por favor si me pudieran ayudar aqui les dejo el programa :
[pre]#include <p24FJ64GB002.h>
#include <stdio.h>
#include <stdlib.h>
#include <libpic30.h>
//config2
//#pragma config POSCMOD = HS // Primary Oscillator Select (HS Oscillator mode selected)
#pragma config PLL96MHZ = ON // 96MHz PLL Startup Select (96 MHz PLL Startup is enabled automatically on start-up)
#pragma config PLLDIV = DIV5 // USB 96 MHz PLL Prescaler Select (Oscillator input divided by 5 (20 MHz input))
//config1
#pragma config FWDTEN = OFF // Watchdog Timer (Watchdog Timer is disabled)
#pragma config GWRP = OFF // General Segment Write Protect (Writes to program memory are allowed)
#pragma config GCP = OFF // General Segment Code Protect (Code protection is disabled)
#pragma config JTAGEN = ON // JTAG Port Enable (JTAG port is enabled)
#define _XTAL_FREQ 20000000
#define __delay_ms(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/10000.0)))
#define __delay_us(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/10000000.0)))
#define LED PORTAbits.RA1
#define ra0 PORTAbits.RA0
#include "xclcd.h"
void main(void)
{
unsigned char alfa[17] = "Peque";
const unsigned char letra[8] = {0b00000000,
0b00001110,
0b00000000,
0b00010110,
0b00011001,
0b00010001,
0b00010001};
unsigned char veces;
PORTA = 0;
TRISA = 0;
// PORTB = 0;
// TRISB = 0;
lcd_init();
__delay_ms(1500);
lcd_createchar(1,letra);
__delay_ms(1500);
lcd_setdisplay(DISPLAY_OFF);
__delay_ms(1500);
lcd_puts("Pequeno");
__delay_ms(1500);
lcd_gotoxy(1,2);
__delay_ms(1500);
lcd_puts(alfa);
__delay_ms(1500);
lcd_putch(1);
__delay_ms(1500);
lcd_putch('o');
__delay_ms(1500);
lcd_setdisplay(CURSOR_ON);
__delay_ms(1500);
lcd_puts("hola");
__delay_ms(1500);
lcd_gotoxy(1,2);
__delay_ms(1500);
lcd_setdisplay(CURSOR_ON);
__delay_ms(1500);
lcd_puts("fino");
while(1)
{
LED=1;
__delay_ms(500);
LED=0;
__delay_ms(500);
}
}[/pre]
librerias de angel gris publicado en este post XCLCD.h
#ifndef XCLCD_H
#define XCLCD_H
#ifndef _XC_H_
#include <p24FJ64GB002.h>
#endif
/******************************************************************************
* Parametros configurables por el usuario *
******************************************************************************/
/*
* El valor de _XTAL_FREQ debe coincidir con el valor definido
* en el programa principal
*/
/*
* LCDEN define el pin EN para el lcd
* LCDRS define el pin RS para el lcd
* LCDRW define el pin RW para el lcd
* LCDDATA define el puerto de datos
*/
/*
* Si se utiliza un pic con resgistros LAT
* se pueden definir los pines utilizando LAT<x>bits.LAT<x><y>
* siendo <x> la letra del puerto correspondiente y <y> el bit
* Tambien se puede definir de la misma manera el puerto de datos
*/
/*
* LCDTRISEN define el bit TRIS para el pin EN
* LCDTRISRS define el bit TRIS para el pin RS
* LCDTRISRW define el bit TRIS para el pin RW
* LCDTRIS define el TRIS correspondiente al puerto de datos
*/
/*
* PROTOCOL4BIT define si se utiliza protocolo de 4 bits
* PROTOCOL8BIT define si se utiliza protocolo de 8 bits
*/
/*
* En caso de utilizar protocolo de 4 bits
* UPPER define si se utiliza el nibble alto del puerto
* LOWER define si se utiliza el nibble bajo del puerto
*/
/*
* En caso de utilizar el pin RW, hay que definir
* USE_RW
*/
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 20000000
#endif
#define LCDEN PORTBbits.RB13
#define LCDRS PORTBbits.RB15
#define LCDRW PORTBbits.RB14
#define LCDTRISEN TRISBbits.TRISB13
#define LCDTRISRS TRISBbits.TRISB15
#define LCDTRISRW TRISBbits.TRISB14
#define LCDDATA PORTB
#define LCDTRIS TRISB
#define LCDLAT LATB
#define PROTOCOL4BIT
#define LOWER
#define USE_RW
/******************************************************************************
* Definicion de valores para lcd_setdisplay *
******************************************************************************/
/*
* Los valores se pueden combinar utilizando el operador |
*/
#define DISPLAY_OFF 0b00001000
#define DISPLAY_ON 0b00001100
#define CURSOR_OFF 0b00001100
#define CURSOR_ON 0b00001110
#define BLINK_OFF 0b00001100
#define BLINK_ON 0b00001101
/******************************************************************************
* Definicion de valores para lcd_shift *
******************************************************************************/
/*
* Los valores se pueden combinar utilizando el operador |
*/
#define SHIFT_DISPLAY 0b00011000
#define SHIFT_CURSOR 0b00010000
#define SHIFT_LEFT 0b00010000
#define SHIFT_RIGHT 0b00010100
/******************************************************************************
* Definicion de valores para lcd_entrymode *
******************************************************************************/
/*
* Los valores se pueden combinar utilizando el operador |
*/
#define INCREMENT 0b00000110
#define DECREMENT 0b00000100
#define SHIFT_ON 0b00000101
#define SHIFT_OFF 0b00000100
/******************************************************************************
* Definicion de funciones *
******************************************************************************/
void lcd_init(void);
void lcd_put(unsigned char, unsigned char);
void lcd_puts(const unsigned char*);
void lcd_gotoxy(unsigned char, unsigned char);
int lcd_busy(void);
void lcd_putini(unsigned char);
void lcd_createchar(unsigned char, const unsigned char*);
void lcd_setdisplay(unsigned char);
void lcd_shift(unsigned char);
void lcd_entrymode(unsigned char);
#define lcd_putch(x) lcd_put(x,1)
#define lcd_clear() lcd_put(0x01,0)
#define lcd_home() lcd_put(0x02,0)
#define lcd_off() lcd_put(0x08,0)
#define lcd_on() lcd_put(0x0C,0)
#endif /* XCLCD_H */
y aqui XCLCD.c
#include <p24FJ64GB002.h>
#include "xclcd.h"
#define _XTAL_FREQ 20000000
#define __delay_ms(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/10000.0)))
#define __delay_us(x) __delay32((unsigned long)((x)*(_XTAL_FREQ/10000000.0)))
#if !defined(LCDEN) || !defined(LCDRS)
#error Faltan definir los pines de control
#elif !defined(LCDTRISEN) || !defined(LCDTRISRS)
#error Falta definir la direccion de los pines de control
#elif !defined(LCDDATA) || !defined(LCDTRIS)
#error Falta definir el puerto y/o el tris de datos
#elif !defined(PROTOCOL4BIT) && !defined(PROTOCOL8BIT)
#error Falta definir el protocolo
#elif defined(PROTOCOL4BIT) && !defined(UPPER) && !defined(LOWER)
#error Falta definir el nibble
#else
void lcd_putini(unsigned char data)
{
unsigned char lasttris;
lasttris = LCDTRIS;
#if defined(PROTOCOL8BIT)
LCDTRIS = 0;
LCDDATA = data;
#elif defined(PROTOCOL4BIT)
#if defined(UPPER)
LCDTRIS &= 0x0F;
LCDDATA = (LCDDATA & 0x0F) | data;
#elif defined(LOWER)
LCDTRIS &= 0xF0;
data = data >> 4;
LCDDATA = (LCDDATA & 0xF0) | data;
#endif
#endif
LCDEN = 1;
__delay_us(1);
LCDEN = 0;
LCDTRIS = lasttris;
}
void lcd_put(unsigned char data, unsigned char reg)
{
unsigned char lasttris;
lasttris = LCDTRIS;
#if defined (USE_RW)
while(lcd_busy() == 1);
#else
__delay_ms(2);
#endif
LCDRS = reg;
LCDRW = 0;
#if defined(PROTOCOL8BIT)
LCDTRIS = 0;
LCDDATA = data;
LCDEN = 1;
__delay_us(1);
LCDEN = 0;
#elif defined(PROTOCOL4BIT)
#if defined(UPPER)
LCDTRIS &= 0x0F;
LCDDATA = (LCDDATA & 0x0F) | (data & 0xF0);
LCDEN = 1;
__delay_us(1);
LCDEN = 0;
__delay_us(1);
LCDDATA = (LCDDATA & 0x0F) | (data << 4);
LCDEN = 1;
__delay_us(1);
LCDEN = 0;
#elif defined(LOWER)
LCDTRIS &= 0xF0;
LCDDATA = (LCDDATA & 0xF0) | (data >> 4);
LCDEN = 1;
__delay_us(1);
LCDEN = 0;
__delay_us(1);
LCDDATA = (LCDDATA & 0xF0) | (data & 0x0F);
LCDEN = 1;
__delay_us(1);
LCDEN = 0;
#endif
#endif
LCDTRIS = lasttris;
}
void lcd_init(void)
{
unsigned char veces;
LCDEN = 0;
LCDRS = 0;
LCDRW = 0;
LCDTRISRS = 0;
LCDTRISRW = 0;
LCDTRISEN = 0;
__delay_ms(15);
for (veces = 3; veces > 0; veces--)
{
lcd_putini(0x30);
__delay_ms(5);
}
#if defined(PROTOCOL8BIT)
lcd_put(0x38,0); // Dos lineas, caracter 5x8
#elif defined(PROTOCOL4BIT)
lcd_putini(0x20); // Protocolo de 4 bits
lcd_put(0x28,0); // Dos lineas, caracter 5x8
#endif
lcd_put(0x08,0); // Apagar display, cursor, blink
lcd_put(0x01,0); // Borrar display
lcd_put(0x06,0); // Incrementa posicion, sin shift
}
int lcd_busy(void)
{
unsigned char lasttris;
unsigned char busy;
lasttris = LCDTRIS;
LCDRS = 0;
LCDRW = 1;
#if defined(PROTOCOL8BIT)
LCDTRIS = 0xFF;
LCDEN = 1;
__delay_us(1);
busy = LCDDATA;
LCDEN = 0;
#elif defined(PROTOCOL4BIT)
#if defined(UPPER)
LCDTRIS = (LCDTRIS & 0x0F) | 0xF0;
LCDEN = 1;
__delay_us(1);
busy = LCDDATA;
LCDEN = 0;
__delay_us(1);
LCDEN = 1;
__delay_us(1);
LCDEN = 0;
#elif defined(LOWER)
LCDTRIS = (LCDTRIS & 0xF0) | 0x0F;
LCDEN = 1;
__delay_us(1);
busy = LCDDATA << 4;
LCDEN = 0;
__delay_us(1);
LCDEN = 1;
__delay_us(1);
LCDEN = 0;
#endif
#endif
LCDTRIS = lasttris;
if ((busy & 0x80) == 0x80) return 1;
else
return 0;
}
void lcd_gotoxy(unsigned char x, unsigned char y)
{
x--;
y--;
if (y == 0) lcd_put((0x80 + x),0);
else
lcd_put((0xC0 + x),0);
}
void lcd_puts(const unsigned char *st)
{
while (*st != 0)
{
lcd_put(*st,1);
st++;
}
}
void lcd_createchar(unsigned char asciicode, const unsigned char* ascii)
{
unsigned char line;
unsigned char caracter;
for (line = 0; line < 7; line++)
{
caracter = (((asciicode & 0x07) << 3) | (0x40 + line));
lcd_put(caracter,0);
lcd_put(*ascii,1);
ascii++;
}
caracter = ((asciicode & 0x07) << 3) | 0x47;
lcd_put(caracter,0);
lcd_put(0,1);
lcd_clear();
}
void lcd_setdisplay(unsigned char state)
{
lcd_put(state,0);
}
void lcd_shift(unsigned char state)
{
lcd_put(state,0);
}
void lcd_entrymode(unsigned char state)
{
lcd_put(state,0);
}
#endif
agradeceria muchisimo la ayuda