#include <16F628A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock=4000000)
#byte porta = 0x05 // Asignamos PortA.
#byte portb = 0x06 // Asignamos PortB.
// ---------- Programa Principial ----------
void main()
{
port_b_pullups(FALSE); // Sin resistencias pullups a las salidas del puerto B.
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Al no usar el TIMER configuramos lo más básico.
setup_comparator(NC_NC_NC_NC); // Sin comparadores.
setup_vref(FALSE); // Al no usar comparadores no necesitamos Vref.
//---- Fin de la configuración del 16F628A ----
int8 x; // Declaramos el valor de X como byte, se corresponderá con los 8 LEDs de salida.
int8 enc; // Se almacenará el valor actual de RA0 y RA1, hasta la siguiente comparación.
int8 aux; // Se almacenará el valor anterior de RA0 y RA1, hasta la siguiente comparación.
set_tris_a(0b11111); // Puerto A como entradas. Sólo usamos RA0 y RA1.
set_tris_b(0b00000000); // Puerto B como salidas, para los 8 LEDs.
portb=0; // Inicialmente ponemos a cero el puerto B.
x=0; // Inicialmente ponemos a cero la variable que se usa para contar.
enc=0; // Inicialmente ponemos a cero la variable que tomará los valores de RA0 y RA1.
While (true)
{
aux=enc; // Igualamos 'AUX' y 'ENC' para luego comparar cuando cambie 'ENC'.
enc=porta & 3; // Aislamos RA0 y RA1 como un número de 2 bits y se carga en la variable 'ENC'.
[COLOR="Red"]//acuérdate que la secuencia de valores es 0, 2, 3, 1 cw y 0, 1, 3, 2 ccw[/COLOR]
if(aux==0){
if (enc==2){x++;}
else if (enc==1){x--;}
}
else if(aux==1){
if (enc==0){x++;}
else if (enc==3){x--;}
}
else if(aux==2){
if (enc==3){x++;}
else if (enc==0){x--;}
}
else if(aux==3){
if (enc==1){x++;}
else if (enc==0){x--;}
}
portb = x; // El valor de X sale por el puerto B, los 8 LED de salida.
}
}