/******************************************************************************/
#include <16f876A.h>
#fuses XT,NOWDT,PUT, NOPROTECT, NOBROWNOUT,NOLVP,NOCPD
#use delay (clock=4000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
/******************************************************************************/
/******************************************************************************/
int8 encoder;
/******************************************************************************/
/* Definiciones para la interfaz PIC-LCD */
/******************************************************************************/
# define PORTA 0x05// Puerto A
# define PORTB 0x06// Puerto B
# define PORTC 0x07// Puerto C
# define TRISA 0x85// Registro de direccionamiento Puerto A
# define TRISB 0x86// Registro de direccionamiento Puerto B
# define TRISC 0x87// Registro de direccionamiento Puerto C
//Se definen los terminales de conexion del display
#bit lcd_db4 = PORTA.2
#bit tris_lcd_db4 = TRISA.2
#bit lcd_db5 = PORTA.3
#bit tris_lcd_db5 = TRISA.3
#bit lcd_db6 = PORTA.4
#bit tris_lcd_db6 = TRISA.4
#bit lcd_db7 = PORTA.5
#bit tris_lcd_db7 = TRISA.5
#bit lcd_en = PORTC.0
#bit tris_lcd_en = TRISC.0
#bit lcd_rs = PORTC.1
#bit tris_lcd_rs = TRISC.1
# include <lcd_flex.c>
/******************************************************************************/
/* Interrupción por cambio en RB4-RB7 */
/******************************************************************************/
#int_rb
void detect_rb_change() {
int current;
static int last=0;
current=*PORTB;
// Canal A = PORTB.5
// Canal B = PORTB.4
if ((bit_test(current,4)) && (bit_test(current,5))){
if ((bit_test(last,4)) ^ (bit_test(current,5))){
encoder++; //sentido agujas del reloj
if(encoder > 40)
encoder = 40;
}
else {
encoder--; //sentido contrario agujas del reloj
if(encoder == 0xFF)
encoder = 0;
}
}
last=current;
}
/******************************************************************************/
/* Programa Principal */
/******************************************************************************/
void main(void)
{
disable_interrupts(GLOBAL);
encoder = 0;
set_tris_a(0b11000011);
set_tris_b(0b00110000);
set_tris_c(0b11111100);
port_b_pullups(FALSE);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
lcd_init();
while(1) {
delay_ms(1000);
lcd_gotoxy(1,1);//fila 1, col 1
printf(lcd_putc," %u",encoder);
}
}
/******************************************************************************/
#int_rb
void detect_rb_change() {
int current;
static int last=0;
#asm movf PORTB,0 //Sin estas instrucciones no funciona bien.
movwf current
#endasm
//current=*PORTB;
// Canal A = PORTB.5
// Canal B = PORTB.4
if ((bit_test(current,4)) && (bit_test(current,5))){
if ((bit_test(last,4)) ^ (bit_test(current,5))){
//sentido agujas del reloj, incrementar.
IncDec=INCREMENTAR;
}
else{
//sentido contrario agujas del reloj, decrementar.
IncDec=DECREMENTAR;
}
}
last=current;
}