Вы находитесь на странице: 1из 30

LENGUAJE C PARA C

Lenguaje de alto nivel:

Incorpora operadores y estructuras de control propias de los


lenguajes de alto nivel.
nivel

Presenta elevada flexibilidad y permite manejar informacin a


nivel de bits
bits.

Lenguaje
g j normalizado:

ANSI C

Los compiladores para microcontrolador suelen ser un


j
subconjunto del normalizado, con algunas
g extensiones.
1
VENTAJAS / INCONVENIENTES

Ventajas:

Facilita la escritura, comprensin, portabilidad y


mantenimiento del cdigo generado.

Inconvenientes:

El cdigo generado es menos eficiente (en tamao y


velocidad) que el equivalente en ensamblador.

2
ESCRITURA DE UN PROGRAMA

Las sentencias simples acaban en ;


Las sentencias compuestas van entre { }
Un bloque de comentarios empieza con /* y
termina con *//
Una lnea de comentarios comienza con //
Un programa es una coleccin de funciones
funciones,
al menos ha de existir la funcin main()
Hay un conjunto de palabras clave
reservadas para el compilador

3
PALABRAS CLAVE

Palabras clave de ANSI C:


auto, break,
auto break casecase, char,
char const,
const continue,
continue default,
default double,
double enum,
enum
extern, do, else, float, for, goto, if, inline, int, long, return,
short, signed, sizeof, static, struct, switch, typedef, union,
unsigned, void, while,
define, elif, ifdef, ifndef, include, endif, error, pragma, undef

PIC18F45K20:
MPLAB X IDE is a software program that runs on a PC to develop
applications for Microchip microcontrollers
MPLAB XC Compiler, provides a comprehensive solution for your
projects development software needs and replaces all MPLAB C and
HI-TECH compilers.
p

4
OPERADORES
Aritmticos:
+, -, *, /, %, ++, --, -
De comparacin:
>, >=, <, <=, ==, !!=
Lgicos:
&&, ||, !
Bit a bit:
&, |, ^, >>, <<, ~
5
TIPOS DE DATOS

Bsicos:
char, int, float, double, void
Modificadores:
unsigned signed
unsigned, signed, short
short, long

6
TIPOS DE DATOS

7
INSTRUCCIONES
ENSAMBLADOR
Cuando se quiere poner cdigo
ensamblador en un p
programa
g en C:
#asm
/* User assembly code */
MOVLW 10 // Move decimal 10 to count
MOVWF count, 0
/* Loop until count is 0 */
start:
DECFSZ count, 1, 0
GOTO done
BRA start
done:
#endasm

8
DIRECTIVAS
E
Especificadas
ifi d con # #pragma nombre
b
#pragma tipo de memoria
program memory: code, romdata
data
d t memory: udata,
d t idata
id t
#pragma config
LVP=OFF, WDTEN=OFF, FOSC=INTIO67,
PBADEN = ON, DEBUG = OFF

9
FUNCIONES DE BIBLIOTECA
NOMBRE FUNCIN BIBLIOTECA
NOP(); It does nothing. xc.h
CLRWDT(); Clear the devices internal watchdog timer. xc.h

SLEEP(); It puts the device into a low-power standby xc.h


mode.
RESET(); This will trigger a software device Reset. xc.h

pow(f p);
pow(f,p); It raises its first argument,
argument ff, to the power p
p. math.h
math h
Round(x); It rounds the argument to the nearest math.h
integer value
rand (void); It is a pseudo-random number generator. stdlib.h

Lista completa en MPLAB XC8 C Compiler Users


User s
Guide Apndice A. 10
Ejemplo: Programa elemental
p1.c
1
/*Programa
g que suma dos
nmeros enteros*/

#include <pic18f45k20
<pic18f45k20.h>
h>
#pragma config LVP=OFF, WDTEN=OFF, FOSC=INTIO67

void main(void)
{
int a,b,c; //Declaracin de variables locales
a=3; //Asignacin de valores
b=2;
c=a+b; //Operacin y asignacin
}
11
Ejemplo:
j p Uso de funciones p
p2.c
/*Programa que suma dos nmeros enteros
mediante una funcin*/
int suma(int x, int y) //Funcin suma
{
int z; //Declaracin de variable local
z=x+y; //Suma de las variables
return (z); //La funcin retorna con el valor de z
}
void
id main()
i () //P
//Programa principal
i i l
{
int a,b,c; //Declaracin de variables locales
a=3;
3 //A i
//Asignacin
i de
d valores
l
b=2;
c=suma(a,b); //Llamada a la funcin
a=7;
b=5;
c=suma(b,a);
}
12
Ejemplo: Variables globales p3.c
/*Ejemplo de utilizacin de
variables globales*/
globales /
int a,b,c; //Declaracin de variables globales
void suma() //Funcin suma
{
c=a+b;
}
void main() //Programa principal
{
a=3; //Asignacin de valores
b=2;
suma(); //Llamada a la funcin
a=7;
b=5;
suma();
} 13
Estructuras de control de flujo

