Autor Tema: alguien tiene programas para pic18f452 como ejemplo para mi?  (Leído 3282 veces)

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

Desconectado henryto

  • PIC10
  • *
  • Mensajes: 1
alguien tiene programas para pic18f452 como ejemplo para mi?
« en: 11 de Agosto de 2004, 11:56:00 »
programo perfectamente el microcontrolador pic16f877, pero aun no he programado nada con el pic18f452, no tengo ni idea cual sea la mejor opcion, trabajar en assembler o trabajar en MPLAB 18C compiler...............alguien puede guiarme o al menos enviarme unos ejemplos de los programas para este pic?

henryabril27@hotmail.com

gracias

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: alguien tiene programas para pic18f452 como ejemplo para mi?
« Respuesta #1 en: 11 de Agosto de 2004, 16:22:00 »
Con la serie 18 tienes el doble de instrucciones assembler,puedes mirarte el datasheet para ver sobre el tema.
En cuanto a probar con C,te recomendaría mejor el compilador PCW.Un buen manual en castellano lo tienes en este enlace
http://www.frino.com.ar/compiladores_CCS.htm
y en el subforo de lenguaje C hay recién iniciado un microcursillo con ejemplos interesantes.
En cuanto a cual es la mejor opción,eso depende de como mejor te venga a tí.
Lo ideal es que experimentes tú,y si te atascas en algo,entre todos los sacamos.
Un saludo

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: alguien tiene programas para pic18f452 como ejemplo para mi?
« Respuesta #2 en: 28 de Noviembre de 2004, 11:18:00 »
Bueno, este es un programa que además de ser la CPU del circuito además realiza funciones de esclavo. Ordenes que se envian desde un PC. Dale un ojo y me cuentas si tienes dudas al respecto:

 #include <18F452.h>
#device adc=16
#use delay(clock=20000000)
#fuses NOWDT,WDT128,HS, NOPROTECT, NOOSCSEN, NOBROWNOUT, BORV42, PUT, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=pc)
#use rs232(baud=38400,parity=N,xmit=PIN_C0,rcv=PIN_C1,bits=8,stream=video)
#rom int 0xf00000={1}
#ZERO_RAM
#priority RDA,TIMER0,TIMER1,EXT
#include <stdlib.h>
//#define   IRQ_A         PIN_B0
//#define   IRQ_B         PIN_B1
#define   READY         PIN_C2
#define   D_I            PIN_D0
#define   D_O            PIN_D1
#define   SCL            PIN_D2
#define   RESET_CPU_VIDEO   PIN_D3
#define   CS_A         PIN_D4
#define   CS_B         PIN_D5
#byte   INTCON2 =0xFF1
    int      i;
   int      N=1;
   int      Timer0_Counter=0;
   int      Timer1_Counter=0;
   int32    Dato;
    int      Direccion_Video;
   float   Auxiliar_Video;
   int32   Dato_Input=0;
   int32   Dato_Out=0;
   int      Pulsos=0;
   int      Direccion=0;
   int      Clock_Cycles=0;
   const   int   Command_Byte_Read      =0b00000000;
   const   int   Command_Byte_Write      =0b10000000;
//   int      GAIN                  =0b00000000;      //AJUSTE DE GANANCIA (8 BITS)
//   float   const REGIMEN_CORRIENTE   = 1.2057378682554489243663017203786e-5;
//   float   const REGIMEN_VOLTAJE   = 6.934862159662735235343242154911e-5;
//   long   const AIRMS_OFFSET         =0xCB;//-53d
//   long   const AVRMS_OFFSET         =0x2A;//-42d
//   int      const AVRMS_GAIN         =0x9C;//-47d
//   short   RP=false;
//   short   UPS=false;







   float   Software_Version=1.0;
   float   RP_Potencia_Activa_FA=1.1;
   float   RP_Potencia_Activa_FB=1.2;
   float   RP_Potencia_Activa_FC=1.3;
   float   RP_Potencia_Reactiva_FA=1.4;
   float   RP_Potencia_Reactiva_FB=1.5;
   float   RP_Potencia_Reactiva_FC=1.6;
   float   RP_Potencia_Aparente_FA=1.7;
   float   RP_Potencia_Aparente_FB=1.8;
   float   RP_Potencia_Aparente_FC=1.9;
   float   RP_Factor_Potencia_FA=2.0;
   float   RP_Factor_Potencia_FB=2.1;
   float   RP_Factor_Potencia_FC=2.2;
   short   RP_FASE_A=false;
   short   RP_FASE_B=false;
   short   RP_FASE_C=false;
   float   RP_Voltaje_FA=150;
   float   RP_Voltaje_FB=2.4;
   float   RP_Voltaje_FC=2.5;
   float   RP_Corriente_FA=2.6;
   float   RP_Corriente_FB=2.7;
   float   RP_Corriente_FC=2.8;
   float   RP_Frecuencia_FA=2.9;
   float   RP_Frecuencia_FB=3.0;
   float   RP_Frecuencia_FC=3.1;
   int      Temperatura=4;
   short   PE_FASE_A=false;
   short   PE_FASE_B=false;
   short   PE_FASE_C=false;
   float   PE_Voltaje_Bateria=4.1;
   short   TA_RED=false;
   short   TA_PLANTA=false;
   float   UPS_Voltaje_FA=4.2;
   float   UPS_Voltaje_FB=4.3;
   float   UPS_Corriente_FA=4.4;
   float   UPS_Corriente_FB=4.5;
   float   UPS_Frecuencia_FA=4.6;
   float   UPS_Frecuencia_FB=4.7;
   float   UPS_Voltaje_Banco_Baterias=4.8;
   float   UPS_Voltaje_Neutro_Tierra=4.9;

