#Include <18F452.h>
#Fuses XT, NOWDT, NOPROTECT, NOLVP, BROWNOUT
#use Delay( Clock = 4000000 )
#Byte PortA = 0xF80
#Byte PortB = 0xF81
#Byte PortC = 0xF82
#Byte PortD = 0xF83
#Byte PortE = 0xF84
// ------ Variable Global ------
int16 x = 3000; // Declaramos el valor de X como Byte, es decir, 8 bits.
// Esta variable ha de ser global porque su valor lo
// usaremos en la interrupción y en el programa principal.
// Por tanto declaramos esta variable antes la interrupción
// y de "void main".
// --------- Interrupción ---------
#INT_EXT // Interrupción Externa por RB0: Decodificación de Encoder.
Void IntRB0()
{
// CCS se encarga de desactiva automáticamente cualquier interrupción.
// No hace falta guardar contextos de registros.
If (Bit_Test(PortB, 0)) // Si RB0 se ha puesto a 1 (flanco de subida),
{
Ext_Int_Edge(H_TO_L); // entonces activar la siguiente interrupción por flanco de
// bajada.
If (Bit_Test(PortB, 1)) // Si RB1 está a 1,
{
x++; // entonces incrementar una unidad el valor de X.
}
}
Else // Si RB0 se ha puesto a 0 (flanco de bajada),
{
Ext_Int_Edge(L_TO_H); // entonces activar la siguiente interrupción por flanco de
// subida.
If (Bit_Test(PortB, 1)) // Si RB1 está 1,
{
x--; // entonces decrementar una unidad el valor de X.
}
}
}
Void Main() // Inicio y configuración.
{
Port_B_Pullups(FALSE);
Setup_ADC_Ports(NO_ANALOGS); // Sin comparadores ni ADCs, todo digital, etc...
Setup_adc(ADC_CLOCK_DIV_2);
Setup_spi(SPI_SS_DISABLED);
Setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
Setup_timer_1(T1_DISABLED);
Setup_timer_2(T2_DISABLED,0,1);
Enable_Interrupts(Int_Ext); // Activar Interrupción Externa a través de RB0.
Ext_Int_Edge(L_TO_H); // Inicialmente detectar interrupción por flanco de subida.
Enable_Interrupts(GLOBAL); // Interrupciones Generales Activadas.
Set_Tris_A(0b11111111); // Puerto A todo entradas, en este caso no usamos el Puerto A.
Set_Tris_B(0b11111111); // Puerto B todo entradas, sólo usamos las entradas RB0 y RB1.
Set_Tris_C(0b11111111); // Puerto C todo entradas, en este caso no usamos el Puerto C.
Set_Tris_D(0b00000000); // Puerto D todo salidas (8 bits que irán a los LEDs).
PortD=0;
// ---------- Programa Principial ----------
While (True){
if((x>4000 && x<=4100)){
bit_set(PORTD,2);
delay_ms(2000);
bit_clear(PORTD,2);
}
if((x<=2500 && x>=2300)){
bit_set(PORTD,3);
delay_ms(2000);
bit_clear(PORTD,3);
}
}}