if (condicin) no
condicin
sentencia;; sii

sentencia

if (condicin)
(co d c )
no
sentencia1; condicin

else sentencia2
sentencia2; si
sentencia2
sentencia1

14
Estructuras de control de flujo
switch(expresin)
case cte_1:
t 1
sentencia_1;
break
case cte_2: expresin
sentencia_2; ct_1
ct_n
break
ct_2
...... default

. sent_1
.
case cte_n:
cte n: sent 2
sent_2
sentencia_n;
break sent_n
default:
sentencia_d;
sent_d

15
Estructuras de control de flujo

while
hil ((condicin)
di i ) condicin
no

sentencia;; si
sentencia

Do sentencia

sentencia; si
while (condicin) condicin

no
16
Estructuras de control de flujo
for (inicio; condicin; incremento)
sentencia;

inicio

no
condicin
si
sentencia

incremento

17
Ejemplo: Suma de los n primeros enteros
p
p4.c
int sumatorio_1(int x) //Funcin sumatorio con for
{
int suma=0,n;, ;
x++;
for (n=0;n<x;n++) suma=suma+n;
return (suma);
}
int sumatorio_2(int y) //Funcin sumatorio con do..while
{
int suma=0
suma=0, n=0;
do {
n++;
suma=suma+n;;
}while(n<y);
return (suma);
}
void main() //Programa principal
{
int a=3,b=4,c,d; //Asignacin de valores
c=sumatorio 1(a);
c=sumatorio_1(a); //Llamadas a las funciones
d=sumatorio_2(b);
18
}
Ejemplo: copiar un puerto en otro
p5.c
#include <pic18f45k20.h>
5
#pragma config LVP=OFF,
LVP=OFF WDTEN=OFF,
WDTEN=OFF
FOSC=INTIO67, PBADEN = ON
/*Programa que copia constantemente el contenido del puerto B en el D
Registros de configuracin:
PBADEN en ON habilita RB0 al RB5 como entradas analgicas por defecto
WDTEN en OFF deshabilita el WDT
FOSC a inti067 programa el micro a 1 MHz
LVP es para la programacin*/

