Está en la página 1de 86

Entremosle a la

programación en C
Programación de
Microcontroladores
¿Qué es programación en C y por qué debería
importarme?
¿Qué es un programa?
Las computadoras no son inteligentes, solo son obedientes y no se aburren.

Una colección de expresiones detalladas que le das a un procesador para


realizar una función específica es conocido como programa.

Es como una receta


para la computadora.
¿Dónde puedo programar?
Hay varios compiladores en línea El programa que escribes se llama source
code y un compilador lo convierte en machine
https://www.onlinegdb.com/ Recomendado
language.
https://www.jdoodle.com/c-online-compiler/
La mayoría de microcontroladores se pueden
programar en C

Se pueden descargar con todo y su IDE

http://www.codeblocks.org/
Usando C
C suele ser más eficiente que la mayoría de lenguajes de programación, y es
relativamente pequeño (pocos comandos). Es de los lenguajes de “bajo nivel”.

El estándar de C para los distintos procesadores es el ANSI, siendo unificado


desde el 1989. Los cambios se fueron unificando y finalmente fueron
publicados en 1999 bajo el el C99. Actualmente el estándar C18 (2018)
reemplazó al C11 (2011) sin realizar cambios al lenguaje.
Escribiendo tu primer programa
No vas a entender
todo lo que ocurre,
solo comienza a
familiarizarte.
Funciones vs Comandos
main() printf() strlen() calcIt() return while int if

Es una rutina que realiza una tarea No tienen paréntesis

Los nombres inician


con minúscula y al ser
de multiples palabras,
se omite el espacio y
se ponen mayúsculas..
Un bloque de código
Ten cuidado con todos los paréntesis,
punto y coma, brackets
Los espacios e indentaciones son solo
para las personas
Los textos inician con minúsculas
La función main()
Es requerida y es donde la computadora inicia a ejecutar el programa (aún si
hubiera otra función antes en el código)

Los corchetes { } nos indican las instrucciones relacionadas a la función


utilizada

El #include <stdio.h>
casi siempre se va a
utilizar.
COMENTARIOS
No se ejecutan en el código

Comienzan con //
Al inicio del código
deberíamos poner
Un bloque inicia con /* y termina con */
nuestro nombre y
explicación breve del
código
Tipos de datos
Los más comunes son:

- characters
- integers
- floating points
TIPOS DE DATOS EN
<stdint.h>
int8_t
Entero con signo de 8 bits
-128 a 127
uint8_t
Entero sin signo de 8 bits
0 a 255
Sumando todo junto

La tabulación y
espacios son para
humanos, son
ignorados por el
compilador
El mínimo absoluto
Nos familiarizamos con como se mira un programa en C

La función main() es siempre requerida y es la primera en ejecutarse

Utiliza muchos espacios para hacer el código más legible

Pon comentarios donde sea necesario

Los strings utilizan comillas dobles, los caracteres simples.

Puedo utilizar números enteros, flotantes y más datos


La premiere mundial
printf()
formato

printf(controlString [, data]);

[, data] es opcional

ejemplo

printf("My favorite number is %d", 7); // Prints My favorite number


Secuencias de escape
Código Descripción

\n nueva línea

\r retorno de carro

\t tab horizontal

\’ comilla simple

\’’ comilla doble

\\ backslash

\b backspace
Ejemplo
Caracteres de conversión
Caracter de conversión Descripción

%d entero

%f punto flotante

%c caracter

%s cadena / string
Ejemplo
Agregando variables
Nombrando variables
Bueno Malo

myData Recomendado 12count

count12 age limit

age_limit last,first

amount
Variables
Definiendo una por línea Dos o más por línea

Almacenando variables
Con el igual todo lo de
la derecha se opera y
luego se almacena en
la variable
Agregando palabras a tu programa
Entendiendo el fin de cadena
C no tiene variables con nombre de cadena, utiliza arreglos de caracteres.

Para determinar dónde termina pone un cero al final (Null Zero, \0, ASCII 0)

Tiene longitud de 5 caracteres, pero ocupa 6 bytes en memoria por el \0


Arreglo de caracteres
char month[10] // define month de tamaño 10

char month[10] = “January”; // inicializa month con January

Siempre contamos
desde 0 no desde
1
¿Cómo cambio de mes?

para usar strcpy()


debemos agregar

#include <stdio.h>
scanf()
Formato similar al printf()

Usualmente viene después del printf()

char firstInitial;

printf("What letter does your first name begin with?\n");

