unsigned int const numero[10]={0,1,2,3,4,5,6,7,8,9}; // matriz e 1 dimension para los
valosres del display
unsigned int unidad=0,decena=0, centena=0, millar=0, residuos=0; //varialbes para hacer las operaciones int long contador=0; // contador principal void sumar(){ //funcion que incrementa de 1 en 1 cada vez que pulsa el boton sumar contador++; residuos=contador; // obtiene valor actual del contador unidad=residuos %10; //descompone el numero cifra por cifra residuos=residuos/10; //dividiendo entre 10, hasta que decena=residuos%10; // sea menor a cero residuos=residuos/10; // los residuos de cada division entera, son centena=residuos%10; // los que muestra el display segun sea el caso residuos=residuos/10; // unidad, decena, centena, millares.... millar=residuos%10; residuos=residuos/10; } void restar(){ // funcion que decrementa en 1 al contador por cada pulso contador--; residuos=contador; unidad=residuos %10; residuos=residuos/10; decena=residuos%10; residuos=residuos/10; centena=residuos%10; residuos=residuos/10; millar=residuos%10; residuos=residuos/10; } void limpiar(){ // aqui limpiamos para iniciar desde 0 residuos=contador=0; } void main() { asm { movlw 0x07 // este bloque desabilita los comparadores analogicos movwf CMCON // debras leer la hoja de datos del micro que uses para ver como desabilitarlo } ADCON1=0x06; // configura el puerto A como entrada Digital TRISA=1; //Puerto A como entradas TRISB=0; //Puerto B como salidas TRISD=0; //puerto d como salidas PORTB=0; PORTD=0b00000000;//Se prenden los dos (4)dis
while(1) //Entra a ciclo infinito
{ //pregunta si ha pulsado boton para sumar; si es cierto entonces: if (Button(&PORTA, 0, 50, 1)) { // rutina que evita el rebote generado por el boton sumar(); // llama funcion suma } else if(Button(&PORTA,1,50,1)){ // pregunta si ha pulsado boton restar; si es cierto restar(); // llama funcion restar } else if(Button(&PORTA,2,50,1)){ limpiar(); } else // este bloque multiplexa los displays de 7 segmentos PORTB=numero[unidad]; // controla los transistores a traves del puerto D PORTD=0x07; // la logica es: delay_ms(10); // prende primer display, manda unidades atravez de puerto b PORTD=0xff; // apaga primer display, manda dato y prende segundo display PORTB=numero[decena]; // asi sucesivamente para los 4 displays PORTD=0x0B; // de modo que prenden y apagan uno a la vez delay_ms(10); // tan rapido ( 1 a 10 milisegundos) PORTD=0x0f; // que parece que estan prendidos constantemente PORTB=numero[centena]; PORTD=0x0D; delay_ms(10); PORTD=0x0f; PORTB=numero[millar]; PORTD=0x0E; delay_ms(10); PORTD=0x0f; }}