Cordial saludo.
Les consulto porque el siguiente programa desarrollado en MPLABX no me muestra el contenido completo de la segunda linea del display LCD 2x16, en el cual se almacena una cadena de texto y una variable. Cuando el programa se graba en el pic, se visualiza bien la primera linea que es texto y la segunda línea, solo se ve el siguiente contenido: CANTIDAD: 34 la cantidad puesta en rojo es de una variable contador que se almacena en la memoria eeprom, pero no se visualiza cuando se carga el programa. Solo se visualiza si se pulsa el suiche RD3, el cual se encuentra en el código mostrado. Ver código
#include "mcc_generated_files/mcc.h"
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <htc.h>
#define LCD_RS RD6
#define LCD_EN RD7
#define LCD_DATA PORTB
//#pragma config WDTE = OFF, PWRTE = ON, CP = OFF, BOREN = OFF, DEBUG = OFF, FCMEN = OFF, LVP = OFF, MCLRE = ON, CPD = ON,
//#pragma config IESO = OFF, FOSC = XT,WRT = OFF,
#define _XTAL_FREQ 4000000
char centenas, decenas, unidades; //defino variables char.solo van de 0 a 9
// aux=0; //defino variable int. van desde 0 hasta 999
int dato=0;
char E1=0;
char E2=0;
char E3=0;
char E4=0;
long cont=0;
void lcd_init (void); //inicializacion del LCD
void set_lcd (void); //Configuracion del LCD
void lcd_puts(const char * s); //cadenas de caracteres al LCD
void lcd_putch(char c); //
void lcd_goto(unsigned char pos); // Direcciones en el LCD
void lcd_write(unsigned char c); //Escritura en el LCD
void binbcd ()
{
centenas=cont/100;
decenas=(cont%100)/10;
unidades=cont%10;
}
void lcd_init(void) //funcion de inicializacion del LCD
{
LCD_DATA=2; // se manda el dato 2 al puerto para iniciar el LCD
set_lcd(); // se la funcion de configuracion
LCD_DATA=56; // mando el dato 56 al puerto para 8 bits,2 lineas y 5x7
set_lcd(); // llamo funcion de configuracion
LCD_DATA=12; // mando el dato 12 para prender el LCD con cursor
set_lcd();
LCD_DATA=6;
set_lcd();
LCD_DATA=1;
set_lcd();
}
void set_lcd (void) // funcion de configuracion
{
LCD_RS=0; //RS en cero para indicar al LCD que es configuracion
LCD_EN=1; // se habilita la operacion
__delay_ms(2); //retardo necesario para la operacion
LCD_EN=0; // termina la operacion
}
//Voy a una poscion especifica del LCD
void lcd_goto(unsigned char pos) // funcion de direcciones
{
LCD_RS = 0; //RS en cero para configuracion
lcd_write(0x80+pos); //sumo 80H a pos que viene con un dato
}
void lcd_write(unsigned char c) // funcion de escritura en el LCD
{
LCD_EN=1;//habilito la operacion
LCD_DATA = ( c );//mando al puerto el dato que hay en C.
__delay_ms(2); //retardo necesario para la operacion
LCD_EN=0;// termino la operacion
}
/* Escribo una cadena de caracteres en el LCD */
void lcd_puts(const char * s)
{
LCD_RS = 1; //habilito operacion
while(*s) //mientras haya caracteres en la cadena enviada
lcd_write(*s++); //pase al siguiente
}
/* Escribo un caracter en el LCD*/
void lcd_putch(char c)
{
LCD_RS = 1; //habilito escritura en LCD
lcd_write( c );
}
void escritura (void){
if(cont<256){
EEPROM_WRITE(0x01,cont);
}
if(cont>255 && cont<511){
E2 = cont-255;
EEPROM_WRITE(0x02,E2);
}
else if(cont<256){
EEPROM_WRITE(0x02,0);
}
if(cont>510 && cont<765){
E3 = cont-510;
EEPROM_WRITE(0x03,E3);
}
else if(cont<511){
EEPROM_WRITE(0x03,0);
}
if(cont>765 && cont<1000){
E4 = cont-765;
EEPROM_WRITE(0x04,E4);
}
else if(cont<766){
EEPROM_WRITE(0x04,0);
}
}
void leer (void){
E1=EEPROM_READ(0X01);
E2=EEPROM_READ(0X02);
E3=EEPROM_READ(0X03);
E4=EEPROM_READ(0X04);
cont=E1+E2+E3+E4;
}
void main(void)
{
leer();
SYSTEM_Initialize();
lcd_init(); //LLAMO FUNCION DE INICIALIZACION
while(1) //ciclo while para no hacer nada.ya mostro el mesaje
{
lcd_goto(0); // selecciono primera línea
lcd_puts("LA CARGA ES 500 ");
__delay_ms(200);
lcd_goto(0x40); // Selecciono segunda línea
lcd_puts ("CANTIDAD: "); //mensaje para la segunda linea
while(1)
{
while(cont<260 || RD5 ==0 )
{
if(RD5==0) //SUICHE S2
{
__delay_ms(2);
cont=-1;
binbcd();
lcd_goto(0X4B); // Ubico centenas en poscion CB del LCD
lcd_putch(centenas+48); // sumo 48 para pasar a ASCLL
lcd_goto(0X4C); //Ubico decenas en posicion CC del LCD
lcd_putch(decenas+48); //sumo 48 para pasar a ASCLL
lcd_goto(0X4D); //Ubico unidades en posicion CE DEL LCD
lcd_putch(unidades+48); //Sumo 48 para pasar a Ascll
__delay_ms(100);
}
else
if(RD3==1) //SENSOR S4
{
break;
}
RA0=1;
__delay_ms(2);
RA0=0;
cont++;
escritura();
binbcd();
lcd_goto(0X4B); // Ubico centenas en poscion CB del LCD
lcd_putch(centenas+48); // sumo 48 para pasar a ASCLL
lcd_goto(0X4C); //Ubico decenas en posicion CC del LCD
lcd_putch(decenas+48); //sumo 48 para pasar a ASCLL
lcd_goto(0X4D); //Ubico unidades en posicion CE DEL LCD
lcd_putch(unidades+48); //Sumo 48 para pasar a Ascll
__delay_ms(10); //Incremento cuenta cada 500 ms
}
}
}
}