Hola Enigma, ahora que me he fijado un poco mas en el codigo, te comento:
- la opcion 1 te funcionara bien (variables globales, y eliminas las declaraciones locales en ambas funciones)
- la opcion 2 tiene una pega:
como te he comentado las variables locales desaparecen cuando se sale de la funcion, y tu quieres mantener el valor de 'cont' que lo modificas en esta funcion.
Soluciones:
2.1) Puedes pasar parametros por valor o por referencia. Pasar parametros por valor, es lo que hemos hecho en la opcion 2 anterior anterior. Simplementes le envias 2 valores como parametros de entrada a la funcion mostrar(). Pero aunque luego los modifiques en la funcion mostrar(), al salir de esta, los cambios no se reflejan en las variables de la funcion que la llama (main()).
La otra manera (paso por referencia), lo que pasas es la direccion de la variables, en lugar de su valor. De este modo, en la funcion mostrar(), no se crean 2 nuevas variables (ni en pila, ni en ningun sitio). Simplemente sabe la direccion donde esta posicionada en memoria, las variables 'cont', y 'resul' de la funcion main(). De este modo, cuando cambies el valor de 'cont' en mostrar(), lo que realmente estas haciendo es cambiar el valor de la misma posicion de memoria donde esta almacenada la variable 'cont' de la funcion main().
La funcion mostrar ahora se declararia del siguiente modo:
void mostrar(int *cont, int resul) // como parametro de entrada tendria las direcciones de cont y resul, no 'sus valores'
{
'cont' es un puntero (no contienen el valor de las variables, si no la direccion de estas)
Tb habria que sustituir donde aparece 'cont' por '(*cont)'.
Es decir:
void mostrar(int *cont, int resul) // como parametro de entrada tendria las direcciones de cont y resul, no 'sus valores'
{
if( (*cont)==1)
{
output_a(0x01);
//output_high(Q1);
output_d(resul);
delay_ms(5);
(*cont)=2;
}
if( (*cont)==2)
{
etc...
la variable resul, la pasamos por valor (no por referencia), ya que nose modifica dentro de la funcion mostrar(), ni se quiere que se conserve los cambios que se hiciesen en ella dentro de la funcion mostrar(), en caso de que se hicieran.
2.2) declara la variable 'cont' como global, y la 'resul' como local y la pasas como parametro por valor.
void mostrar (int resul)
{
etc..
2.3) En casos como este, en el que parece que la variable 'cont' solo la modificas y la utilizas dentro de la funcion mostrar() (en main no la utilizas para nada), puedes hacer lo siguiente:
void mostrar ()
{
static int cont =1;
etc...
declaras las variable local 'cont' como 'static'. A diferencia de las variables locales, cuando les añades 'static' evitas que su valor se pierda al salir de la funcion. De este modo, la primera vez que entres valdra '1' (el valor al que la hemos inicializado). La segunda vez, el ultimo que tenia antes de salir (osea cont=2). Y asi.
En este caso, sigue siendo una variable local, es decir, su valor no podria verse desde la funcion main(). 'cont' de la funcion main89 y la funcion mostrar() son variables totalmente diferentes, aunque tengan el mismo nombre (son 'locales').
Un saludo. Dani.