#include <16f877a.h>
#device ADC = 10
#fuses HS
#fuses NOPUT
#fuses NOBROWNOUT
#fuses NOWDT
#fuses NOPROTECT
#use delay(clock = 8000000)
//#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#define LCD_DB4 PIN_C0
#define LCD_DB5 PIN_C1
#define LCD_DB6 PIN_C2
#define LCD_DB7 PIN_C3
#define LCD_RS PIN_C4
#define LCD_E PIN_C5
#define salida PIN_D0
#include "FLEX LCD.c" ///display 20x4
int1 flag_tecla = 0;
int16 cont_tecla_1_a = 0;
int16 cont_tecla_2_a = 0;
int16 cont_tecla_1_b = 0;
int16 cont_tecla_2_b = 0;
int16 cont_tecla_1_c = 0;
int16 cont_tecla_2_c = 0;
int16 cont_tecla_1 = 0;
int16 cont_tecla_2 = 0;
int16 cont_tecla_3 = 0;
int16 cont_tecla_4 = 0;
int1 flag_rapido_1 = 0;
int1 flag_rapido_2 = 0;
int1 flag_rapido_11 = 0;
int1 flag_rapido_21 = 0;
int1 flag_rapido_111 = 0;
int1 flag_rapido_211 = 0;
int8 carga_t0;
int16 carga_t1;
int16 periodo = 50000;
int8 duty = 10;
int16 muestra;
int1 solto1 = 0;
int1 solto2 = 0;
int1 solto3 = 0;
int1 solto4 = 0;
int1 flag_solto1 = 0;
int1 flag_solto2 = 0;
int1 flag_solto3 = 0;
int1 flag_solto4 = 0;
int16 leer;
int32 lector;
float acumula_adc;
int32 cont_adc;
void teclas(void);
#int_timer1 ///periodo
void timer_1(void)
{
output_high(salida);
set_timer1(carga_t1);
set_timer0 (carga_t0);
}
#int_rtcc ///duty
void timer_0(void)
{
output_low(salida);
}
#INT_TIMER2
void timer_2 (void) ///interrupcion a 4950.4 uS
{
flag_tecla = 1;
}
void main()
{
set_tris_a (255);
set_tris_b (255);
set_tris_c (128);
set_tris_d (0);
set_tris_e (0);
SETUP_ADC(ADC_CLOCK_INTERNAL);
SETUP_TIMER_2(T2_DIV_BY_16,156,16); ///interrupcion cada 25.728 mS
SETUP_ADC_PORTS(AN0_AN1_AN2_AN4_VSS_VREF);
SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_2);
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER2);
set_adc_channel(0);
port_b_pullups(1);
//printf("Prueba de pic\r\n");
//delay_ms(100);
lcd_init();
// delay_ms(100);
restart_wdt ();
carga_t1 = 65535 - periodo;
carga_t0 = 256 - duty;
muestra = (int16)duty * 128;
lcd_gotoxy
(1,1);printf(lcd_putc
,"Periodo: %6.3w ms ",periodo
);// Ftcv: 67Hz"); lcd_gotoxy
(1,2);printf(lcd_putc
,"Duty: %9.3w ms ",muestra
); lcd_gotoxy
(1,3);printf(lcd_putc
,"ADC: "); enable_interrupts(global);
while(true)
{
if(++cont_adc >= 20000)
{
//printf("L: %Lu\r\n",lector);
lector = lector / cont_adc;
acumula_adc = (float)lector * 0.002441406; ////referencia 2.5 volt adc 10 bits
lcd_gotoxy
(7,3);printf(lcd_putc
,"%4.3f",acumula_adc
); //printf("ADC: %f\r\n",acumula_adc);
cont_adc = 0;
lector = 0;
}
else
{
leer = read_adc();
lector += (int32)leer;
}
teclas();
if((!input(PIN_B0)) && (solto1))
{
solto1 = 0;
periodo++;
if(flag_rapido_1)periodo += 10;
if(flag_rapido_11)periodo += 100;
if(flag_rapido_111)periodo += 1000;
carga_t1 = 65536 - periodo;
lcd_gotoxy
(10,1);printf(lcd_putc
,"%6.3w",periodo
); //printf("%5Lu",periodo);// Ftcv: 67Hz");
}
if((!input(PIN_B1)) && (solto2))
{
solto2 = 0;
periodo--;
if(flag_rapido_2)periodo -= 10;
if(flag_rapido_21)periodo -= 100;
if(flag_rapido_211)periodo -= 1000;
carga_t1 = 65536 - periodo;
lcd_gotoxy
(10,1);printf(lcd_putc
,"%6.3w",periodo
); //printf("%5Lu",periodo);// Ftcv: 67Hz");
}
if((!input(PIN_B2)) && (solto3))
{
solto3 = 0;
duty++;
carga_t0 = 256 - duty;
muestra = (int16)duty * 128;
lcd_gotoxy
(10,2);printf(lcd_putc
,"%6.3w",muestra
); }
if((!input(PIN_B3)) && (solto4))
{
solto4 = 0;
duty--;
carga_t0 = 256 - duty;
muestra = (int16)duty * 128;
lcd_gotoxy
(10,2);printf(lcd_putc
,"%6.3w",muestra
); }
restart_wdt ();
}
}
void teclas(void)
{
if(flag_tecla)
{
flag_tecla = 0;
if(!input(PIN_B0))
{
++cont_tecla_1;
if(cont_tecla_1 > 5 && flag_solto1)
{
cont_tecla_1 = 0;
solto1 = 1;
if(flag_rapido_1)
{
if(++cont_tecla_1_b > 20)flag_rapido_11 = 1;
}
if(flag_rapido_11)
{
if(++cont_tecla_1_c > 20)flag_rapido_111 = 1;
}
if(++cont_tecla_1_a > 20)flag_rapido_1 = 1;
}
if(cont_tecla_1 > 60){cont_tecla_1 = 0;flag_solto1 = 1;}
}
else
{
cont_tecla_1 = 0;
flag_solto1 = 0;
cont_tecla_1_a = 0;
flag_rapido_1 = 0;
cont_tecla_1_b = 0;
flag_rapido_11 = 0;
cont_tecla_1_c = 0;
flag_rapido_111 = 0;
solto1 = 1;
}
if(!input(PIN_B1))
{
++cont_tecla_2;
if(cont_tecla_2 > 5 && flag_solto2)
{
cont_tecla_2 = 0;
solto2 = 1;
if(flag_rapido_2)
{
if(++cont_tecla_2_b > 20)flag_rapido_21 = 1;
}
if(flag_rapido_21)
{
if(++cont_tecla_2_c > 20)flag_rapido_211 = 1;
}
if(++cont_tecla_2_a > 20)flag_rapido_2 = 1;
}
if(cont_tecla_2 > 60){cont_tecla_2 = 0;flag_solto2 = 1;}
}
else
{
cont_tecla_2 = 0;
flag_solto2 = 0;
cont_tecla_2_a = 0;
flag_rapido_2 = 0;
cont_tecla_2_b = 0;
flag_rapido_21 = 0;
cont_tecla_2_c = 0;
flag_rapido_211 = 0;
solto2 = 1;
}
if(!input(PIN_B2))
{
++cont_tecla_3;
if(cont_tecla_3 > 5 && flag_solto3){cont_tecla_3 = 0;solto3 = 1;}
if(cont_tecla_3 > 60){cont_tecla_3 = 0;flag_solto3 = 1;}
}
else
{
cont_tecla_3 = 0;
flag_solto3 = 0;
solto3 = 1;
}
if(!input(PIN_B3))
{
++cont_tecla_4;
if(cont_tecla_4 > 5 && flag_solto4){cont_tecla_4 = 0;solto4 = 1;}
if(cont_tecla_4 > 60){cont_tecla_4 = 0;flag_solto4 = 1;}
}
else
{
cont_tecla_4 = 0;
flag_solto4 = 0;
solto4 = 1;
}
}
}