Hola gente:
Tengo un problemita con los pulsadores.
Lo que me gustaria hacer es que cuando presione un pulsador cambie de numero.
Eso ya esta. Pero cuando dejo presionado el boton, me gustaria que el numero del display cambien cada 1 segundo aprox.
Lo que esta ocurriendo con el ejercicio es que cuando dejo presionado queda dentro del ciclo y frena todo el progama hasta que lo suelto.
Les dejo el codigo para ver si alguien puede ayudarme.
Muchas gracias.
Pablo
//#include <18F458.h>
#include <16F874.h>
#device ADC=10
#use delay(clock=4000000)
#fuses XT, NOPROTECT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NOWDT
#byte port_a=0x05 //permite usar port a como variable
#byte port_b=0x06 //permite usar port b como variable
#byte port_c=0x07 //permite usar port c como variable
#byte port_d=0x08 //permite usar port c como variable
#byte port_e=0x09 //permite usar port c como variable
#use fast_io(E)
byte const DISPLAY[10] = { 0b0111111, //array para formar los digitos
0b0000110,
0b1011011,
0b1001111,
0b1100110,
0b1101101,
0b1111101,
0b0000111,
0b1111111,
0b1101111, }; //terminar con punto y coma!
byte segundos; // A running seconds counter
byte minutos; // A running seconds counter
byte horas; // A running seconds counter
byte veces = 0; // Number of interrupts left before a second has elapsed
short actualizar;
int sonda = 1;
float sonda1=0.00;//, sonda2 = 0, sonda3 = 0;
int h_digit, l_digit;
byte k1,k2,k3;
int modo;
byte const MUX[6] = { 0b000, //array para la activacion de port a
0b001,
0b010,
0b011,
0b100,
0b101,};
byte DIGITO[6]; //array para mostrar los digitos
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mostrar() //rutina de visualizacion en el display
{
// port_b=(digito[3]); //saco por port b el digito
// port_c = 0b1000;
// delay_ms(3); //espero (para evitar parpadeos, puede ser necesario incrementarla)
// set_tris_b(0x00);
if(modo==1) {
output_bit(PIN_D3,1);
output_bit(PIN_C4,0);
output_bit(PIN_C5,0);
output_bit(PIN_d7,0);
output_bit(PIN_d6,0);
output_bit(PIN_d5,0);
port_b=(digito[0]); //saco por port b el digito
output_bit(PIN_d5,0);
output_bit(PIN_d6,0);
output_bit(PIN_d7,1);
delay_ms(1); //espero (para evitar parpadeos, puede ser necesario incrementarla)
output_bit(PIN_d7,0);
output_bit(PIN_d6,0);
output_bit(PIN_d5,0);
port_b=(digito[1]); //saco por port b el digito
output_bit(PIN_d5,0);
output_bit(PIN_d6,1);
output_bit(PIN_d7,0);
delay_ms(1); //espero (para evitar parpadeos, puede ser necesario incrementarla)
output_bit(PIN_d7,0);
output_bit(PIN_d6,0);
output_bit(PIN_d5,0);
port_b=(digito[2]); //saco por port b el digito
output_bit(PIN_d5,1);
output_bit(PIN_d6,0);
output_bit(PIN_d7,0);
delay_ms(1); //espero (para evitar parpadeos, puede ser necesario incrementarla)
} else if(modo == 2){
output_bit(PIN_D3,0);
output_bit(PIN_C4,1);
output_bit(PIN_C5,0);
output_bit(PIN_d7,0);
output_bit(PIN_d6,0);
output_bit(PIN_d5,0);
port_b=(DISPLAY[k1]); //saco por port b el digito
output_bit(PIN_d5,0);
output_bit(PIN_d6,0);
output_bit(PIN_d7,1);
delay_ms(1); //espero (para evitar parpadeos, puede ser necesario incrementarla)
output_bit(PIN_d7,0);
output_bit(PIN_d6,0);
output_bit(PIN_d5,0);
port_b=(DISPLAY[k2]); //saco por port b el digito
output_bit(PIN_d5,0);
output_bit(PIN_d6,1);
output_bit(PIN_d7,0);
delay_ms(1); //espero (para evitar parpadeos, puede ser necesario incrementarla)
output_bit(PIN_d7,0);
output_bit(PIN_d6,0);
output_bit(PIN_d5,0);
port_b=(DISPLAY[k3]); //saco por port b el digito
output_bit(PIN_d5,1);
output_bit(PIN_d6,0);
output_bit(PIN_d7,0);
delay_ms(1); //espero (para evitar parpadeos, puede ser necesario incrementarla)
} else if(modo == 3){
output_bit(PIN_D3,0);
output_bit(PIN_C4,0);
output_bit(PIN_C5,1);
output_bit(PIN_d7,0);
output_bit(PIN_d6,0);
output_bit(PIN_d5,0);
port_b=(DISPLAY[k1]); //saco por port b el digito
output_bit(PIN_d5,0);
output_bit(PIN_d6,0);
output_bit(PIN_d7,1);
delay_ms(1); //espero (para evitar parpadeos, puede ser necesario incrementarla)
output_bit(PIN_d7,0);
output_bit(PIN_d6,0);
output_bit(PIN_d5,0);
port_b=(DISPLAY[k2]); //saco por port b el digito
output_bit(PIN_d5,0);
output_bit(PIN_d6,1);
output_bit(PIN_d7,0);
delay_ms(1); //espero (para evitar parpadeos, puede ser necesario incrementarla)
output_bit(PIN_d7,0);
output_bit(PIN_d6,0);
output_bit(PIN_d5,0);
port_b=(DISPLAY[k3]); //saco por port b el digito
output_bit(PIN_d5,1);
output_bit(PIN_d6,0);
output_bit(PIN_d7,0);
delay_ms(1); //espero (para evitar parpadeos, puede ser necesario incrementarla)
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#int_RTCC //rutina de interrupcion por overflow de TMR0
TIMER0_isr()
{
int tiempo;
if(!input(PIN_C7)) { // Boton del Centro (SETEOS)
modo++;
if (modo == 2) {
k1 = read_eeprom(1);
k2 = read_eeprom(2);
k3 = read_eeprom(3);
}else if (modo == 3) {
k1 = read_eeprom(4);
k2 = read_eeprom(5);
k3 = read_eeprom(6);
}
if (modo == 4)
modo = 1;
} else if(!input(PIN_C6)) { // Boton Abajo
k3--;
if (k3 == -1) {
k3 = 9;
k2--;
if (k2 == -1) {
k2 = 9;
k1--;
if (k1 == -1) {
k1=9;
}
}
}
} else if(!input(PIN_D4)) { // Boton Arriba
k3++;
if (k3 == 10) {
k3 = 0;
k2++;
if (k2 == 10) {
k2 = 0;
k1++;
if (k1 == 10) {
k1=0;
}
}
}
}
tiempo = segundos;
do{
restart_wdt(); // Puesta a cero del temporizador watchdog
if(tiempo != segundos) {
k3++;
if (k3 == 10) {
k3 = 0;
k2++;
if (k2 == 10) {
k2 = 0;
k1++;
if (k1 == 10) {
k1=0;
}
}
}
}
}while(!input(PIN_C7)||!input(PIN_C6)||!input(PIN_D4));
delay_ms(10); // Antirebotes
veces++;
if (veces==15) //25 int por segundo
{ segundos++; //transcurrio un segundo
actualizar=true;
veces=0;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#separate
char* sacadecimal(float valor) //rutina para convertir a BCD
{
int h_digit, pos;
pos = 0;
h_digit=0;
if (valor>=10)
{
do {
valor-=10;
h_digit++;
}while (valor>=10);
digito[pos++] = DISPLAY[h_digit];
}else{
digito[pos++] = DISPLAY[0];
}
h_digit=valor;
digito[pos++] = DISPLAY[h_digit];
valor = (valor-h_digit)*100; // Pasa a los decimales
// numero[pos++] = ".";
h_digit=0;
if (valor>=10)
{
do {
valor-=10;
h_digit++;
}while (valor>=10);
digito[pos++] = DISPLAY[h_digit];
}else{
digito[pos++] = DISPLAY[0];
}
mostrar();
}
#INT_AD
Conversion_Ad()
{
sonda1 = 100*(read_adc(ADC_READ_ONLY) * 0.0048828125);
sacadecimal(sonda1);
sonda = 1;
set_adc_channel(sonda-1);
read_adc(ADC_START_ONLY);
}
formatear() //rutina de formateo para los datos a mostrar
{
}
void main() //rutina principal
{
write_eeprom(1,3);
write_eeprom(2,4);
write_eeprom(3,5);
write_eeprom(4,9);
write_eeprom(5,8);
write_eeprom(6,7);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(RA0_RA1_RA3_ANALOG);
set_adc_channel(0);
enable_interrupts(INT_AD);
read_adc(ADC_START_ONLY);
set_timer0(0);
setup_counters(RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_tris_b(0x00);
formatear();
modo = 1;
while(true)
{
}
}