TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ChOrChE en 19 de Junio de 2006, 12:27:35

Título: 12c508a en c
Publicado por: ChOrChE en 19 de Junio de 2006, 12:27:35
Hola a todos. Siempre he programado en ensamblador y de c tengo poca idea.
me gustaria hacer pruebas con el 12c508a y variar las salidas dependiendo de las entradas. Y que ademas que el codigo se ejecute dependiendo del estado de GP0.
 
BIT ENABLE         SALIDAS                  ENTRADAS
GP0(IN)    GP1(OUT)  GP2(OUT)  GP3(IN)  GP4(IN)  GP5(IN)
   0               NO SE EJECUTACODIGO HASTA QUE GP0=1
   1                   0            0               0           0          0
   1                   0            1               0           0          1
   1                   1            1               0           1          0
   1                   0            1               0           1          1
   1                   1            0               1           0          0
   1                   0            0               1           0          1
   1                   1            0               1           1          0
   1                   0            0               1           1          1

Si alguien me pudiera ayudar. No se por donde cogerlo.
Título: Re: 12c508a en c
Publicado por: jfh900 en 19 de Junio de 2006, 13:26:17
Es bastante sencillo realizarlo en "C". Podrias utilizar un bucle "while" para verificar "GP0" que se encierre en si mismo cuando valga 0 y con otro bucle "while" externo al anterior y que contenga un "case" para verificar las entradas y en función de esto poner las salidas. Esquemáticamente sería:

Código: CSS
  1. while(TRUE)
  2.    {
  3.    while(GP0=0){}:
  4.    switch (gp3*100+gp4*10+gp5)
  5.        {
  6.         case 0:  gp1 = 0 ; gp2 = 0; break;
  7.         case 1:  gp1 = 0 ; gp2 = 1; break;
  8.         ......
  9.         case 7:  gp1 = 0 ; gp2 = 0; break;
  10.         }
  11.    }

Esto es un ejemplo de implementación que tendras que trabajar para ponerlo a punto.

Un saludo.
Título: Re: 12c508a en c
Publicado por: PalitroqueZ en 19 de Junio de 2006, 14:34:05
Hola a todos. Tengo una duda jfh900  ¿como se usa el GeSHI? yo lo bajé de hxxp://qbnz.com/highlighter/ pero es puro código php, ¿habrá algún IDE ejecutable?.


Salu2 :mrgreen:
Título: Re: 12c508a en c
Publicado por: ChOrChE en 19 de Junio de 2006, 14:54:11
gracias por la respuesta compañero!
He estado haciendo algo y no se si es una aberracion.

#LIST p=12c508, r=HEX;
#INCLUDE <p12C508.inc>;
#define    __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC;
#define GP0  pin_a0 ;

