¿Cómo puedo simplificar esta función?

O

otuzsubat

Guest
Yo uso un teclado 4x3 en mi proyecto.Yo uso C0, C1, C2 y C5 como pines de salida, y E0, E1, E2, como insumos.Esta función puede ser más simple?

char one_char (void) (
unsigned int fila;
para (fila = 0; fila <4; ){//" fila fila "
if (fila == 0) (
output_low (pin_c0);
output_high (pin_c1);
output_high (pin_c2);
output_high (pin_c5);
)
if (fila == 1) (
output_high (pin_c0);
output_low (pin_c1);
output_high (pin_c2);
output_high (pin_c5);
)
if (fila == 2) (
output_high (pin_c0);
output_high (pin_c1);
output_low (pin_c2);
output_high (pin_c5);
)
if (fila == 3) (
output_high (pin_c0);
output_high (pin_c1);
output_high (pin_c2);
output_low (pin_c5);
)
if (! entrada (PIN_E0) & & entrada (PIN_E1) & & entrada (PIN_E2))
return ((fila * 3) 1 0 x30;
else if (entrada (PIN_E0) & &! de entrada (PIN_E1) & & entrada (PIN_E2))
return ((fila * 3) 2 0 x30);
else if (entrada (PIN_E0) & & entrada (PIN_E1) & &! de entrada (PIN_E2))
return ((fila * 3) 3 0 x30);
algo más
return (0);
)

 
No ayuda mucho a simplificar, ya que los dedos humanos son mucho más lento que la UC.

En cualquier caso, suponiendo que los otros pines del puerto C no son los pines de salida, usted podría simplemente al puerto de salida de 0x17 C al final del bucle for,
en vez de tener tantos output_high.(Siempre que usted desactivar
la auto-CCS TRIS ajuste por supuesto)

Cuando las pruebas de las columnas, si se puede asegurar que sólo el usuario presiona una tecla en un momento, usted puede probar para que solo alfiler.

Trate de usar fila fila fila o fila = (fila <<1) en lugar de la fila 3.

BTW, ¿ha probado el código antes?¿Tiene un conmutador externo debouncing circuito?Debido a que no está hecho en software.

¡Salud!!

 
Yo uso los demás alfileres de C. De hecho, quiero saber como puedo activar o desactivar algunos pines al mismo tiempo sin cambiar los demás alfileres.

Mientras tanto, i aplicado su sugerencia y mi función ahora funciona más rápido.

 
Cita:

BTW, ¿ha probado el código antes?
¿Tiene un conmutador externo debouncing circuito?
Debido a que no está hecho en software.
 
Usted puede hacer algunos trucos.
Como ejemplo, para devolver parte:

cambiar

if (! entrada (PIN_E0) & & entrada (PIN_E1) & & entrada (PIN_E2))
return ((fila * 3) 1 0 x30;
else if (entrada (PIN_E0) & &! de entrada (PIN_E1) & & entrada (PIN_E2))
return ((fila * 3) 2 0 x30);
else if (entrada (PIN_E0) & & entrada (PIN_E1) & &! de entrada (PIN_E2))
return ((fila * 3) 3 0 x30);
algo más
return (0);

a:

const unsigned char conversión [8] = (0,0,0,1,0,2,3,0);

return (conversión [de entrada (port_E) & 0x07] == 0? 0: (conversión [de entrada (port_E) & 0x07] 0x30 fila * 3));No para comprobar la exactitud, concepto, pero está bien.

 
Asumiendo que usted puede emitir a los cuatro bits de c en un puerto de salida de la operación, que podría cambiar de fila entre los bucles, a la fila <<= 1, y la salida de bits sabio inverso en el puerto de la fila C:

para (fila = 1; fila <32; fila <<= 1)
(
salida (port_c, ~ fila)
...
)

Los códigos devueltos cambio, pero que presumiblemente tienen el código para convertir códigos de dígitos (o lo que está en la clave),
por lo que este podría ser adaptado.

HTH
Barny

 
He cambiado mi función como se indica a continuación.Me separados a dos funciones.
Los cambios básicos son i no uso "para el" bucle de la variable "fila" y en lugar de volver ((fila * 3) 3 0 x30); i = uso tus_degeri (fila = (fila <<1) 0 x33);

char tus_degerlendir (unsigned int fila) (
tus_degeri byte;
if (! entrada (PIN_E0) & & entrada (PIN_E1) & & entrada (PIN_E2)) (
tus_degeri = (fila = (fila <<1) 0 x31);
if (tus_degeri == 0x3A)
tus_degeri = 0x2A;
return (tus_degeri);
)
if (entrada (PIN_E0) & &! de entrada (PIN_E1) & & entrada (PIN_E2)) (
tus_degeri = (fila = (fila <<1) 0 x32);
if (tus_degeri == 0x3B)
tus_degeri = 0x30;
return (tus_degeri);
)
if (entrada (PIN_E0) & & entrada (PIN_E1) & &! de entrada (PIN_E2)) (
tus_degeri = (fila = (fila <<1) 0 x33);
if (tus_degeri == 0x3C)
tus_degeri = 0x23;
return (tus_degeri);
)
return (0x00);
)
char tus_tara_degerlendir (void) (
byte temp, fila;
fila = 0;
output_low (pin_c0);
output_high (pin_c1);
output_high (pin_c2);
output_high (pin_c5);
temp = tus_degerlendir (fila);
if (temp! = 0)
return (Temp);
fila = 1;
output_high (pin_c0);
output_low (pin_c1);
output_high (pin_c2);
output_high (pin_c5);
temp = tus_degerlendir (fila);
if (temp! = 0)
return (Temp);
fila = 2;
output_high (pin_c0);
output_high (pin_c1);
output_low (pin_c2);
output_high (pin_c5);
temp = tus_degerlendir (fila);
if (temp! = 0)
return (Temp);
fila = 3;
output_high (pin_c0);
output_high (pin_c1);
output_high (pin_c2);
output_low (pin_c5);
temp = tus_degerlendir (fila);
if (temp! = 0)
return (Temp);
return (0x00);
)

 
También puede establecer todos los pines de salida de alta a continuación, seleccione el que a un conjunto de baja con una sentencia case.

Pero para que este programa que guarda la mayoría de escribir.También puede ser el código más compacto, pero eso no siempre es así cuando el número de casos es pequeño.

 
Después de configurar los puertos para la pin_c se supiera, al comienzo de la función, sólo tienes que escribir a los que el cambio:

char tus_tara_degerlendir (void) (
byte temp, fila;
fila = 0;
output_low (pin_c0);
output_high (pin_c1);
output_high (pin_c2);
output_high (pin_c5);
temp = tus_degerlendir (fila);
if (temp! = 0)
return (Temp);
fila = 1;
output_high (pin_c0);
output_low (pin_c1);
/ / NO ES NECESARIO output_high (pin_c2);
/ / NO ES NECESARIO output_high (pin_c5);
temp = tus_degerlendir (fila);
if (temp! = 0)
return (Temp);
fila = 2;
/ / NO ES NECESARIO output_high (pin_c0);
output_high (pin_c1);
output_low (pin_c2);
/ / NO ES NECESARIO output_high (pin_c5);
temp = tus_degerlendir (fila);
if (temp! = 0)
return (Temp);
fila = 3;
/ / NO ES NECESARIO output_high (pin_c0);
/ / NO ES NECESARIO output_high (pin_c1);
output_high (pin_c2);
output_low (pin_c5);
temp = tus_degerlendir (fila);
if (temp! = 0)
return (Temp);
return (0x00);
)

 

Welcome to EDABoard.com

Sponsor

Back
Top