Autor Tema: Simplificar código?  (Leído 1458 veces)

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

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Simplificar código?
« en: 26 de Noviembre de 2009, 16:33:28 »
Hola a todos,

trato de hacer un pequeño ejercicio usando las interrupciones RB4-RB7, por lo que me pregunto, que si para hacer algo como el código que muestro estaría bien, o se puede simplificar de alguna otra forma, alguna otra instrucción. Funciona, pero quizá lo veo muy rudimentario con tanto if, alguna idea?

Código: C
  1. #INT_RB
  2.    void interrupciones(void)
  3.    {
  4.    
  5.       while (!portb == 0x00)
  6.          {
  7.          if (RB4==1 && RB7==0){RA0=1; RET; RA0=0; RET;}                //INTERMITENCIA IZD CON LUZ TRASERA 0FF
  8.          if (RB5==1 && RB7==0){RA1=1; RET; RA1=0; RET;}                //INTERMITENCIA DCH CON LUZ TRASERA OFF  
  9.          if (RB5==1 && RB7==1 && RB6==0)
  10.                   {RA1=1; RA3=1; RET; RA1=0; RA3=0; RET;}                  //INTERMITENCIA DCH CON LUZ TRASERA ON
  11.          if (RB4==1 && RB7==1 && RB6==0)
  12.                   {RA0=1; RA3=1; RET; RA0=0; RA3=0; RET;}                  //INTERMITENCIA IZD CON LUZ TRASERA ON
  13.        
  14.          if (RB4==1 && RB7==1 && RB6==1)                                        //INTERMITENCIA Y LUZ DE FRENO SIMULTÁNEA
  15.                   {RA3=1; RA2=1; RA0=1; RET; RA0=0; RET;}
  16.          if (RB5==1 && RB7==1 && RB6==1)
  17.                   {RA3=1; RA2=1; RA1=1; RET; RA1=0; RET;}
  18.          
  19.          if (RB6==1 && RB7==0)  {RA2=1; RA3=1;}                             //LUZ DE FRENO ON Y OFF
  20.          if (RB6==0){RA2=0; RA3=0;}                                                 //APAGA LUZ DE FRENO Y TRASERA      
  21.          
  22.          if (RB7==1 && RB6==1)  {RA3=1; RA2=1;}                             //LUZ DE FRENO ON Y TRASERA ON SIN PARPADEO
  23.        
  24.          if (RB7==1 && RB6==0 && RB4==0 && RB5==0)
  25.                   {RA3=1; RET; RA3=0; RET;}                                          //LUZ TRASERA ON SIN INTERMITENCIA
  26.        
  27.          }
  28.    
  29.     output_b(input_b());
  30.     }

Gracias de antemano, un saludo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Simplificar código?
« Respuesta #1 en: 26 de Noviembre de 2009, 18:52:10 »
Podrías aprovecharte de que los 4 pines que chequeas son contiguos en el PORTB para operar con ellos matemáticamente.

Por ejemplo, esto: if (RB7==1 && RB6==0 && RB4==0 && RB5==0)
es igual que esto: if ((PORTB>>4)==0b1000)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Simplificar código?
« Respuesta #2 en: 26 de Noviembre de 2009, 19:05:12 »
Y también usando el mismo ejemplo de Manolo podrías eficientarlo usando máscaras...

Código: [Seleccionar]
if((PORTB & 0xF0) == 0x80)
   sentencia;

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Simplificar código?
« Respuesta #3 en: 27 de Noviembre de 2009, 11:07:07 »
Hola,

Nocturno, Migsantiago, gracias por las aclaraciones, ciertamente queda más elegante que de la forma que yo expuse.

Ire probando las diferentes formas en mis rutinas, viendo cual me resulta más o menos fácil.

Un saludo.