/*******************************************************/
void write_ADE7753()
{
   Dato_Out=Command_Byte_Write;
   Dato_Out|=Direccion;
   Pulsos=0x08;
   envia_ADE7753();
   Dato_Out=Dato;
   Pulsos=Clock_Cycles;
//   envia_ADE7753();
   output_high(CS_A);
   output_high(CS_B);
}
/*******************************************************/
void read_ADE7753()
{
   Dato_Out=Command_Byte_Read;
   Dato_Out=Dato_Out|Direccion;
   Pulsos=0x08;
   envia_ADE7753();
   Pulsos=Clock_Cycles;
//   recibe_ADE7753();
   output_high(CS_A);
   output_high(CS_B);
}
/*******************************************************/
void Tx_Data_Video()
{
   if(input(READY))
   {
      fprintf(video, "%U", Direccion_Video);
      delay_ms(2);
      fprintf(video, "%C", 0x0D);
      delay_ms(3);
      fprintf(video, "%f", Auxiliar_Video);
      delay_ms(2);
      fprintf(video, "%C", 0x0D);
      delay_ms(4);
   }
   Direccion_Video++;
}
/*******************************************************/
#int_TIMER0
void TIMER0_isr()
{
   if(Timer0_Counter==(read_eeprom (0)))
   {

         fprintf(pc, "I");
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "0");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",Software_Version);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "1");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Potencia_Activa_FA);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "2");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Potencia_Activa_FB);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "3");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Potencia_Activa_FC);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "4");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Potencia_Reactiva_FA);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "5");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Potencia_Reactiva_FB);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "6");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Potencia_Reactiva_FC);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "7");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Potencia_Aparente_FA);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "8");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Potencia_Aparente_FB);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "9");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Potencia_Aparente_FC);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "10");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Factor_Potencia_FA);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "11");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Factor_Potencia_FB);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "12");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Factor_Potencia_FC);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "13");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%U",RP_FASE_A);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "14");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%U",RP_FASE_B);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "15");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%U",RP_FASE_C);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "16");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Voltaje_FA);
         fprintf(pc, "%C", 0x0D);
         RP_Voltaje_FA+=1;


         fprintf(pc, "17");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Voltaje_FB);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "18");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Voltaje_FC);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "19");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Corriente_FA);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "20");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Corriente_FB);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "21");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Corriente_FC);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "22");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Frecuencia_FA);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "23");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Frecuencia_FB);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "24");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",RP_Frecuencia_FC);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "25");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%U",Temperatura);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "26");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%U",PE_FASE_A);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "27");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%U",PE_FASE_B);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "28");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%U",PE_FASE_C);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "29");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",PE_Voltaje_Bateria);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "30");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%U",TA_RED);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "31");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%U",TA_PLANTA);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "32");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",UPS_Voltaje_FA);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "33");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",UPS_Voltaje_FB);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "34");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",UPS_Corriente_FA);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "35");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",UPS_Corriente_FB);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "36");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",UPS_Frecuencia_FA);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "37");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",UPS_Frecuencia_FB);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "38");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",UPS_Voltaje_Banco_Baterias);
         fprintf(pc, "%C", 0x0D);

         fprintf(pc, "39");
         fprintf(pc, "%C", 0x20);
         fprintf(pc, "%3.1f",UPS_Voltaje_Neutro_Tierra);
         fprintf(pc, "%C", 0x0D);


         fprintf(pc, "F");
         fprintf(pc, "%C", 0x0D);
         Timer0_Counter=0;    
   }
   else
   {
      Timer0_Counter++;
   }
}
#int_TIMER1
void TIMER1_isr()
{
   if(Timer1_Counter==19)
   {
      Direccion_Video=0;
      Auxiliar_Video=Software_Version;
      Tx_Data_video();
      Auxiliar_Video=RP_Potencia_Activa_FA;
      Tx_Data_video();
      Auxiliar_Video=RP_Potencia_Activa_FB;
      Tx_Data_video();
      Auxiliar_Video=RP_Potencia_Activa_FC;
      Tx_Data_video();
      Auxiliar_Video=RP_Potencia_Reactiva_FA;
      Tx_Data_video();
      Auxiliar_Video=RP_Potencia_Reactiva_FB;
      Tx_Data_video();
      Auxiliar_Video=RP_Potencia_Reactiva_FC;
      Tx_Data_video();
      Auxiliar_Video=RP_Potencia_Aparente_FA;
      Tx_Data_video();
      Auxiliar_Video=RP_Potencia_Aparente_FB;
      Tx_Data_video();
      Auxiliar_Video=RP_Potencia_Aparente_FC;
      Tx_Data_video();
      Auxiliar_Video=RP_Factor_Potencia_FA;
      Tx_Data_video();
      Auxiliar_Video=RP_Factor_Potencia_FB;
      Tx_Data_video();
      Auxiliar_Video=RP_Factor_Potencia_FC;
      Tx_Data_video();
      Auxiliar_Video=RP_FASE_A;
      Tx_Data_video();
      Auxiliar_Video=RP_FASE_B;
      Tx_Data_video();
      Auxiliar_Video=RP_FASE_C;
      Tx_Data_video();
      Auxiliar_Video=RP_Voltaje_FA;
      Tx_Data_video();
      Auxiliar_Video=RP_Voltaje_FB;
      Tx_Data_video();
      Auxiliar_Video=RP_Voltaje_FC;
      Tx_Data_video();
      Auxiliar_Video=RP_Corriente_FA;
      Tx_Data_video();
      Auxiliar_Video=RP_Corriente_FB;
      Tx_Data_video();
      Auxiliar_Video=RP_Corriente_FC;
      Tx_Data_video();
      Auxiliar_Video=RP_Frecuencia_FA;
      Tx_Data_video();
      Auxiliar_Video=RP_Frecuencia_FB;
      Tx_Data_video();
      Auxiliar_Video=RP_Frecuencia_FC;
      Tx_Data_video();
      Auxiliar_Video=Temperatura;
      Tx_Data_video();
      Auxiliar_Video=PE_FASE_A;
      Tx_Data_video();
      Auxiliar_Video=PE_FASE_B;
      Tx_Data_video();
      Auxiliar_Video=PE_FASE_C;
      Tx_Data_video();
      Auxiliar_Video=PE_Voltaje_Bateria;
      Tx_Data_video();
      Auxiliar_Video=TA_RED;
      Tx_Data_video();
      Auxiliar_Video=TA_PLANTA;
      Tx_Data_video();
      Auxiliar_Video=UPS_Voltaje_FA;
      Tx_Data_video();
      Auxiliar_Video=UPS_Voltaje_FB;
      Tx_Data_video();
      Auxiliar_Video=UPS_Corriente_FA;
      Tx_Data_video();
      Auxiliar_Video=UPS_Corriente_FB;
      Tx_Data_video();
      Auxiliar_Video=UPS_Frecuencia_FA;
      Tx_Data_video();
      Auxiliar_Video=UPS_Frecuencia_FB;
      Tx_Data_video();
      Auxiliar_Video=UPS_Voltaje_Banco_Baterias;
      Tx_Data_video();
      Auxiliar_Video=UPS_Voltaje_Neutro_Tierra;
      Tx_Data_video();
      Timer1_Counter=0;
   }
   else
   {
   Timer1_Counter++;
   }
   set_timer1(0);
}
#int_RDA
void RDA_isr()
{
   long   timeout=0;
   char    Aux_Rx_Data[1];
   while(!kbhit()&&(++timeout<50000))
   delay_us(10);
   if ( kbhit () )
   {
      Aux_Rx_Data[0]=fgetc(pc);
      if(Aux_Rx_Data[0]=="9")
      {
         fprintf(pc, "R");
         delay_ms(100);
         reset_cpu();
      }
      else
      {
         Dato=atoi(Aux_Rx_Data);
         if(Dato <= 5)
         {
            switch (Dato)
            {
               case 0:   WRITE_EEPROM( 0x00 , 4);//15 Seg
               break;
               case 1:   WRITE_EEPROM( 0x00 , 9);//30 Seg
               break;
               case 2:   WRITE_EEPROM( 0x00 , 18);//1 Min
               break;
               case 3:   WRITE_EEPROM( 0x00 , 35);//2 Min
               break;
               case 4:   WRITE_EEPROM( 0x00 , 88);//5 Min
               break;
               case 5:   WRITE_EEPROM( 0x00 , 176);//10 Min
               break;
            }
            fprintf(pc, "T");
            Timer0_Counter=0;
         }
      }
   }
}
/***********************************************************************************/
#int_EXT
void EXT_isr()
{
   if(N<=20)
   {
      Direccion=0x0D;
      Clock_Cycles=0x18;
      read_ADE7753();
      fprintf(pc, "V. FA=%Lu",Dato_Input);
      fprintf(pc, "%C", 0x0D);

      Direccion=0x0A;
      Clock_Cycles=0x18;
      read_ADE7753();
      fprintf(pc, "I. FA=%Lu", Dato_Input );
      fprintf(pc, "%C", 0x0D);

      Direccion=0x1A;
      Clock_Cycles=0x18;
      read_ADE7753();
      delay_ms(2000);
      N++;
   }
}
/***********************************************************************************/
void main()
{
   SET_TRIS_A(0x3F);/*   11 1111
               RA0=Voltaje Bateria (Planta)
               RA1=Voltaje Banco Baterias (UPS)
               RA2=Vref -
               RA3=Vref +
               RA4=
               RA5=               */
   SET_TRIS_B(0xFF);/*   1111 1111
               RB0=IRQ ADE_A
               RB1=IRQ ADE_B
               RB2=
               RB3=
               RB4=
               RB5=
               RB6=PROGRAMACION (CLOCK)
               RB7=PROGRAMACION (DATA)   */
   SET_TRIS_C(0xBE);/*   1011 1110
               RC0=TX (VIDEO)
               RC1=RX (VIDEO)
               RC2=RX_READY (DESDE VIDEO)
               RC3=MID FASE A (PLANTA)
               RC4=MID FASE B (PLANTA)
               RC5=MID FASE C (PLANTA)
               RC6=TX (PC)
               RC7=RX (PC)            */
   SET_TRIS_D(0xC1);/*   1100 0001
               RD0=SDI (ADE)
               RD1=SDO (ADE)
               RD2=SCL (ADE)
               RD3=RESET_CPU_VIDEO
               RD4=CS_A
               RD5=CS_B
               RD6=
               RD7=               */
   SET_TRIS_E(0x07);/*    111
               RE0=MID FASE A (RED PUBLICA)
               RE1=MID FASE B (RED PUBLICA)
               RE2=MID FASE C (RED PUBLICA)
         */
   output_low(SCL);
   output_high(CS_A);
   output_high(CS_B);
   output_low(RESET_CPU_VIDEO);
   setup_adc_ports(AN0_AN1_VREF_VREF);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);




   output_high(RESET_CPU_VIDEO);
   delay_ms(2000);
   while ( input(READY));

   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_RDA);
   bit_clear(INTCON2,6);//Seleccion de Interrupción por flanco de bajada.
   disable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   set_timer0(0);
   set_timer1(0);