void main()
{
ANSELH=0x0; //RB0 como entrada digital
TRISB=0XFF; //Puerto B como entrada
TRISD=0; //Puerto D como salida

while(1) PORTD=PORTB;
PORTD PORTB; //Bucle infinito
19
INTERRUPCIONES
#include <pic18fxxx.h>

//interrupt es la palabra que identifica una subrutina de atencin a la


interrupcin
//low_pprioriy
y y high
g _p
priority
y son los dos vectores de interrupcin
p
//low_isr y high_isr son nombres del usuario a las subrutinas

void interrupt low_priority


low priority low_isr
low isr (void)
{
/* ... */
}

void interrupt high_priority high_isr (void)


{
/* ... */
}

20
Ejemplo: Puerto incrementado cada
#i l d <pic18f45k20.h>
#include < i 18f45k20 h>
g
segundo p
p6.c
#pragma config LVP=OFF, WDTEN=OFF, FOSC=INTIO67, PBADEN = ON

static unsigned
g desbordamientos;;

// Esta es la Rutina de Servicio de la Interrupcin baja:


void interrupt low_priority isr1(void) {
// instrucciones
i t i
if (desbordamientos == 0){
desbordamientos=2; //Si se cumplen 2 desbordamientos
PORTD=PORTD+1;; //se incrementa el p
puerto B
}
desbordamientos=desbordamientos-1;
INTCONbits.TMR0IF=0; //Borrado del flag
}

// Esta es la Rutina de Servicio de la Interrupcin alta:


void interruptp high_priority
g _p y isr2(void)
( )
{
PORTD=0;
INTCONbits.INT0IF=0;
}
21
void main()
{
ANSELH=0x0;; //RB0 como entrada digital
g
desbordamientos=2; //2 desbordamientos, 1sg aprox
TRISB=0xFF;
TRISD=0; //Puerto D como salida
PORTD 0
PORTD=0; //
//puerto
t D a cero
RCONbits.IPEN=1;
INTCONbits.GIEL=1; //Habilitacin global
INTCONbits.GIEH=1;; //Habilitacin g
global
INTCONbits.TMR0IE=1; //Habilitacin particular
INTCONbits.INT0IE=1; //habilitacin externa 0
INTCON2bits.TMR0IP=0;
T0CON=0x80; //arrancar timer
timer, preescalado 1/2
1/2, modo 16 bits

while(1);
//Bucle infinito
}

22
Vectores
Lista de elementos de un mismo tipo que
se p
pueden recorrer con ndices.

i t tabla[8]:
int t bl [8] //Lista
//Li t de
d 8 enteros
t

int matriz [2][5] //Tabla bidimensional

23
Ejemplo: Media, mximo y mnimo de una tabla
p7 c
p7.c
#include <pic18f45k20.h>
#include <xc.h> //biblioteca con recursos extra, consultar en gua usuario
#pragma config LVP=OFF,
LVP OFF, WDTENWDTEN=OFF,
OFF, FOSC
FOSC=INTIO67,
INTIO67, PBADEN = ON
#include "math.h" //biblioteca matemtica
void main() //Programa principal
{
unsigned int tabla[4],i,mayor, menor; // Declaracin de variables
float media=0;
tabla[0]=15; //Asignacin de valores a la tabla
tabla[1]=12;
tabla[2]=18;
tabla[3]=16;
mayor=menor=tabla[0];
for (i=0;i<4;i++) {
media=media+tabla[i];
if (tabla[i]>mayor)
(t bl [i] ) mayor=tabla[i];
t bl [i]
if (tabla[i]<menor) menor=tabla[i];
}
media=media/4;
Nop();//slo est para poner un punto de ruptura 24
}
Punteros

Variable que almacena la direccin de


memoria en la qque est almacenado un
dato:

int *punt1 //Puntero a un entero


float *punt2 //Puntero a un float

25
Punteros (operadores)

* Devuelve el valor que se encuentra en la


direccin que le sigue

&: Devuelve la direccin de memoria en


donde se encuentra la variable que le
sigue.
sigue

26
Ejemplo: Uso de punteros p8.c
/*Calcular la media, mximo y mnimo de los valores de una tabla*/
#include <pic18f45k20.h>
#include <xc.h>
#
#pragma config
fi LVP
LVP=OFF, OFF WDTEN=OFF,
WDTEN OFF FOSC=INTIO67,
FOSC INTIO67 PBADEN = ON
#include "math.h" //biblioteca matemtica
void main() //Programa principal
{ unsigned int tabla[4]
tabla[4],i,mayor,
i mayor menor;
unsigned int *punt1=&tabla[0];
float media=0;
tabla[0]=15;tabla[1]=12; //Asignacin de valores a la tabla
tabla[2]=18;tabla[3]=16;
mayor=menor=*punt1; //Inicializacin de mayor y menor
for (i=0;i<4;i++)
(i 0;i<4;i++) {
temp=*punt1;
media=media+*punt1;
if ((*punt1>mayor)
punt1 mayor) mayor=*punt1;
mayor punt1;
if (*punt1<menor) menor=*punt1;
punt1++;
}
media=media/4;
Nop();//slo est para poner un punto de ruptura 27
}
Punteros. Paso de parmetros a funciones

En C las funciones slo pueden devolver


un valor.

Si a una funcin se le pasa como


parmetro un p
p puntero, el valor de la
direccin apuntada puede ser modificado
y devuelto
devuelto.

28
Ejemplo: Paso de parmetros por referencia
p9 c
p9.c
/*Calcular suma y diferencia de dos nmeros
Uso de punteros para pasar parmetros por referencia*/
#include <pic18f45k20.h>
#pragma config LVP=OFF, WDTEN=OFF, FOSC=INTIO67, PBADEN = ON
#include "math.h" //Libreria matemtica
#include <xc.h>
void sum_dif(int x, int y, int *dsum, int *ddif)
{ *dsum=x+y;
dsum=x+y;
*ddif=x-y;
}
void main() //Programa principal
{ int a, b, suma, diferencia;
a=5;
b 3
b=3;
sum_dif(a, b, &suma, & diferencia);
Nop();
/*a y b se pasan por valor, suma y diferencia
se pasan por referencia*/ 29

}
Declaracin Caracteres en
ROM
rom const char table[10] = { hola mundo };

30

Вам также может понравиться