Autor Tema: Como mostrar texto y valores decimales en LCD con MPLABX  (Leído 2093 veces)

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

Desconectado juanes79

  • PIC10
  • *
  • Mensajes: 41
Como mostrar texto y valores decimales en LCD con MPLABX
« en: 16 de Octubre de 2016, 22:35:49 »
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


            }
        }
    }
}



« Última modificación: 16 de Octubre de 2016, 22:58:15 por juanes79 »


 

anything