You are on page 1of 34

Introduccin al lenguaje C

Estructura general del programa

Libreras
Declaracin de variables y funciones Programa principal Funciones

Ejemplo bsico
#include <p30f4011.h> Int Int main() { x=mult(5, 12); return 0; x; //declaracin de variables mult(int a, int b); //declaracin de funcin

}
Int mult(int x, int y) { int resultado; resultado=x*y; return resultado; }

Ejm. de librerias
p30f4011.h p30f3014.h p30fxxxx.h timer.h adc10.h uart.h

Ejm. de declaracin de variables


Declaracin de variables: char nobrevariable; int var1,var2; float tmp1,tmp2; Existen variantes como: unsigned char; long int; double float; Declaracin de funciones: En las funciones deben declararse las variables usadas en stas (al menos que sean variables globales).Toda declaracin de variables debe situarse al inicio de la funcin.

Tipos de variables (enteras)

Tipos de variables (flotantes)

Funcin main()
Todo programa en C debe contener la funcin main(). Esta funcin normalmente contiene el programa principal y sin importar su posicin dentro del archivo de texto del programa, dicha funcin se ejecutara en primera instancia.

Toda funcin devuelve un valor, aunque este sea nulo.


Librerias main() { cuerpo del programa return 0; }

Ejemplos de funciones
#include <p30f4011.h> #include <timer.h> void ini_tmr23(void); main() { ini_tmr23(); return 0; } void ini_tmr23(void) { WriteTimer23(0); unsigned long match_value = 0xD693A400; ConfigIntTimer23(T2_INT_PRIOR_3 & T2_INT_ON); OpenTimer23(T2_ON & T2_IDLE_STOP &T2_GATE_OFF & T2_PS_1_1 & T2_32BIT_MODE_ON & T2_SOURCE_INT, match_value); }

Combinacin de operadores aritmticos


Operador += -= *= /= %= x += y x -= y x *= y x /= y x %= y Descripcin equivale a equivale a equivale a equivale a equivale a x=x+y x=x-y x=x*y x=x/y x=x%y

Incremento decremento de una unidad


Operador x++ x-x=x+1 x=x1 Descripcin equivale a x = x - 1 equivale a x = x - 1

Operadores relacionales
Operador == != > < >= <= Igual a Diferente de Mayor que Menor que Mayor o igual que Menor o igual que Descripcin

Operadores de desplazamiento
Operador Descripcin

x >> y x << y

Desplazamiento a la derecha Desplazamiento a la izquierda

y es el numero de bit que se desplaza el operando x

Operadores lgicos
&& || ! Operador lgico AND Operador lgico OR Operador lgico NOT

Se usan para evaluar la veracidad o falsedad de dos expresiones, regresan un 0 o un 1


Ejm: (var1 == 0) || (var2 == 5 ) if( (var1 < 10) && (var2 > 25) )

Operadores lgicos (nivel bits)


Operador
& |

Descripcin
Operador AND a nivel de bits Operador OR a nivel de bits Operador OR exclusivo (XOR) a nivel de bits Operador de complemento a nivel de bits

