Otro buen ejemplo para seguir ampliando este cursillo,gracias gfp.
Se me ocurre tocar otro tema interesante.
Hasta ahora hemos visto que nuestros programas,además del programa principal,también pueden contar con una serie de rutinas para hacerlo mas modular.Estos subprogramas,hasta el momento han sido todos del tipo "void".Pero podemos usar otro tipo de procedimientos llamados funciones.Las funciones tienen como cometido hacer una serie de operaciones para finalmente DEVOLVER un valor,ya sea de tipo entero,caracter,real,booleano...
Una vez está implementada,el manejo de una función es casi el mismo que el que se le da a una variable del mismo tipo,a excepción de que mientras a una variable le podemos asignar un valor con "=",a una función no le podemos asignar nada.Sólo podemos usarla como fuente,no como destino.
Un ejemplo de una función de tipo entero:
Codigo:
////////////////////////////////////// PREPROCESADO ///////////////////////////////////
#include <16F876.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#include "lcd.c"
#use fast_io(B)
#use fast_io(C)
////////////////////////////////////// RUTINAS ///////////////////////////////////////
int entrada_activa()
{
if(input(PIN_C0))
{
// Esto se ejecuta si RC0 está a 1
return(0); // Devolvemos un 0
}else if(input(PIN_C1)) {
// Esto se ejecuta si RC1 está a 1
return(1); // Devolvemos un 1
}else if(input(PIN_C2)) {
// RC2 está a 1
return(2); // Devolvemos un 2
}else if(input(PIN_C3)) {
// RC3 está a 1
return(3);
}else if(input(PIN_C4)) {
// RC4 está a 1
return(4);
}else if(input(PIN_C5)) {
// RC5 está a 1
return(5);
}else if(input(PIN_C6)) {
// RC6 está a 1
return(6);
}else if(input(PIN_C7)){
// RC7 está a uno
return(7);
}else {
// Si entramos aquí es que no se dió ninguno de los casos anteriores (todas a 0)
return(;
}
}
////////////////////////////////////// PRINCIPAL //////////////////////////////////////
void main()
{
int pin_activo;
set_tris_c(0xff); // Puerto C configurado como entrada
lcd_init();
pin_activo = entrada_activa(); // Asiganmos a "pin" el valor que devuelve entrada_activa()
while(TRUE) // Bucle infinito
{
if(entrada_activa() > 7) // Usamos directamente el valor que nos retorne la función
{
// entrada_activa() devolvió el valor 8
printf(lcd_putc,"No hay entradas activas");
}else {
// En otro caso...
printf(lcd_putc,"El pin %u está a 1",entrada_activa()); // Mostramos qué pin está a 1
}
}
}
Como se ve,la clave de una función es la sentencia "return".
No hay que olvidar que el elemento que acompañe a "return" debe ser del mismo tipo que la función.
Otra forma de hacerlo es declarando una variable dentro de la función,modificarla dentro de la función según nos interese,y finalmente devolver dicha variable.Ocupa más memoria,pero nos libra de escribir tantos returns:
Codigo:
////////////////////////////////////// PREPROCESADO ///////////////////////////////////
#include <16F876.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#include "lcd.c"
#use fast_io(B)
////////////////////////////////////// RUTINAS ///////////////////////////////////////
BOOLEAN a_mayor_que_b(int a,int b)
{
BOOLEAN mayor; // Esta es la variable que vamos a devolver
mayor = FALSE; // Las variables booleanas es bueno inicializarlas con algún valor
if(a >= b)
{
// "a" es mayor o igual que "b"
mayor = TRUE;
}else {
// "a" es menor que "b"
// Aquí no necesitamos hacer mayor=FALSE ya que hemos inicializado "mayor" a FALSE
}
return(mayor);
}
////////////////////////////////////// PRINCIPAL //////////////////////////////////////
void main()
{
int a,b;
a = 50;
b = 30;
if(a_mayor_que_b(a,b))
{
// La función ha devuelto TRUE
output_high(PIN_B1); // Por ejemplo
}else if(!a_mayor_que_b(a,b)) {
// La función ha devuelto FALSE
output_high(PIN_B2);
}
}
Igual que los subprogramas,las funciones también pueden llevar parámetros,pero únicamente de entrada,nunca de entrada-salida.
Ah,se me olvidaba...Una vez que nos encontramos con un "return",acaba la ejecución de la función y volvemos al punto desde donde fué llamada.
Saludos