#asm;
gfp:
nop;
nop;
goto gfp;
#endasm
}



******************************************************************




Este es otro ejemplo del mismo proyecto y está encargado de visualizar los parametros en pantalla (LCD 4x20) de forma local. Es decir actua como tarjeta de video.

#include<18F452.h>
#fuses NOWDT,WDT128,HS, NOPROTECT, NOOSCSEN, BROWNOUT, BORV42, PUT, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use delay(clock=20000000)
#use rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#zero_ram
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#include "lcd420_M.c"
#include <Diseno.c>
#include <stdlib.h>
#define   UP      PIN_C0
#define   DOWN   PIN_C1
#define   TESTIGO   PIN_C3
#define   READY   PIN_C5
/*******************************************************/
   short   Ver=false;
   short   FASE_A=false;
   short   FASE_B=false;
   short   FASE_C=false;
   short   CONTACTOR_A=false;
   short   CONTACTOR_B=false;
    int      MENU_MAX=39;
    int      SELECCION=0;
   long   int    PUNTERO;
   float    DATO;
   float   Software_Version;
   float   RP_Potencia_Activa_FA;
   float   RP_Potencia_Activa_FB;
   float   RP_Potencia_Activa_FC;
   float   RP_Potencia_Reactiva_FA;
   float   RP_Potencia_Reactiva_FB;
   float   RP_Potencia_Reactiva_FC;
   float   RP_Potencia_Aparente_FA;
   float   RP_Potencia_Aparente_FB;
   float   RP_Potencia_Aparente_FC;
   float   RP_Factor_Potencia_FA;
   float   RP_Factor_Potencia_FB;
   float   RP_Factor_Potencia_FC;
   short   RP_FASE_A=false;
   short   RP_FASE_B=false;
   short   RP_FASE_C=false;
   float   RP_Voltaje_FA;
   float   RP_Voltaje_FB;
   float   RP_Voltaje_FC;
   float   RP_Corriente_FA;
   float   RP_Corriente_FB;
   float   RP_Corriente_FC;
   long   RP_Frecuencia_FA;
   long   RP_Frecuencia_FB;
   long   RP_Frecuencia_FC;
   long   Temperatura;
   short   PE_FASE_A=false;
   short   PE_FASE_B=false;
   short   PE_FASE_C=false;
   float   PE_Voltaje_Bateria;
   short   TA_RED=false;
   short   TA_PLANTA=false;
   float   UPS_Voltaje_FA;
   float   UPS_Voltaje_FB;
   float   UPS_Corriente_FA;
   float   UPS_Corriente_FB;
   float   UPS_Frecuencia_FA;
   float   UPS_Frecuencia_FB;
   float   UPS_Voltaje_Banco_Baterias;
   float   UPS_Voltaje_Neutro_Tierra;
