Hola quiero hacer un cronometro con dos display 7 segmentos pero no me funciona muy bien con los ciclos for,primero
se ingresa un numero de 0 a 99,oprimiendo la tecla numeral debe decrementar dicho valor hasta 0,me parece q el problema esta en mi funcion decremento q no consigo mejorarla,si alguien me puede orientar gracias
#include <16f877.h>
#fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
int digitos=0,tecla_pulsada,unidades,decenas;
int DISPLAY[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int escan_teclado(); /*Prototipo de la función escan_teclado*/
void decremento();
#int_rb //CCS habilita(una vez fuera)e inhabilita(para ke no se produzca de nuevo la int. mientras se la trata) la int. automaticamente.
void VER_TECLA(void)
{
switch(digitos)
{
case 0:
tecla_pulsada=escan_teclado();
if(tecla_pulsada==11)
{
decremento();
decenas=tecla_pulsada;
break;
}
else
{
digitos=1;
decenas=tecla_pulsada;
}
portd=DISPLAY[tecla_pulsada];
while(!bit_test(portb,4)||!bit_test(portb,5)||!bit_test(portb,6))
{
}
break;
case 1:
tecla_pulsada=escan_teclado();
if(tecla_pulsada==11)
{
decremento();
unidades=tecla_pulsada;
break;
}
else
{
unidades=tecla_pulsada;
digitos=0;
}
portc=DISPLAY[tecla_pulsada];
while(!bit_test(portb,4)||!bit_test(portb,5)||!bit_test(portb,6))
{
}
break;
}
#asm
movf portb,0;
#endasm
}
main()
{
set_tris_b(0xf0);
set_tris_c(0x00);
set_tris_d(0x00);
portb=0xf0;
enable_interrupts(global);
enable_interrupts(int_rb);
portc=DISPLAY[0];
portd=DISPLAY[0];
port_b_pullups(TRUE);
while(1)
{
}
}
int escan_teclado()
{
int tecla=0,PULSACION=0;
int i=0;
int vect[5]={0x0E,0x0D,0x0B,0x07,0};
int matriz_teclado[4][3]={1,2,3,4,5,6,7,8,9,0,0,11};
PULSACION=0;
while(PULSACION==0)
{
portb=vect[i];
if(input(PIN_B4)==0)
{
tecla=0;
tecla=matriz_teclado[i][tecla];
PULSACION=1;
}
if(input(PIN_B5)==0)
{
tecla=1;
tecla=matriz_teclado[i][tecla];
PULSACION=1;
}
if(input(PIN_B6)==0)
{
tecla=2;
tecla=matriz_teclado[i][tecla];
PULSACION=1;
}
++i;
if(i==4)
i=0;
}
portb=0xf0;
return(tecla);
}
void decremento()
{
int j,k;
if(unidades!=0)
{
k=decenas;
while(k!=0)
{
--k;
portd=DISPLAY[k];
for(j=unidades;j!=0;j--)
{
portc=DISPLAY[j];
delay_ms(1000);
}
unidades=9;
portc=DISPLAY[0];
delay_ms(1000);
}
}
else if(unidades==0)
{
k=decenas;
while (k!=0)
{
--k;
portd=DISPLAY[k];
for(j=9;j!=0;j--)
{
portc=DISPLAY[j];
delay_ms(1000);
}
portc=DISPLAY[0];
delay_ms(1000);
}
}
}