#INCLUDE <16F887.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#BYTE PORTB= 6
#BYTE PORTC= 7
#DEFINE TUNI PORTC,0 //Definición de variables
#DEFINE TDEC PORTC,1 //Definición de variables
INT CONT; //Declarar la variable CONT como
//un entero, es decir de 8 bits
LONG CONTRET; //Declarar la variable CONTRET
//como long, es decir de 16 bits
VOID MOSTRAR( ) //Rutina mostrar
{
INT UNI,DEC; //Declarar las variables UNI, DEC
//como un entero, es decir de 8bits
DEC=CONT/10;
UNI=CONT%10;
PORTB=(DISPLAY[UNI]); //Muestra lo que hay en unidades
//en el display
BIT_SET (TUNI); //Enciende el display de unidades
DELAY_MS(1); //Retardo de 1 milisegundos
BIT_CLEAR(TUNI); //Apaga el display de unidades
PORTB=(DISPLAY[DEC]); //Muestra lo que hay en unidades
//en el display
BIT_SET (TDEC); //Enciende el display de decenas
DELAY_MS(1); //Retardo de 1 milisegundos
BIT_CLEAR(TDEC); //Apaga el display de decenas
}
VOID RET1SEG() //Rutina RET1SEG
{
CONTRET=500; //Cargue con 500 la variable CONTRET
WHILE (CONTRET>0) //Mientras que la variable CONTRET sea mayor que cero
{
MOSTRAR(); //Llamar la rutina MOSTRAR
CONTRET--; // Decremente la variable CONTRET
}
}
void MAIN()
{
SET_TRIS_B(0); //El puerto B esta configurado como salida
SET_TRIS_C(0); // El puerto C esta configurado como salida
CONT=0; //la variable CONT se inicializa con cero
WHILE(TRUE) //Haga por siempre
{
CONT=0;
WHILE(CONT<100) //mientras la variable CONT es menor que 100
{
RET1SEG( ); //Llama la rutina RET1SEG
CONT++; //Incrementa la variable CONT
}
}
}[/spoiler]#Include <16F877A.h>
#Fuses XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP //Configuracion de fusibles
#Use delay (clock=4000000) //reloj=4Mhz
#Use fast_io(A)
#Byte portb=6
#Byte porta=2
#Byte portc= 7
#Define uno portc,0 //Definición de variables
#Define dos portc,1 //Definición de variables
int i=0, j=0; //displays
void mostrar( )
{
int display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
digito1=cont%10;
digito2=cont/10;
portb =(display[i]);
bit_set (uno); //prendo el primer display
delay_ms(1);
bit_clear(uno); //lo apago
portb=(display[j]);
bit_set (dos); //perdo el segundo
delay_ms(1);
bit_clear(dos);
}
void pulsadores(){ //Funcion de conteo de eventos
if(input(pin_A0)){ //Esta cerrado el pulsador?
delay_ms(5); //Si, elimina rebotes
cont++;
if (i>9){ //hasta que sea 9
i=0; //borra unidades e
j++; //incrementa las decenas
if(j>9){ //hasta 9
j=0; //borra las decenas
}
}
}
while (bit_test(porta,0)==0){ //Espera visualizando datos
mostrar(); //mientras la tecla esta presionada
}
if(input(pin_A1)){ //Esta cerrado el pulsador?
delay_ms(5); //Si, elimina rebotes
i=0; j=0; //reset
}
}
void main(){
set_tris_b(0); //portb como salida
set_tris_a(255); //RA0 y RA1 entradas
disable_interrupts(GLOBAL); //activadas interrupciones
do{ //bucle...
mostrar();
pulsadores();
}while(TRUE);
}
[/spoiler]Yo lo diej para que tengas en cuenta que si en tu otra parte del codigo segui agregando delays los displays quedarian asi:
Display 1 :
Tiempo encendido: 1ms
Tiempo apagado: 1ms(dislpay2) + lo que ocupe hacer el otro codigo.
Si se te ocurre poner varios delays, vas a tener el problema que los displays se lo pasan mas apagados que encendidos, una solucion simple seria agrandar el valor de tiempo de encendido de los displays con respecto al de apagado.
La otra es usar interrupciones, pero como dije, no te compliques si no las necesitas, si ves que es necesario entonces se utilizan.