Bueno como que es simple, pero que se puede complicar, por ejemplo se podria hacer que lso displays se actualizen por una interrupcion de un timer asi simplificar el programa principal, pero no te voy a complicar demasiado la vida.
Lamentablemente no dice que hace cada boton, yo voy a dar unos valores por gusto nomas a cada uno.Código: C
while (1) { Muestro_en_display(); if(!(input_c()&0x1F) { bit_bandera=0; } // Esta todo en 0 el puerto C entonces puedo poner mi bandera a 0 if(!bit_bandera && input_c()&0x1F) // PuertoC 000a aaaa AND 0001 1111 Si algo esta presionado va a quedar como true, si ademas bit_bandera es 0 entra { bit_bandera=1; switch(input_c()&0x1F) { case 0x01: // Caso que se presiono solamente boton C1 ( PORTC0 ) Unidad++; Sonido(); break; case 0x02: // Caso que se presiono solamente boton C2 ( PORTC1 ) Unidad--; Sonido(); break; case 0x04: // Caso que se presiono solamente boton C3 ( PORTC2 ) Asesor++; Sonido(); break; case 0x08: // Caso que se presiono solamente boton C4 ( PORTC3 ) Asesor--; Sonido(); break; case 0x10: // Caso que se presiono solamente boton C5 ( PORTC4 ) Reset(); // Asesor=Unidad=Decena=0 Sonido(); break; default: // Caso que se presiono varios botones, lo descarto. break; } // Ahora corrijo todo lo malo que puede existir; if (Unidad==10) {Unidad=0; Decena++;} // Se pasaron las unidades aumento decenas, luego corrijo decenas if (Unidad>10) {Unidad=9; Decena--;} // Me pase para atras?, es decir unidad era 0 y lo reste. if (Decena==10) {Decena=0;} // Se pasaron las decenas, lo pongo a 0 if (Decena>10) {Decena=9;} // Me pase para atras?, es decir decena era 0 y lo reste. if (Asesor==6) {Asesor=1;} // Supongo 5 asesores, y que comienzan con el numero 1. Se pasaron los asesores, lo pongo a 1 if (Asesor==0) {Asesor=5;} // Me pase para atras?, es decir asesor llego a 0 entonces pongo el ultimo, todo suponiendo que es ciclico } }
El codigo no me gusta para nada. es MALO lo que hice pero es para que te des una idea.
Una cosa a notar, es que mostrar en los displays si pones una demora en algun boton vas a hacer que un display se encuentre encendido mas que otro, asi que ojo con las demoras.
Para ambos que respondieron. Como ya me dijeron como era el programa se puede achicar un poco masCódigo: C
int aux,i; bool bit_bandera; while (1) { Muestro_en_display(); aux = input_c()&0x1F; if(!bit_bandera && aux) // PuertoC 000a aaaa AND 0001 1111 Si algo esta presionado va a quedar como true, si ademas bit_bandera es 0 entra { bit_bandera=1; // Set de bandera. for(i=0;i<5;i++) //Reviso todos las entradas, a la primer entrada activa procedo a tomar ese valor { if(bit_test(aux,i)) break; } Asesor=i+1; // Valor de asesor depende del bit Unidad++; // Incremento 1 unidad // Ahora corrijo todo lo malo que puede existir; if (Unidad==10) {Unidad=0; Decena++;} // Se pasaron las unidades aumento decenas, luego corrijo decenas if (Decena==10) {Decena=0;} // Se pasaron las decenas, lo pongo a 0 } }
Le falta agregar el sonido nomas. Y le quite el switch para que no exista mas problemas. Otra cosa interesante es si pudieran desabilitar las entradas un ratito luego de haber tomado un valor, de esa forma se evita que algun "animal de persona" presione 3 veces seguidas un boton para incrementar y se incremente exactamente 3 veces