Ciclos (while)
Este ciclo sirve para ejecutar un o varias instrucciones una y otra vez mientras una condicin sea verdadera.
---------------------------- Forma General while (condicin) { // instrucciones } ---------------------------- Aplicacin, funcin de retardo void _delay(void) { int time = 10000; while (time != 0) time--; } ---------------------------- Ciclo infinito While(1) { }

Ciclos (do-while)
Es una variante del ciclo while. La condicin se evala al final del ciclo, lo cual permite que las instrucciones que se encuentran dentro del ciclo se ejecuten al menos unas vez, aun cuando la condicin sea falsa.
Forma General do { // instrucciones // instrucciones } while (condicin)

Ciclos (for)
Esta instruccin sirve para controlar la ejecucin de un ciclo un determinado numero de veces.
Forma General
For (expresin1;expresin2,expresin3) { // instruccin } Ejm: for(i=0;i<100;i++) { _delay(); } Es posible el anidamiento de ciclos

Control de flujo (if)


Es una instruccin condicional, se utiliza para evaluar una condicin(es) y as poder decidir si se va a ejecutar el bloque de cdigo controlado por la instruccin.
Forma General if (condicin) { // instruccin } Ejm:

If (PORTDbits.RD0 == 1) { _write(Falla detectada); } Es posible el anidamiento

//funcin para LCD

Control de flujo (if-else)


Es una variante de la instruccin if. En este caso si la condicin se evala como falsa, se omitirn las instrucciones del if, y se ejecutaran las del else.
Forma General if (condicin) { // instrucciones } ese { //instrucciones } Es posible el anidamiento

Control de flujo (if-else)


Ejm: If (PORTEbits.RE3 == 0) { _write (girando izquiereda); _girar_motor_izquierda(); } else { _write (girando derecha); _girar_motor_derecha(); }

Control de flujo (switch,break)


Esta instruccin es una alternativa mas simple al uso de if anidados, cuando hay que tomar decisiones sucesivas relacionadas
Forma General switch (expresin) { case expresion1: //instrucciones break; case expresion2: //instrucciones break default: //instrucciones break; }

Control de flujo (switch)


Ejemplo:
switch (mes) { case 1: dias_mes=31; break; case 2: b=3; if (year && b) else case 3: dias_mes=31; default: dias_mes=31; break; }

dias_mes=28; dias_mes=29;

Interrupcin de un ciclo infinito


Para salir de un ciclo infinito de hace uso de la instruccin break
while (1) { if ( PORTE == 0x03) break; } Para interrumpir un ciclo y permanecer en l se utiliza la instruccin continue, esta instruccin permite saltar al final del ciclo sin ejecutar las instrucciones que se salta pero sin salirse del bloque.
for ( i=0; i<10; i++) { if (i ==2 || i == 4 || i== 6 || i == 8 ) continue; PORTD=i; _delay(); }

Instruccin goto (salto incondicional)


Esta instruccin tiene la finalidad de cambiar el flujo del programa de forma incondicional. No es muy recomendable hacer uso de sta.
Forma general instruccin1; etiqueta: instruccin2 . . . goto etiqueta; instruccinx;

Arreglos
Es el conjunto de variables de un mismo tipo (char, int, float, etc.), donde a cada variable se le denomina elemento. Todos estos elementos se referencian con el mismo nombre y se almacenan en un conjunto de posiciones de memoria consecutivas.
Declaracin de un arreglos char Int char bcd_7_seg[10] ={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; lista_int[10]; dias_mes[] ={31,28,31,30,31,30,31,31,30,31,30,31};

Escribir a un elemento del arreglo lista_int[0]=0x23; Leer un elemento del arreglo x=lista_int[5]; TODOS LOS ELEMENTOS DE LOS ARREGLOS INICINA CON INDICE 0

Cadena
Una cadena es un arreglo de caracteres el cual utiliza un carcter nulo (\0) para indicar el final de la cadena.
Declaracin de cadenas char char arreglo_char[5] = { H, o, l, a, \0 }; cadena[]=Hola

En este ultimo caso el compilador agrega el carcter nulo /0 al final de Hola

Apuntadores
Son variables especiales que se utilizan para conseguir la direccin de memoria de otras variables. Estas variables se utilizan para la indexacin de arreglos y cadenas.
Declaracin de un apuntador Para declarar un apuntador es necesario anteponerle al nombre del apuntador un asterisco (*).

Int char

*aptr_int; *aptr_cadena;

Para conseguir la direccin inicial que ocupa una variable se utiliza el operador (&), llamado tambin operador de direccin.

int int

x; *y;
y=&x;

//declaracin de x como entero //declaracin de y como un apuntador tipo entero


//asignacin a y de la posicin de memoria que ocupa la variable x (no aplica para cadenas o arreglos)

Ejemplo de uso de apuntadores


int char *aptr; bcd_7_seg[10] ={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

main() { Int i;
aptr = bcd_7_seg;
for(i=0;i<10;i++) { PORTB= aptr[i]; _delay(); }

//Se le asigna a aptr la direccin de inicio del arreglo // bcd_7_segmentos.

Ejemplo de uso de apuntadores


main() {
_write(Hola mundo"); while(1) {}

void _write(char *string) { int i; for(i=0;string[i]!='\0';i++) _dato_wr(string[i]); }

Organizacin de proyectos en C

Tipos de variables y constantes


Variables locales Estas variables se declaran dentro de las funciones y solo son validas ah. No son reconocidas dentro de otras funciones.

Variables globales Se declaran al principio del archivo, fuera de cualquier funcin. Estas variables puedes ser usadas dentro de cualquier funcin siempre y cuando estas funciones estn declaradas en el mismo archivo (archivo.C).
Variables externas Estas variables son declaradas dentro del archivo que contenga la funcin main(), Es necesario adems que sean declaradas como variables externas ejm: extern volatile int seg; dentro de un archivo con extensin *.h. En este archivo debern ir todas las variables externas, as como las funciones que se pretendan utilizar fuera de los archivo donde fueron declaradas. En los archivos donde se pretenda utilizar las variables o funciones externas deber incluir la siguiente lnea de cdigo #include "common.h.

Ejemplo de archivo common.h


//Funciones y variables para conv hex a BCD extern volatile int millares; extern volatile int centenas; extern volatile int decenas; extern volatile int unidades; void _hex_to_dec_2Dig(int contador); void _hex_to_dec_4Dig(int contador); //Funciones y variables para RTC extern volatile int seg; extern volatile int min; extern volatile int hrs; extern volatile int day; extern volatile int month; extern volatile int year; extern volatile int week_day; extern volatile char test; void _count_time(void); void _display_time(void); void _setup_time_lcd(void); void _display_calendar(void); void _menu_principal(void); void Delay_long(void);

Libreras y su utilizacin
Funciones para perifricos CAN Controller Area Network ADC12 ADC10 Timers Reset/Control I/O ports Input Capture Output Capture UART Universal asynchronous receiver/transmitter DCI Data Convert Interface SPI Serial Peripheral Interface QEI Quadrature Encode Interface PWM Pulse Wide Modulation I2C Inter-Integrated Circuit Ref: 16-bits Language Tools Libraries

Ejemplo de uso de librerias


#include <p30f4011.h> #include <timer.h> void _write_hypert(void) { _endline(); putsUART2((unsigned int *)cad_hyperterminal); while(U2STAbits.UTXBF == 1){} _endline(); putsUART2((unsigned int *)cad_etiq); while(U2STAbits.UTXBF == 1){} } void _endline(void) { WriteUART2('\n'); while(U2STAbits.UTXBF == 1){}

WriteUART2('\r'); while(U2STAbits.UTXBF == 1){}


}

Programa en C
#include <p30f4011.h> void _delay1(int time); main (void) { TRISDbits.TRISD0=0; while(1) { LATDbits.LATD 0=~LATDbits.LATD0; _delay(10000); } } void _delay1(int time) { while(time!=0) time--; } //Complementa el contenido del bit //Se declara el pin 0 del puerto D como salida

Programa en ensamblador
.include "p30f4011.inc" .global __main __main: bclr repeat: btg call goto TRISD,#0 LATD,#0 time repeat

time: loop:

mov dec bra return

0xFFFF,W0 W0,W0 NZ,loop

.end

Programa con lenguaje mixto


#include <p30f4011.h> void _delay1(int time); main (void) { ADPCFG=0X1FF; TRISB=0; while(1) { asm (LP: asm (LP1: _delay1(100); asm ( asm ( asm ( asm ( } } void _delay1(int time) { while(time!=0) time--; } //Configura puerto B como digital //Se declara puerto B de salida #0x01,W1 W1,PORTB

MOV MOV

); );

RLNC BTSS GOTO GOTO

W1,W1 W1,#0x08 LP1 LP

); ); ); );

You might also like