HOME

PRODUCTOS

PROYECTOS

TUTORIALES

VIDEOS

FREEWARE

PROGRAMAS

FUNCIONES C

EMPRESA

ENGLISH

                   

tutorial: uso de funciones en ANSI C  

Funciones disponibles en C para microcontroladores de la familia 18/

Funciones disponibles en C para microcontroladores de la familia 16/

 

funciones.jpg (58915 bytes)

 

Introducción:

Las funciones utilizadas en C son subrutinas que llevan a cabo una tarea específica, pueden ser llamadas desde cualquier parte del programa y permiten incluir parámetros o argumentos como entradas/ salidas ó un valor como salida o regreso de la función. En el argot de los programadores se dice "pasar argumentos a la función" y que la función "regresa un valor" (return value).

No es indipensable que la función cuente con argumentos de entrada/salida ni un valor de salida o "return value". Pueden usarse las funciones que lleven a cabo una tarea específica, sin dar argumentos de entrada o salida en su formato.

Los argumentos que pueden "pasarse" como entradas de una función pueden ser valores constantes, variables, o incluso arreglos o "strings".

 

EJEMPLO 1:

Veamos un ejemplo muy sencillo con una función para sumar 2 variables.

int velocidad1,velocidad2;                       //se declaran 2 variables como valores enteros con signo

int suma(int a,int b);                              //antes de la función "main" es necesario declarar la función "suma"

Esta declaración significa: define una función cuyo nombre es "suma" y que cuenta con 2 valores de entrada cuyos nombres son "a" y "b" y que se almacenarán en memoria, como valores enteros con signo ("int"). Además, el valor de retorno de la función (return value), declarado del lado izquierdo, es otro valor entero con signo. Observe como al valor de retorno no se le asigna ningún nombre de variable, debido a que el nombre mismo de la función tomará ese valor.

void main(void) {                                    //aquí se declara la función principal, que es el inicio del programa.

velocidad1=8; velocidad2=3;                  //se inicializa el valor de las variables.

PORTB=suma(velocidad1,velocidad2);       //los valores de velocidad1=8 y velocidad2=3 "se pasan" a la función.     

for(;;);                                                      //fin del programa, loop sobre sí mismo

}    

El programa principal llama a la función "suma". El valor de velocidad1 se transfiere a la variable a y velocidad2 se transfiere a la variable b. Como en este caso existe un valor de retorno, el nombre de la función toma ese valor, como se muestra en el ejemplo. El resultado de la suma (11), se transfiere al Puerto B, y aparece en los LEDS, en formato binario. En seguida se muestra el desarrollo de la función "suma":   

int suma(int a,int b){                               //este es el inicio de la función "suma".

int c;                                                      //se declara c como variable local

c=a+b;                                                 //aquí se efectúa la suma

return (c);    }                                       //la función regresa al programa principal. La función toma el valor de c.

Al llamar a la función, las variables pueden también llevar el mismo nombre que los argumentos de la función. Este ejemplo funcionaría  igualmente, llamando a la función con los nombres de variables a y b, en lugar de velocidad1 y velocidad2, siempre y cuando dichos nombres hubiesen sido declarados anteriormente como variables globales. En este caso, las instrucciones utilizadas serían: a=8; b=3; PORTB=suma(a,b);

La misma función opera correctamente si se le llama usando constantes como argumentos. Por ejemplo: suma(10,35). En este caso el valor de retorno sería 45.

 

EJEMPLO 2:

Ahora veamos un ejemplo más complejo, desarrollado para el compilador de HITECH y en donde se usan varias funciones. Usted debe crear una carpeta de nombre "MULT", y cargar allí los archivos: HITECHMULTTINY.c, y key33.h y posteriormente crear un proyecto nuevo en MPLAB.

El programa está hecho para el sistema EVOLUPIC Bootloader 16F88. Su objetivo es explicar el funcionamiento de las funciones. Por favor revise el programa línea por línea y lea sus comentarios del lado derecho. El programa multiplica dos variables y convierte el resultado a formato BCD. En los LEDS del puerto B (en formato binario) se muestran, en forma consecutiva, y en lapsos aproximados de 1 segundo, las dos variables de entrada (3 y 8), el resultado de la multiplicación (24) y finalmente la conversión a BCD (0010 0100).

#include <htc.h>
#include "key33.h"                     //incluye librería para funciones de retardo

int a,b,c,d,e;                                 //define 5 variables, globales, enteras con signo
void segundo(void);                     //declara la función segundo(). Observe como no lleva parámetros
int mult (int a,int b);                    //declara la función "mult", con 2 argumentos y valor de retorno.
int bcd(int c);                               //declara la función "bcd", con 1 argumento y valor de retorno.

main(void){                                 //aquí empieza el programa principal
TRISB=0;                                    //todos los bits del PORTB son salidas
a=8;                                             //inicializa "a"
PORTB=a;                                 //muestra en el puerto B el primer valor, durante 1 segundo
segundo();
b=3;                                             //inicializa "b"
PORTB=b;                                   //muestra en puerto B el segundo valor
segundo();
PORTB=mult(a,b);                     //multiplica y muestra en puerto B el resultado en binario
segundo();
PORTB=bcd(c);                           //muestra en puerto B el resultado de conversión a BCD                
for(;;);                                            //loop continuo sobre sí mismo, fin del programa
}

void segundo(void)                         //la función genera un retraso de 750 milisegundos. No existen argumentos.
{
DelayMs(255);                                 //uso de una función de librería DelayMs( ), tomada del archivo
DelayMs(255);                                 //header "delay.h"
DelayMs(255);
}

int mult(int a,int b)                         //la función multiplica a*b y regresa con el resultado en "c".
{
c=a*b;
return(c);
}

int bcd(int c)                                 //Convierte un valor binario entre 0...99 a formato BCD
{
d=0;
while(c>9)
{c=c-10;d++;}                                 //d es el valor de las decenas y c el de las unidades (en 4 bits)
e=(d*16)+c;                                       //e acomoda d y c en el formato de 8 bits.
return(e);                                         //la función regresa teniendo como "return value" a la variable "e".
}

NOTA IMPORTANTE:

Los argumentos de entrada/salida usados en cualquier función son siempre variables locales, es decir, si fueron previamente definidas como variables globales, y su valor se modifica adentro de la función, al regresar de la función la variable permanece con el mismo valor con el que entró. Por ejemplo: en la función bcd(c), la variable "c" ingresó a la función con un valor de 24. La función modifica este valor y c=4 al terminar la función. Sin embargo, en el programa principal, la variable "c" continuará teniendo el valor 24.

A las funciones se les pueden pasar parámetros ó argumentos de dos formas: por valor o por referencia. En los ejemplos vistos hasta ahora, se pasaron argumentos "por valor". Para una explicación y ejemplos más detallados al respecto de argumentos pasados a las funciones "por referencia" por favor vaya a estos vínculos: Pointers Parte I y Pointers Parte II.