void main()
   {

    // Descripcion de variables
        boolean GP0;
        GP0= input(GP0);// de otra manera input_pin_port_a( 0 )
        GP1= output_pin_port_a( 1 );
        GP2= output_pin_port_a( 2 );
        GP3= input_pin_port_a( 3 );
        GP4= input_pin_port_a( 4 );
        GP5= input_pin_port_a( 5 );
       
    //   Se ejecuta si  pin_a0=GP0  esta a 1

        while( GP0 ){
                               
               if (GP3=0 &GP4=0 & GP5=0) {
               GP1=0;
               GP2=0;               
                           
                }else if (GP3=0 & GP4=0 & GP5=1){
                      GP1=0;
                      GP2=1;
                     
                }else if (GP3=0 & GP4=1 & GP5=0){
                      GP1=1;
                      GP2=1;
                             
                }else if (GP3=0 & GP4=1 & GP5=1){
                      GP1=0;
                      GP2=1;
 
                }else if (GP3=1 & GP4=0 & GP5=0){
                      GP1=1;
                      GP2=0;
                     
                }else if (GP3=1 & GP4=0 & GP5=1){
                      GP1=0;
                      GP2=0;
                     
                }else if (GP3=1 & GP4=1 & GP5=0){
                      GP1=1;
                      GP2=0;
                             
                }else if (GP3=1 & GP4=1 & GP5=1){
                      GP1=1;
                      GP2=1;
 
                }
                   }

Creo que se corresponde a la tabla pero si alguien me corrigiera no me vendria mal. GRACIAS!!
Título: Re: 12c508a en c
Publicado por: jfh900 en 19 de Junio de 2006, 15:57:24
Alguna cosilla que he visto mal:

GP0= input(GP0);

Esto es incosistente, quita:

#define GP0  pin_a0 ;
 y la línea anterior la pones como las otras:

GP0= input_pin_port_a( 0 );

Por cierto faltan de definir las variables:

GP1, GP2, GP3, GP4, GP5

Procierto si quieres compactar el código puedes poner los "if" como:

else if (GP3=0 & GP4=0 & GP5=1){ GP1=0; GP2=1; }
else if (GP3=0 & GP4=1 & GP5=0){ GP1=1; GP2=1; }
...

Un saludo.


Título: Re: 12c508a en c
Publicado por: jfh900 en 19 de Junio de 2006, 16:02:05
PalitroqueZ para utilizar GeSHI no tienes que descargar nada. Cuando abras un tema o respondas abre el campo despegable GeSHi y selecciona el elnguaje que vayas a poner. Esto añade dos etiquetas. Todo lo incluido entre las etiquetas saldrá formateado.

Saludos.
Título: Re: 12c508a en c
Publicado por: ChOrChE en 19 de Junio de 2006, 16:40:44
perdonad tenia tambien unos errores de asignacion. Gracias por la ayuda ahora queda mas legible y mejor.

#LIST p=12c508, r=HEX;
#include <p12C508.inc>;
#define    __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC;

void main()
   {

    // Descripcion de variables
        boolean GP0;
        boolean GP1;
        boolean GP2;
        boolean GP3;
        boolean GP4;
        boolean GP5;
        GP0= input_pin_port_a( 0 )
        GP1= output_pin_port_a( 1 );
        GP2= output_pin_port_a( 2 );
        GP3= input_pin_port_a( 3 );
        GP4= input_pin_port_a( 4 );
        GP5= input_pin_port_a( 5 );
       
    //   Se ejecuta si  pin_a0=GP0  esta a 1

        while(GP0){
                               
               if (GP3==0 && GP4==0 && GP5==0)         { GP1=0;GP2=0;}
               
                else if (GP3==0 && GP4==0 && GP5==1)   { GP1=0;GP2=1;}
                else if (GP3==0 && GP4==1 && GP5==0)   { GP1=1;GP2=1;}
                else if (GP3==0 && GP4==1 && GP5==1)   { GP1=0;GP2=1;}
                else if (GP3==1 && GP4==0 && GP5==0)   { GP1=1;GP2=0;}
                else if (GP3==1 && GP4==0 && GP5==1)   { GP1=0;GP2=0;}
                else if (GP3==1 && GP4==1 && GP5==0)   { GP1=1;GP2=0;}
                else if (GP3==1 && GP4==1 && GP5==1)   { GP1=1;GP2=1;}
                   
                   }

Lo que no tengo claro es si tengo que definir los puertos como boolean. He visto en codigos que usan enteros tipo int.
No se. Como solo se trata de un solo pin dentro del puerto?¿?¿
Título: Re: 12c508a en c
Publicado por: jfh900 en 19 de Junio de 2006, 16:56:41
Haber más modificaciones:

esto tiene que estar dentro del bucle para que se refresquen las variables:

Código: CSS
  1. GP0= input_pin_port_a( 0 )
  2. GP1= output_pin_port_a( 1 );
  3. GP2= output_pin_port_a( 2 );
  4. GP3= input_pin_port_a( 3 );
  5. GP4= input_pin_port_a( 4 );
  6. GP5= input_pin_port_a( 5 );

Esto te sobra ya que son salidas y esta mal definido aparte de que la asigación de las salidas lo haces en los if's

Código: CSS
  1. GP1= output_pin_port_a( 1 );
  2. GP2= output_pin_port_a( 2 );

La variable boolean creo que no esta definida. Si la quieres definir puedes poner:

typedef int8 boolean;

O directamente:

int8 GP3;
.............


Saludos
Título: Re: 12c508a en c
Publicado por: ChOrChE en 20 de Junio de 2006, 11:08:52
Hola a todos y gracias por vuestras respuestas, se que soy algo duro de mollera.
Lo primero me gustaria saber que diferencias existen entre Css y C.

Otra pregunta, si defino el pin del puerto GP0 dentro del while, como pongo la condicion en el while,? O tambien lo tenndria que poner fuera?

while (GP0){ 
       
        GP0= input_pin_port_a( 0 )
        GP1= output_pin_port_a( 1 );
        GP2= output_pin_port_a( 2 );

Esto va tomando forma pero no me lo compila. De todas formas voy a ver el programita este de CSS porque lo estoy haciendo con C2C-plus. Y creo que existen diferencias.
Título: Re: 12c508a en c
Publicado por: ChOrChE en 20 de Junio de 2006, 11:23:35
De momento esta asi:

LIST p=12c508A, r=HEX;
#INCLUDE <C:\C2CPP\p12C508A.inc>;
#define    __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC;

void main()
   {
typedef int8 boolean; //Esto si que no lo tengo muy claro

    // Descripcion de variables
   
        boolean GP0;
        boolean GP1;
        boolean GP2;
        boolean GP3;
        boolean GP4;
        boolean GP5;

       
    //   Se ejecuta si  pin_a0 de GP0  esta a 1

        while (GP0){ 
       
        GP0= input_pin_port_a( 0 )
        GP1= output_pin_port_a( 1 );
        GP2= output_pin_port_a( 2 );
        GP3= input_pin_port_a( 3 );
        GP4= input_pin_port_a( 4 );
        GP5= input_pin_port_a( 5 );
         
                               
               if (GP3==0 && GP4==0 && GP5==0)         { GP1=0;GP2=0;}
               
                else if (GP3==0 && GP4==0 && GP5==1)   { GP1=0;GP2=1;}
                else if (GP3==0 && GP4==1 && GP5==0)   { GP1=1;GP2=1;}
                else if (GP3==0 && GP4==1 && GP5==1)   { GP1=0;GP2=1;}
                else if (GP3==1 && GP4==0 && GP5==0)   { GP1=1;GP2=0;}
                else if (GP3==1 && GP4==0 && GP5==1)   { GP1=0;GP2=0;}
                else if (GP3==1 && GP4==1 && GP5==0)   { GP1=1;GP2=0;}
                else if (GP3==1 && GP4==1 && GP5==1)   { GP1=1;GP2=1;}
               
                endif
                   
                   }
Me gustaria que me corrigieseis y que me digais lo que esta mal. Os agradezco un monton la paciencia que teneis conmigo. GRACIAS!
jfh900 eres un CRACK!
Título: Re: 12c508a en c
Publicado por: jfh900 en 20 de Junio de 2006, 12:52:06
Bueno, mirando el CCS veo que no es compatible con el C2C. Por cierto CCS es una clase de compilador de "C" igual que los es C2C. Las modificaciones que yo hatia son:

Código: C
  1. LIST p=12c508A, r=HEX;
  2. #INCLUDE <C:\C2CPP\p12C508A.inc>;
  3. #define    __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC;
  4.  
  5. typedef int8 boolean; // lo sacamos fuera dl main
  6. #define GP1 output_pin_port_a( 1 ); // Declaramos lo que es GP1 y GP2
  7. #define GP2 output_pin_port_a( 2 );
  8.  
  9. void main()
  10.     {
  11.        // Descripcion de variables
  12.        boolean GP3;
  13.        boolean GP4;
  14.        boolean GP5;
  15.  
  16.        while(1)   // Ejecutar un bucle que se repite de forma indefinida
  17.        {
  18.        while (!input_pin_port_a( 0 )){}; // Se cierra en el 2º bucle si A0 = 0 y espera a que valga 1
  19.                                                        // Eliminamos una asignación innecesaria de GP0.
  20.        
  21.        GP3= input_pin_port_a( 3 ); // Leemos las variables de entrada que definiran las salidas
  22.        GP4= input_pin_port_a( 4 );
  23.        GP5= input_pin_port_a( 5 );
  24.                                
  25.        if (GP3==0 && GP4==0 && GP5==0)              { GP1=0;GP2=0;}
  26.             else if (GP3==0 && GP4==0 && GP5==1)   { GP1=0;GP2=1;}
  27.             else if (GP3==0 && GP4==1 && GP5==0)   { GP1=1;GP2=1;}
  28.             else if (GP3==0 && GP4==1 && GP5==1)   { GP1=0;GP2=1;}
  29.             else if (GP3==1 && GP4==0 && GP5==0)   { GP1=1;GP2=0;}
  30.             else if (GP3==1 && GP4==0 && GP5==1)   { GP1=0;GP2=0;}
  31.             else if (GP3==1 && GP4==1 && GP5==0)   { GP1=1;GP2=0;}
  32.             else if (GP3==1 && GP4==1 && GP5==1)   { GP1=1;GP2=1;}
  33.        endif
  34.        }
  35.    } // Cerramos en main

Las modificaciones echas son:

1º Declaramos las variables necesarias eliminando GP0 que utilizamos directamente la función de lectura para evitarnos asignaciones innecesarias. No se si GP1 y GP2 estan bien declaradas, por no disponer del manual del C2C.
2º Creamos un bucle infinito que siempre se esta ejecutando con while(1)
3º Creamos un bucle while (!input_pin_port_a( 0 )){}; que lo unico que hace es que si A0 es cero se queda esperando a que sea 1.
4º Leemos las variables de entrada
5º Ponemos las variables de salida.
6º Saltamos según el bucle infinito a 3º.

Basicamente este es el programa. Por desgracia no dispongo del C2C y no puedo compilarlo y simularlo para ver si tiene alguna fallo. Seguro que algo esta mal en la sintaxis pero ya digo que no dispongo del manual ni del compilador.

Pruebalo y nos comentas.

Un saludo.
Título: Re: 12c508a en c
Publicado por: djpalas en 20 de Junio de 2006, 13:32:23
Buenas!!

Ya veo que se ha adelantado jfh900 y lo ha posteado antes que yo  :D.
Pero bueno ya que lo iba a postear pues lo pongo, asi veo si he fallado en algo, y que los maestros den su opinión  :-)

Código: C
  1. LIST p=12c508A, r=HEX;
  2. #INCLUDE <C:\C2CPP\p12C508A.inc>;
  3. #define    __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC;
  4.  
  5. #define GP1 output_pin_port_a(1);   //Definimos las macros de GP1 y GP2
  6. #define GP2 output_pin_port_a(2);
  7.  
  8.  
  9. typedef int8 boolean;   //ChOrChE esto es porque la forma de utilizar datos
  10.                         //binarios tienen que ser declarado como int8
  11.                         //por ello que para un uso mas habitual y mas
  12.                         //comprensible. Se define un tipo propio "boolean"
  13.                         //que corresponde a los tipos int8
  14.                         //Ejemplo:
  15.                         //
  16.                         //int8 GP0;
  17.                         //boolean GP0;
  18.  
  19. void main(){
  20.  
  21.                        
  22.    // Descripcion de variables
  23.    
  24.         boolean GP0;
  25.         boolean GP3;
  26.         boolean GP4;
  27.         boolean GP5;
  28.  
  29.    while(1){
  30.  
  31.         // Tendrias que colocarlo para comprobar el estado del GP0
  32.         // ya que podria no entrar nunca en el bucle, porque no
  33.         // has inicializado la variable a un valor distinto de 0
  34.         // para entrar en el bucle
  35.         GP0= input_pin_port_a(0);
  36.  
  37.         while (GP0){
  38.  
  39.         GP3= input_pin_port_a(3);
  40.         GP4= input_pin_port_a(4);
  41.         GP5= input_pin_port_a(5);
  42.  
  43.         //Si aplicamos karnaugh a cada una de las variable de Salida
  44.         //con respecto a las entradas, podemos simplificarla
  45.         //
  46.         // GP1 = (GP3 || GP4) && (~GP5)
  47.         // GP2 = (GP4 || GP5) && (~GP3)
  48.         //
  49.         // Con lo que podremos simplificar las comparaciones con tantos if
  50.                                
  51.             if((GP3 || GP4) && (~GP5))
  52.                   GP1=1;
  53.             else
  54.                   GP1=0;
  55.  
  56.             if((GP4 || GP5) && (~GP3))
  57.                   GP2=1;
  58.             else
  59.                   GP2=0;
  60.  
  61.          //Volvemos a comprobar el valor de GP0 para saber si seguir o salir                                    
  62.          GP0 = input_pin_port_a(0);
  63.          }
  64.    }
  65. }

Espero que te sirva de ayuda
Título: Re: 12c508a en c
Publicado por: ChOrChE en 20 de Junio de 2006, 14:26:38
YA ME HE HECHO CON EL COMPILADOR CCS!
GRACIAS!
Ahora queda leer un mucho. De todas maneras esto de declarar los puerto como entrada y otros como salida es un poco lioso porque en ensamblador se configura un registro y ya esta!.
Lo que pasa es que a la hora de hacer codigo simplificas mucho la idea.

Me he dado cuenta que css define las salidas solas cuando abres un proyecto añadiendo al codigo el GP1 output_pin_port_a( 1 ); o algo parecido

Ahora si me cuentas algo con css lo pillare.

Título: Re: 12c508a en c
Publicado por: jfh900 en 20 de Junio de 2006, 14:29:05
Muy buen código. La única modificación que haria seria eliminar la variable GP0 ya que asignar el valor a una variable para despues hacer la comprobación del while y no utilizarla mas no tiene ningún sentido, luego se podria poner:

while (input_pin_port_a( 0 )){

La aplicación de karnaugh simplifica y optimiza el código. Enhorabuena por el código.

Saludos.
Título: Re: 12c508a en c
Publicado por: djpalas en 20 de Junio de 2006, 14:57:22
Buenas de nuevo!!

jfh900 muchas gracias  :) me di cuenta cuando lo revisé, pero como era horientativo no lo quise editar.

Ahora puedes aprovechar y decirme lo mismo que te puse en otro post de otro tema, un despiste lo tiene cualquiera  jejejeje  :wink:
Título: Re: 12c508a en c
Publicado por: ChOrChE en 22 de Junio de 2006, 11:28:12
jOODER!!! Muchas gracias a los dos. Sois unos fieras.
He estado probando y mirando un pokillo el CCS.
Cambie algunas cosas porque no se definian igual que en C2C.



 #include <12C508A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOMCLR                     //Master Clear pin enabled
#use delay(clock=20000000)

////////AQUI ME DA ERROR EXPECTING AN IDENTIFIER EN TYPEDEF INT8 BOOLEAN

typedef int8 boolean ;// lo sacamos fuera dl main

#define GP1 output_pin_port_a( 1 );// Declaramos lo que es GP1 y GP2
#define GP2 output_pin_port_a( 2 );


void main(void)    {


boolean GP3;// Descripcion de variables
boolean GP4;
boolean GP5;
while(1)   // Ejecutar un bucle que se repite de forma indefinida
{       while (!input_pin_port_a( 0 )){}; // Se cierra en el 2º bucle si A0 = 0 y espera a que valga 1
                                                       
               GP3= input_pin_port_a( 3 ); // Leemos                                                                             GP4= input_pin_port_a( 4 );
               GP5= input_pin_port_a( 5 );
               if (GP3==0 && GP4==0 && GP5==0)              { GP1=0;GP2=0;}
               else if (GP3==0 && GP4==0 && GP5==1)   { GP1=0;GP2=1;}
               else if (GP3==0 && GP4==1 && GP5==0)   { GP1=1;GP2=1;}
               else if (GP3==0 && GP4==1 && GP5==1)   { GP1=0;GP2=1;}
               else if (GP3==1 && GP4==0 && GP5==0)   { GP1=1;GP2=0;}
               else if (GP3==1 && GP4==0 && GP5==1)   { GP1=0;GP2=0;}
               else if (GP3==1 && GP4==1 && GP5==0)   { GP1=1;GP2=0;}
               else if (GP3==1 && GP4==1 && GP5==1)   { GP1=1;GP2=1;}
               endif       }
                                                       if (GP0==0)   { GP1=0;GP2=0;}// para cambiar el estado de gp0.
                                                                                                     //  quiero las salidas GP1 y GP2 a 0 cuando GP0=0
                } // Cerramos en main

Sabeis a que se debe? Y por cierto... existe algun libro para programacion de microcontroladores en c. Si me podeis aconsejar alguno? GRACIAS!!
Título: Re: 12c508a en c
Publicado por: ChOrChE en 22 de Junio de 2006, 11:39:50
Leyendo un poco me he hecho un lio.

A ver....
En un puerto de 6bit de GP0 a GP5  si asigno pin a pin p.e.:

#define GP1 output_pin_port_a( 1 )   o bien

typedef int1 bit ;
void main(void)    {
boolean GP3
while(1)   {while (!GP0){};                                   
GP3= input_pin_port_a( 3 );}

Como se comporta el pin del puerto?? Lo que quiero saber es el estado del pin de entrada.
Sera igual definirlo como BIT que como BOOLEAN??
Título: Re: 12c508a en c
Publicado por: ChOrChE en 22 de Junio de 2006, 12:13:05
Y Yo aqui rizando el rizo.....

#define PIN_B0  48
#define PIN_B1  49
#define PIN_B2  50
#define PIN_B3  51
#define PIN_B4  52
#define PIN_B5  53
#define FALSE 0
#define TRUE 1
#include <12C508A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOMCLR                     //Master Clear pin enabled
#use delay(clock=20000000)


//typedef int1 boolean ;// lo sacamos fuera dl main
//#define BOOLEAN short int
#define GP1 output( PIN_B1 )// Declaramos lo que es GP1 y GP2
#define GP2 output( PIN_B2 )

void main(void)    {


boolean GP3;// Descripcion de variables
boolean GP4;
boolean GP5;

while(1)   // Ejecutar un bucle que se repite de forma indefinida
{       while (!GP0){}; // Se cierra en el 2º bucle si A0 = 0 y espera a que valga 1
                                          // Eliminamos una asignación innecesaria de GP0.

               GP3= input( PIN_B3 ); // Leemos las variables de entrada que definiran las salidas
               GP4= input( PIN_B4 );
               GP5= input(PIN_B5 );
               if (GP3==0 && GP4==0 && GP5==0)              { GP1=0;GP2=0;}
               else if (GP3==0 && GP4==0 && GP5==1)   { GP1=0;GP2=1;}
               else if (GP3==0 && GP4==1 && GP5==0)   { GP1=1;GP2=1;}
               else if (GP3==0 && GP4==1 && GP5==1)   { GP1=0;GP2=1;}
               else if (GP3==1 && GP4==0 && GP5==0)   { GP1=1;GP2=0;}
               else if (GP3==1 && GP4==0 && GP5==1)   { GP1=0;GP2=0;}
               else if (GP3==1 && GP4==1 && GP5==0)   { GP1=1;GP2=0;}
               else if (GP3==1 && GP4==1 && GP5==1)   { GP1=1;GP2=1;}
               endif       } if (GP0==0)   { GP1=0;GP2=0;}// para cambiar el estado de gp0.
                                                         //  quiero las salidas GP1 y GP2 a 0 cuando GP0=0
                } // Cerramos en main

Ahora ya si que no se cono definir las variables ni los pines de los puertos.
S.O.S!!!
Título: Re: 12c508a en c
Publicado por: djpalas en 22 de Junio de 2006, 15:32:48
Buenas de nuevo!

Código: C
  1. LIST p=12c508A, r=HEX;
  2. #INCLUDE <C:\C2CPP\p12C508A.inc>;
  3. #FUSES NOWDT                       //No Watch Dog Timer
  4. #FUSES INTRC                         //Internal RC Osc
  5. #FUSES NOPROTECT                //Code not protected from reading
  6. #FUSES NOMCLR                     //Master Clear pin enabled
  7. #use delay(clock=20000000)
  8.  
  9. #use fast_io(B) //ChOrChE con esto te olvidas de tantos #define pin_bX ...... ;)
  10.  
  11. #define true 1
  12. #define false 0
  13. #define GP1 output_pin_port_a(pin_b1);   //Definimos las macros de GP1 y GP2
  14. #define GP2 output_pin_port_a(pin_b2);
  15.  
  16.  
  17.  
  18. typedef short boolean;   // Los tipo binarios o Bits tienen que ser declarado como short
  19.                                    // por ello que para un uso mas habitual y mas
  20.                                    // Las dos declaraciones de la variable GP0 es lo mismo.
  21.                                    // short GP0;
  22.                                    // boolean GP0;
  23.  
  24. void main(){
  25.  
  26. // Descripcion de variables
  27.        boolean GP0;
  28.        boolean GP3;
  29.        boolean GP4;
  30.        boolean GP5;
  31.  
  32.   while(1){
  33.  
  34.        while (input_pin_port_a(pin_b0)){
  35.  
  36.                GP3= input_pin_port_a(pin_b3);
  37.                GP4= input_pin_port_a(pin_b4);
  38.                GP5= input_pin_port_a(pin_b5);
  39.        
  40.                //Si aplicamos mediante algebra boolena o karnaugh a cada una de las variable de Salida
  41.                //con respecto a las entradas, podemos simplificarla
  42.                //
  43.                // GP1 = (GP3 || GP4) && (~GP5)
  44.                // GP2 = (GP4 || GP5) && (~GP3)
  45.                //
  46.                // Con lo que podremos simplificar las comparaciones con tantos if
  47.    
  48.                if((GP3 || GP4) && (~GP5))
  49.                       GP1=1;
  50.                else
  51.                       GP1=0;
  52.    
  53.                if((GP4 || GP5) && (~GP3))
  54.                       GP2=1;
  55.                else
  56.                       GP2=0;
  57.         }
  58.         // Puesto que si sale del bucle GP0=0, le asignamos los valores 0 a GP1 Y GP2
  59.         GP1=0;
  60.         GP2=0;
  61.  
  62.   }
  63.  
  64. }

Perdona por que llevo tiempo sin programar PIC, me llevado tiempo con los de la Familia Infineon C515-L (8051) y he tenido de mirar un poco el manual del CCS.
De todas maneras creo que te podria servir este código. Si tienes alguna duda por aquí estaremos.