scanf(" %c", &firstInitial);


Deja que C ocupe de la mate
Podemos hacer aritmética
totalSales = localSales + internationalSales - salesReturns;

Guarda el resultado en totalSales


OPERADORES ARITMÉTICOS
ORDEN DE OPERACIONES
ans = 5 + 2 * 4 / 2 % 3 + 10 - 3; // What is the answer?

Es recomendable no
hacer muchas
operaciones al mismo
tiempo
ANS = 13
Asignación compuesta
lossCount = lossCount + 1; /* Adds 1 to lossCount variable */

Lo abreviamos como

lossCount += 1;

lossCoun ++;
Funciona con otros operadores
Typecasting
Cambiamos el tipo de variable
Tomando distintos rumbos
Operadores relacionales
Ejemplos
Condicionales
if If… else
formato
if (condition)

{block of one or more C statements;}

else

{ block of one or more C statements; }


Condicionales anidadas
if (age >= 21) /* See if 21 <= age <= 65 */
{
if (age <= 65)
{
printf("The age falls between 21 and 65.\n");
}
}
Condicionales combinadas
if ((age >= 21) && (age <= 65)) {

if ((hrsWorked > 40) || (sales > 25000.00)) {

if (!(isCharterMember)) {
Podemos no usar los
paréntesis que
agrupan las
conicionales
Switch Case
Permite hacer varias
comparaciones a la vez

si no usamos break, el
switch podría seguir
ejecutando las
siguientes condiciones
Otros trucos
Operador condicional “?”
relation ? trueStatement : falseStatement;
Ejemplo
(total <= 3850.0) ? (total *= 1.10): (total *= 1.05);
es equivalente a
if (total <= 3850.0)
{ total *= 1.10; }
else
{ total *= 1.05; )
sizeof()
i = sizeof(int)
ejemplo
char name[] = "Ruth Claire";
int i = 7;
printf("The size of i is %d.\n", sizeof(i));
printf("The size of name is %d.\n", sizeof(name));
Loops
While
Condición para
ejecutarse

recuerda cambiar la
condición para no
quedar en un loop
infinito
do while
Condición para do
ejecutarse { block of one or more C statements; }
while (condition)

while evalúa la
condición al inicio y
do… while al final
for
for (startExpression; testExpression; countExpression)

{ block of one or more C statements; }

la condición del for se


evalúa al inicio
Ejemplo de for anidado
for (outer = 1; outer <= 3; outer++) La salida:
{ 12345
for (inner = 1; inner <= 5; inner++)
{ 12345
printf("%d ", inner) 12345
}
// Print a newline when each inner loop finishes
printf("\n");
}
¿una pausa y seguimos? No se usan tan
seguido

Break Continue
for (i=0; i < 10; i++) for (i = 1; i <= 10; i++)
{ {
printf("%d ", i) if ((i%2) == 1) // impar
if (i == 4) {
{ printf("I'm rather odd...\n");
break; // siguiente iteración
} continue;
} }
// Rest of program would follow. printf("Even up!\n");
}
Otros temas
Array
Existen arrays
multi-dimensionales
Marcas [5][5]
Ejemplos
char italCity[7] = "Verona"; /* Automatic null zero */

int ages[5] = {5, 27, 65, 40, 92}; // Correct


int ages[]; // Incorrect
int ages[] = {5, 27, 65, 40, 92}; // Correct
Accediendo al array
for (i=0; i<10; i++)
{
// if loop will compare each game to the current best total
// if the current score is higher, it becomes the new best
// and the counter variable becomes the new flag gmMark
if (gameScores[i] > bestGame)
{
bestGame = gameScores[i];
gmMark = i;
}
}
funciones
Podemos enviar parámetros
Si no regresa valores
void en lugar de int
return;
Variables locales y globales

hay que limitar el uso de


variables globales y
ponerlas antes del main
Incluyendo archivos
#include tiene dos formatos

#include <filename> // archivo del sistema

#include “filename” // archivo propio

Debemos poner el nombre exacto del archivo con mayúsculas y minúsculas,


aunque unos compiladores no son case sensitive
¿Qué hace el compilador al ver un include?
Copia el texto exacto del otro archivo

Los includes van antes


del main() y con ellos
llamamos a funciones
y/o constantes
Librería
Definiendo constantes
Es un valor que no cambia, el compilador lo copia y pega cada vez que
aparece

#define CONSTANT constantDefinition

Ejemplos:

Acostumbramos a
poner las constantes
No usamos el símbolo = todas en mayúsculas
Ejemplo
main.c libreria.h
Puntero
El puntero es la posición en
memoria de la variable
Podemos enviar la variables
donde queremos guardar el
resultado
Evitamos el return
Punteros
int age = 19; /* Stores a 19 in age */
int * pAge = &age; /* Links up the pointer */

Puede que en una distinta


compilación lo guarde en
distintas posiciones.
Punteros
int age; // Defines a regular integer
int * pAge; // Defines a pointer to an integer
age = 19; //Stores 19 in age
pAge = &age; // Links up the pointer

no necesitamos volver a
utilizar *, si ya fue
declarada
Dereferenciar
Actualizando el valor al que apuntamos
*pAge = 25; /* Stores 25 where pAge points */

Estos dos son equivalentes


printf("The age is %d.\n", age)
printf("The age is %d.\n", *pAge);
Resumen de punteros
Los punteros tienen más flexibilidad que los arrays y muchos
programadores dejan los arrays por punteros
Usa & para obtener la dirección de una variable
Usa * para definir una variable tipo puntero
Usa * para dereferenciar una variable (*pAge es equivalente a age)
Usa siempre el mismo tipo de dato en el puntero
Un array es un
Punteros y Arrays puntero fijo.

Éstos tres son equivalentes


printf("The first value is %d.\n", vals[0]);
printf("The first value is %d.\n", *vals);
printf("The first value is %d.\n", *(vals+0));
Punteros y char arrays
Éstos son casi equivalentes
char name[] = "Andrew B. Mayfair"; /* name points to A */
char * pName = "Andrew B. Mayfair"; /* pName points to A */
Pero el primero es un puntero constante y el segundo es un puntero
variable.
Hasta podemos usar el puntero para apuntar a otro nombre
pName = "Theodore M. Brooks";
Cuidado con una
longitud más larga
Maximizando la memoria
La memoria libre al inicio del programa se llama heap
El tamaño podría variar al iniciar el programa
La parte del heap utilizada es allocated heap
La parte libre se le llama unallocated head o free heap
Si aprovechamos el heap, no necesitamos saber antes el tamaño de
todos los datos. ie declarando un array
Si el programa necesita más espacio solo necesita asignar (allocate)
más, y al terminar necesita desasignarlo (deallocate)
Cómo asigno el espacio
Dos funciones: malloc() y free()
Recuerda usar stdlib.h
Así reservamos 10 espacios de tamaño int
int * temps; /* Will point to the first heap value */
temps = (int *) malloc(10 * sizeof(int)); /* Yikes! */
Debemos liberar el espacio
free(temps); /* Gives the memory back to the heap */
Más a profundidad
Revisemos si nos libera el espacio, devuelve 0 si falló
temps = (int *) malloc(10 * sizeof(int));
if (temps == 0)
{
printf("Oops! Not Enough Memory!\n");
exit(1); // Terminate the program early
}
Arrays y punteros para reservar más espacio
for (ctr = 0; ctr < 50; ctr++)
{
puts("¿Cuantas lecturas por ciudad?")
scanf(" %d", &num);
// asigna el espacio del heap
temps[ctr] = (int *)malloc(num * sizeof(int));
}
// liberar el heap
for (ctr = 0; ctr < 50; ctr++)
{
free(temps[ctr]);
}
Estructuras
Estructuras
Es una colección de una o más variables, de tipos
posiblemente diferentes, agrupadas bajo un solo
nombre para manejo conveniente.
Nos ayuda a organizar variables que están
relacionadas entre sí bajo un bloque en lugar de
estar separadas.
Struct
Estructuras
Declaración & inicialización de estructuras

re
no mb
re
Sob
Notas de los structs
Si utilizamos un struct en el heap, no podemos usar el operador “.”, si no
que usamos “->”
¿Static ?
¿De qué sirve static?
static cumple con dos funciones básicas dentro del lenguaje C:

Al usarlo sobre variables que están dentro de una función, permite que el
valor de las mismas persista entre llamadas

Al usarlo sobre funciones o variables de ámbito global, garantiza que dicho


elemento (variable o función) solo exista en la unidad de compilación en la
que se encuentre declarado.
Funciones con static
Otros temas que no vimos
getchar() y putchar()...pg148
isalpha() isdigit() isupper() islower() …pg 151
strcat( first,last); // first = first + last
gets() puts
#include <stdio.h>
#include <string.h>
#include <math.h>

También podría gustarte