/*******************************************************/
void lcd_barrido()
{
   int   i;
   lcd_putc("f");
   for(i=1;i<=20;i++)
      {
      lcd_gotoxy(i,1);
      lcd_putc(0xFF);
      lcd_gotoxy(i,2);
      lcd_putc(0xFF);
      lcd_gotoxy(i,3);
      lcd_putc(0xFF);
      lcd_gotoxy(i,4);
      lcd_putc(0xFF);
      delay_ms(50);
      }
   for(i=1;i<=20;i++)
      {
      lcd_gotoxy(i,1);
      lcd_putc(0xFE);
      lcd_gotoxy(i,2);
      lcd_putc(0xFE);
      lcd_gotoxy(i,3);
      lcd_putc(0xFE);
      lcd_gotoxy(i,4);
      lcd_putc(0xFE);
      delay_ms(50);
      }
}
void antirebote()
   {
   delay_ms(20);
   while ( input(DOWN)|| input(UP));
   delay_ms(20);
   }
void CLEAR_LCD_AND_HOME()
{
   lcd_putc("f");
   lcd_gotoxy(5,1);
   lcd_putc( "Red  Publica");
   lcd_gotoxy(1,3);
}
void CLEAR_LCD_AND_HOME2()
{
   lcd_putc("f");
   lcd_gotoxy(3,1);
   lcd_putc( "Planta Electrica");
   lcd_gotoxy(1,3);
}
void CLEAR_LCD_AND_HOME3()
{
   lcd_putc("f");
   lcd_gotoxy(1,1);
   lcd_putc( "Transferencia Autom.");
   lcd_gotoxy(1,3);
}
void CLEAR_LCD_AND_HOME4()
{
   lcd_putc("f");
   lcd_gotoxy(8,1);
   lcd_putc( "U.P.S.");
   lcd_gotoxy(1,3);
}
void PANTALLA()
{
      switch (SELECCION)
      {
         case 0:   lcd_putc("f");
               lcd_putc( "*Energy Measurement*");
               lcd_gotoxy(1,3);
               lcd_putc( " Software Ver.: ");
               printf(lcd_putc, "%03.1f", Software_Version);
               lcd_gotoxy(1,4);
               lcd_putc( "********************");
               break;
         case 1:   CLEAR_LCD_AND_HOME();
               lcd_putc("Potencia  Activa FA:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Potencia_Activa_FA);
               lcd_putc(" W");
               break;
         case 2:   CLEAR_LCD_AND_HOME();
               lcd_putc("Potencia  Activa FB:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Potencia_Activa_FB);
               lcd_putc(" W");
               break;
         case 3:CLEAR_LCD_AND_HOME();
               lcd_putc("Potencia  Activa FC:");
               lcd_gotoxy(1,4);
               printf(lcd_putc, "%03.1f", RP_Potencia_Activa_FC);
               lcd_putc(" W");
               break;
         case 4:CLEAR_LCD_AND_HOME();
               lcd_putc("Potencia Reacti. FA:");
               lcd_gotoxy(1,4);
               printf(lcd_putc, "%03.1f", RP_Potencia_Reactiva_FA);
               lcd_putc(" VAR");
               break;
         case 5:CLEAR_LCD_AND_HOME();
               lcd_putc("Potencia Reacti. FB:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Potencia_Reactiva_FB);
               lcd_putc(" VAR");
               break;
         case 6:CLEAR_LCD_AND_HOME();
               lcd_putc("Potencia Reacti. FC:");
               lcd_gotoxy(1,4);
               printf(lcd_putc, "%03.1f", RP_Potencia_Reactiva_FC);
               lcd_putc(" VAR");
               break;
         case 7:CLEAR_LCD_AND_HOME();
               lcd_putc("Potencia Aparen. FA:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Potencia_Aparente_FA);
               lcd_putc(" VA");
               break;
         case 8:CLEAR_LCD_AND_HOME();
               lcd_putc("Potencia Aparen. FB:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Potencia_Aparente_FB);
               lcd_putc(" VA");
               break;
         case 9:CLEAR_LCD_AND_HOME();
               lcd_putc("Potencia Aparen. FC:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Potencia_Aparente_FC);
               lcd_putc(" VA");
               break;
         case 10:CLEAR_LCD_AND_HOME();
               lcd_putc("Factor de Poten. FA:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Factor_Potencia_FA);
               break;
         case 11:CLEAR_LCD_AND_HOME();
               lcd_putc("Factor de Poten. FB:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Factor_Potencia_FB);
               break;
         case 12:CLEAR_LCD_AND_HOME();
               lcd_putc("Factor de Poten. FC:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Factor_Potencia_FC);
               break;
         case 13:CLEAR_LCD_AND_HOME();
               FASE_A=RP_FASE_A;
               if( FASE_A==TRUE)
               {
                  lcd_putc("Fase A: On");
               }
               else
               {
                  lcd_putc("Fase A: Off");
               }
               break;
         case 14:CLEAR_LCD_AND_HOME();
               FASE_B=RP_FASE_B;
               if( FASE_B==TRUE)
               {
                  lcd_putc("Fase B: On");
               }
               else
               {
                  lcd_putc("Fase B: Off");
               }
               break;
         case 15:CLEAR_LCD_AND_HOME();
               FASE_C=RP_FASE_C;
               if( FASE_C==TRUE)
               {
                  lcd_putc("Fase C: On");
               }
               else
               {
                  lcd_putc("Fase C: Off");
               }
               break;
         case 16:CLEAR_LCD_AND_HOME();
               lcd_putc("Voltaje (RMS) FA:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Voltaje_FA);
               lcd_putc(" V");
               break;
         case 17:CLEAR_LCD_AND_HOME();
               lcd_putc("Voltaje (RMS) FB:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Voltaje_FB);
               lcd_putc(" V");
               break;
         case 18:CLEAR_LCD_AND_HOME();
               lcd_putc("Voltaje (RMS) FC:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", RP_Voltaje_FC);
               lcd_putc(" V");
               break;
         case 19:CLEAR_LCD_AND_HOME();
               lcd_putc("Corriente (RMS) FA:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%02.1f", RP_Corriente_FA);
               lcd_putc(" A");
               break;
         case 20:CLEAR_LCD_AND_HOME();
               lcd_putc("Corriente (RMS) FB:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%02.1f", RP_Corriente_FB);
               lcd_putc(" A");
               break;
         case 21:CLEAR_LCD_AND_HOME();
               lcd_putc("Corriente (RMS) FC:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%02.1f", RP_Corriente_FC);
               lcd_putc(" A");
               break;
         case 22:CLEAR_LCD_AND_HOME();
               lcd_putc("Frecuencia FA:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%lu", RP_Frecuencia_FA);
               lcd_putc(" Hz");
               break;
         case 23:CLEAR_LCD_AND_HOME();
               lcd_putc("Frecuencia FB:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%lu", RP_Frecuencia_FB);
               lcd_putc(" Hz");
               break;
         case 24:CLEAR_LCD_AND_HOME();
               lcd_putc("Frecuencia FC:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%lu", RP_Frecuencia_FC);
               lcd_putc(" Hz");
               break;
         case 25:lcd_putc("f");
               lcd_gotoxy(1,1);
               lcd_putc( "Circuito Electronico");
               lcd_gotoxy(1,3);
               lcd_putc("Temp de Dispositivo:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%lu", Temperatura);
               lcd_putc(0xDF);
               lcd_putc("C");
               break;
         case 26:CLEAR_LCD_AND_HOME2();
               FASE_A=PE_FASE_A;
               if( FASE_A==TRUE)
               {
                  lcd_putc("Fase A: On");
               }
               else
               {
                  lcd_putc("Fase A: Off");
               }
               break;
         case 27:CLEAR_LCD_AND_HOME2();
               FASE_B=PE_FASE_B;
               if( FASE_B==TRUE)
               {
                  lcd_putc("Fase B: On");
               }
               else
               {
                  lcd_putc("Fase B: Off");
               }
               break;
         case 28:CLEAR_LCD_AND_HOME2();
               FASE_C=PE_FASE_C;
               if( FASE_C==TRUE)
               {
                  lcd_putc("Fase C: On");
               }
               else
               {
                  lcd_putc("Fase C: Off");
               }
               break;
         case 29:CLEAR_LCD_AND_HOME2();
               lcd_putc("Voltaje Bateria:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", PE_Voltaje_Bateria);
               lcd_putc(" V");
               break;
         case 30:CLEAR_LCD_AND_HOME3();
               CONTACTOR_A=TA_RED=false;
               if( CONTACTOR_A==TRUE)
               {
                  lcd_putc("Contactor de Red: On");
               }
               else
               {
                  lcd_putc("Contactor de Red:Off");
               }
               break;
         case 31:CLEAR_LCD_AND_HOME3();
               CONTACTOR_B=TA_PLANTA;
               if( CONTACTOR_B==TRUE)
               {
                  lcd_putc("Contactor Planta: On");
               }
               else
               {
                  lcd_putc("Contactor Planta:Off");
               }
               break;
         case 32:CLEAR_LCD_AND_HOME4();
               lcd_putc("Voltaje (RMS) FA:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", UPS_Voltaje_FA);
               lcd_putc(" V");
               break;
         case 33:CLEAR_LCD_AND_HOME4();
               lcd_putc("Voltaje (RMS) FB:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", UPS_Voltaje_FB);
               lcd_putc(" V");
               break;
         case 34:CLEAR_LCD_AND_HOME4();
               lcd_putc("Corriente (RMS) FA:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", UPS_Corriente_FA);
               lcd_putc(" A");
               break;
         case 35:CLEAR_LCD_AND_HOME4();
               lcd_putc("Corriente (RMS) FB:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", UPS_Corriente_FB);
               lcd_putc(" A");
               break;
         case 36:CLEAR_LCD_AND_HOME4();
               lcd_putc("Frecuencia FA:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", UPS_Frecuencia_FA);
               lcd_putc(" Hz");
               break;
         case 37:CLEAR_LCD_AND_HOME4();
               lcd_putc("Frecuencia FB:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", UPS_Frecuencia_FB);
               lcd_putc(" Hz");
               break;
         case 38:CLEAR_LCD_AND_HOME4();
               lcd_putc("Voltaje Banco Bat:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", UPS_Voltaje_Banco_Baterias);
               lcd_putc(" V");
               break;
         case 39:CLEAR_LCD_AND_HOME4();
               lcd_putc("Volt. Neutro-Tierra:");
               lcd_gotoxy(1,4);
               printf(lcd_putc,"%03.1f", UPS_Voltaje_Neutro_Tierra);
               lcd_putc(" V");
               break;
         default:CLEAR_LCD_AND_HOME4();
               lcd_putc("f");
               lcd_gotoxy(1,2);
               lcd_putc("*Error de Seleccion*");
               SELECCION=0;
               break;
      }
}
void GUARDAR()
{
      switch (PUNTERO)
      {
         case 0:Software_Version=DATO;
               break;
         case 1:RP_Potencia_Activa_FA=DATO;
               break;
         case 2:RP_Potencia_Activa_FB=DATO;
               break;
         case 3:RP_Potencia_Activa_FC=DATO;
               break;
         case 4:RP_Potencia_Reactiva_FA=DATO;
               break;
         case 5:RP_Potencia_Reactiva_FB=DATO;
               break;
         case 6:RP_Potencia_Reactiva_FC=DATO;
               break;
         case 7:RP_Potencia_Aparente_FA=DATO;
               break;
         case 8:RP_Potencia_Aparente_FB=DATO;
               break;
         case 9:RP_Potencia_Aparente_FC=DATO;
               break;
         case 10:RP_Factor_Potencia_FA=DATO;
               break;
         case 11:RP_Factor_Potencia_FB=DATO;
               break;
         case 12:RP_Factor_Potencia_FC=DATO;
               break;
         case 13:RP_FASE_A=DATO;
               break;
         case 14:RP_FASE_B=DATO;
               break;
         case 15:RP_FASE_C=DATO;
               break;
         case 16:RP_Voltaje_FA=DATO;
               break;
         case 17:RP_Voltaje_FB=DATO;
               break;
         case 18:RP_Voltaje_FC=DATO;
               break;
         case 19:RP_Corriente_FA=DATO;
               break;
         case 20:RP_Corriente_FB=DATO;
               break;
         case 21:RP_Corriente_FC=DATO;
               break;
         case 22:RP_Frecuencia_FA=DATO;
               break;
         case 23:RP_Frecuencia_FB=DATO;
               break;
         case 24:RP_Frecuencia_FC=DATO;
               break;
         case 25:Temperatura=DATO;
               break;
         case 26:PE_FASE_A=DATO;
               break;
         case 27:PE_FASE_B=DATO;
               break;
         case 28:PE_FASE_C=DATO;
               break;
         case 29:PE_Voltaje_Bateria=DATO;
               break;
         case 30:TA_RED=DATO;
               break;
         case 31:TA_PLANTA=DATO;
               break;
         case 32:UPS_Voltaje_FA=DATO;
               break;
         case 33:UPS_Voltaje_FB=DATO;
               break;
         case 34:UPS_Corriente_FA=DATO;
               break;
         case 35:UPS_Corriente_FB=DATO;
               break;
         case 36:UPS_Frecuencia_FA=DATO;
               break;
         case 37:UPS_Frecuencia_FB=DATO;
               break;
         case 38:UPS_Voltaje_Banco_Baterias=DATO;
               break;
         case 39:UPS_Voltaje_Neutro_Tierra=DATO;
               PANTALLA();
               break;
         default:break;
      }
}
#int_RDA
void RDA_isr()
{
   char    DIRECCION[3];
   char    AUX[6];
   gets(DIRECCION);
   output_high(TESTIGO);
   gets(AUX);
   output_low(TESTIGO);
   PUNTERO = atoi(DIRECCION);
   DATO = atof(AUX);
   DATO=DATO+0.01;
   IF(PUNTERO <= MENU_MAX)   
   {
      output_low(READY);
      GUARDAR();
   }
   output_high(READY);
   Ver=True;
}
void main()
{
   SET_TRIS_A(0x3F);/*   11 1111
               RA0=
               RA1=
               RA2=
               RA3=
               RA4=
               RA5=         */
   SET_TRIS_B(0xFF);/*   1111 1111
               RB0=
               RB1=
               RB2=
               RB3=
               RB4=
               RB5=
               RB6=
               RB7=         */
   SET_TRIS_C(0x97);/*   1001 0111
               RC0=SW_UP
               RC1=SW_DOWN
               RC2=
               RC3=TESTIGO
               RC4=
               RC5=READY
               RC6=TX
               RC7=RX         */
   SET_TRIS_D(0x00);/*   0000 0000
               RD0=LCD_E
               RD1=LCD_RS
               RD2=LCD_RW
               RD3=
               RD4=LCD_D4
               RD5=LCD_D5
               RD6=LCD_D6
               RD7=LCD_D7      */
   SET_TRIS_E(0x07);/*    111
               RE0=
               RE1=
               RE2=         */

   output_low(TESTIGO);
   output_low(READY);
   lcd_init();
   lcd_barrido();
   lcd_putc("f");
   delay_ms(500);
   if( input(DOWN) && input(UP))
      {
         Diseno();
         while ( input(DOWN) && input(UP));
         lcd_putc("f");
      }
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   output_high(READY);
   lcd_putc("Espere...");
   while ( Ver == FALSE );

   PANTALLA();
   while(1)
   {
      if( input(UP))
      {
         output_low(READY);
         antirebote();
         if(SELECCION < MENU_MAX)
            {
               SELECCION++;
            }
         else
            {
               SELECCION=0;
            }
         PANTALLA();
         output_high(READY);
      }
      if( input(DOWN))
      {
         output_low(READY);
         antirebote();
         if(SELECCION==0)
            {
               SELECCION=MENU_MAX;
            }
         else
            {
               SELECCION--;
            }
         PANTALLA();
         output_high(READY);
      }
   }
}


Espero te sirvan  :-)