Sie sind auf Seite 1von 7

MikroC:

Es un compilador creado por la compaa Mikroelectronika, que utiliza una variante del lenguaje C, razn por la cual
comparte su sintaxis y buena parte de las construcciones y conceptos empleados por dicho lenguaje. Por defecto, en los
nombres de variable, funcin, etiquetas, etc no se diferencian las maysculas de las minsculas, por lo que Cant y cant
son la misma variable; sin embargo, esta configuracin se puede cambiar (men Tools / Options, pestaa Output,
opcin Output Settings).

Tipos de Datos:

Tipo Descripcin Nro bits Rango


char Caracter 8 0 a 255
int Entero 16 -32768 a 32767
float Punto flotante (con decimales) 32 1.17549435082 10-38 a
6.80564774407 1038
double Punto flotante de doble precisin 32 1.17549435082 10-38 a
6.80564774407 1038

Cada uno de los tipos indicados posee una jerarqua superior al tipo que le antecede en la tabla, as, por ejemplo, en una
expresin que contenga variables int y float, el resultado ser float.

A cada tipo se le puede agregar uno de los siguientes prefijos: signed (con signo), unsigned (sin signo), short (corto),
long (largo); al utilizarlos, se puede cambiar el rango de valores y la cantidad de bits utilizados. Por ejemplo:

Tipo Descripcin Nro bits Rango


signed char Caracter 8 -128 a 128
short int Entero corto 8 0 a 255
signed long Entero largo con signo 32 -2147483648 a 2147483647
int

Sentencias y Comentarios

Toda sentencia (instruccin) debe finalizar con ;

Los comentarios de una sola lnea inician con los caracteres //. Para colocar comentarios de varias lneas, los mismos
debern estar encerrados entre los caracteres /* y */.

Variables:

Para asignar un valor a una variable se utiliza la sentencia nom_variable1 = valor1 , aunque tambin se puede utilizar
nom_variable1 = expresion1 , estando en cursiva el texto que el programador deber sustituir a su conveniencia.

Toda variable deber declararse, para ello, se utiliza la sentencia tipo_datos1 nom_variable1 , aunque tambin se puede
utilizar tipo_datos2 nom_variable2 = expresion1 , esta ltima, adems de declarar la variable, le asigna un valor inicial.

El nombre de la variable slo puede contener letras del alfabeto, nmeros y guin bajo ( _ ), y no deben comenzar con
un nmero.

En caso que no se declare una variable, el compilador la tratar como signed int.

Prof. Luis Llave


Ejemplos:
short int cuenta; // declaracin de variable, luego habr que asignarle valor inicial
unsigned long int tope = 10; // declaracin de variable con asignacin de valor inicial
int contador = sumatoria = 0; /* con esta instruccin se declaran las variable contador y
sumatoria, y a ambas se le asigna el valor 0 */

Palabras Reservadas:

Las siguientes palabras no se pueden utilizar como nombres de variable o etiquetas, debido a que ya poseen un
significado particular en MikroC.

absolute data if return typedef


asm default inline rx typeid
at delete int sfr typename
auto do io short union
bit double long signed unsigned
bool else mutable sizeof using
break enum namespace static virtual
case explicit operator struct void
catch extern org switch volatile
char false pascal template while
class float private this
code for protected throw
const friend public true
continue goto register try

Las palabras reservadas siempre deben escribirse en minsculas, no importa la configuracin establecida (diferenciar o
no las maysculas de las minsculas).

Constantes:

Son similares a las variables, slo que su valor no cambiar dentro del programa, por lo cual no se almacenan en la
memoria de datos del PIC. La sintaxis para su declaracin es: const nom_constante1 = valor1. En los siguientes
ejemplos se aprovechar para indicar cmo especificar valores hexadecimales, caracter, punto flotante, etc; dichos
valores se pueden usar en asignacin de variables.

Ejemplo:
const MENOR = 255; // definicin de contante tipo entero
const factor1 = 5.86; // definicin de constante tipo punto flotante
const tope = 0x2E; // valor hexadecimal 2E
const total = 024; // valor octal 24
const masc = 0b00111100; // valor binario 00111100
const elem = 3.7E-2; // valor 0.037
const orden = 'A'; // definicin de constante tipo caracter
const msg = Debe soltar el pulsador; // definicin de contante tipo cadena de caracteres

Constantes tipo enumerado:

Representan una variante del tipo entero, se utilizan para hacer ms legible el cdigo, ya que se utilizarn los nombres
definidos en lugar de usar nmeros. Su sintaxis es: enum nom_tipoenum {valor1, valor2, valor3, valor4, valor5};
donde valor1 equivale a 0, valor2 equivale a 1, valor3 equivale a 2 y as sucesivamente.

Ejemplo:
enum motors {up, down, left, right}; // up equivale a 0, down equivale a 1, etc
Prof. Luis Llave
enum colors {black, red, green=4, blue, white=8}; /* black equivale a 0, red equivale 1,
green equivale 4, blue equivale 5 */
enum dias {lun=1, mar, mie, jue, vie, sab, dom} dia_a; // declaracin de variable dia_a, de tipo dias

Operadores Aritmticos y de Bits:

Ejemplos:
res = a+b // almacenar en res la suma de a con b
res = a-b // almacenar en res la resta de a menos b
res = a*b // almacenar en res la multiplicacin de a con b
res = a/b // almacenar en res la divisin de a entre b
res = a%b // almacenar en res el residuo de la divisin de a entre b
res += 3 // equivale a res = res+3
res -= 3 // equivale a res = res-3
res *= 3 // equivale a res = res*3
res /= 3 // equivale a res = res/3
res %= 3 // equivale a res = res%3
res++ // equivale a res = res+1, se efecta de ltimo, si hay otras expresiones en la instruccin
++res // equivale a res = res+1, se efecta de primero, si hay otras expresiones en la instruccin
res-- // equivale a res = res-1, se efecta de ltimo, si hay otras expresiones en la instruccin
--res // equivale a res = res-1, se efecta de primero, si hay otras expresiones en la instruccin
res = a & b // almacenar en res el resultado de efectuar la operacin and (bit a bit) con a y b
res = a | b // almacenar en res el resultado de efectuar la operacin or (bit a bit) con a y b
res = a ^ b // almacenar en res el resultado de efectuar la operacin xor (bit a bit) con a y b
res = ~a // almacenar en res el resultado de efectuar la operacin not (bit a bit) con a
res = a << 5 // almacenar en res el resultado de efectuar shift left de 5 bits sobre a
res = a << 5 // almacenar en res el resultado de efectuar shift right de 5 bits sobre a

Operadores Relacionales y Lgicos:

Se utilizan para construir expresiones lgicas (aquellas que generan un valor True o False).

> para establecer una relacin 'mayor que'


< para establecer una relacin 'menor que'
>= para establecer una relacin 'mayor o igual que'
<= para establecer una relacin 'menor o igual que'
== para establecer una relacin 'igual que'
!= para establecer una relacin 'diferente a' ('no igual que')
&& para establecer una relacin and entre expresiones
|| para establecer una relacin or entre expresiones
! para establecer una relacin not sobre una expresin

Estructuras de programacin:

if (expresion1)
instruccion1
else
instruccion2

Nota: se pueden omitir la parte del else, en caso que no se requiera.

En caso que se deban colocar ms de una instruccin donde dice instruccion1 instruccion2, se deben encerrar las
instrucciones necesarias entre llaves, de la siguiente forma:

Prof. Luis Llave


if (expresion1)
{
instruccion1
...
}
else
{
instruccion50
...
}
switch (expresion1)
{
case valor1: instruccion1; break;
case valor2: instruccion2;
instruccion3;
break;
...
default: instruccionk;
}

La seccin default: se puede omitir. Si se omite la instruccin break, despus de ejecutar las instrucciones asociadas a
un caso, se ejecutarn las instrucciones del siguiente caso que aparece en el cdigo, sin importar que al evaluar
expresion1 no se obtenga el valor correspondiente a ese caso.

while (expresion1)
{
instruccion1;
instruccion2;
...
}

for (inicio; condicion; modificacion)


{
instruccion1;
instruccion2;
...
}

inicio, condicion y modificacion son expresiones utilizadas para indicar la inicializacin de la variable de control del
ciclo, la condicin para ejecutar el ciclo, y cmo se modificar la variable de control del ciclo.

do
{
instruccion1;
instruccion2;
...
} while (expresion1)

Es posible ejecutar cdigo en assembler, mediante la sintaxis:


asm
{
instruccion_assembler1
instruccion_assembler2
}
Prof. Luis Llave
Arreglos:

Se declaran con la sintaxis: tipo1 nombre_arreglo1 [cantidad_elementos1]

Ejemplos:
int v_num[20]; // declaracin de un arreglo de enteros, de 20 elementos
int m_num[10][30]; // declaracin de un arreglo de enteros, de 10 filas y 30 columnas
int v2[5] = {12,66,8,91,17}; // declaracin de array de 5 elementos, con inicializacin
int m1[3][2] = {{5,19},{8,41},{10,3}}; // declaracin de array de 3x2, con inicializacin

Manejo de Bits:

Se puede acceder a un bit de un registro o variable, de la siguiente forma:

PORTC.B4 = 1; // asigna el valor 1 al bit 4 del registro PORTC


PORTC.F4 = 1; // asigna el valor 1 al bit 4 del registro PORTC
PORTC.RC4 = 1; // asigna el valor 1 al bit 4 del registro PORTC

Para algunos casos, como el bit GIE del registro INTCON, puede utilizarse: GIE_bit = 1;

Adems, pueden definirse variables tipo bit, de la siguiente forma:

bit bandera; // definicin de una variable tipo bit

extern sfr sbit sw_inicio; // esto se puede colocar al principio del programa
sbit sw_inicio at PORTA.B3; // esto se puede colocar en el programa principal
// para vincular sw_inicio con RA3

extern sbit paridad; // en caso de usar una variable y no un registro ya definido en el pic, no se coloca sfr
int cantidad; // declaracin de la variable cantidad
sbit paridad at cantidad.B0; // se vincula paridad con el bit 0 de cantidad

Las variables bit tienen las siguientes restricciones: no se pueden inicializar en su declaracin, no pueden formar parte
de estructuras o uniones.

Punteros:

Son variables que contienen la direccin de otra variable, se utiliza principalmente con variables de tipo caracter. Para
referirse al contenido de la variable apuntada por el puntero, se utiliza la sintaxis: *nombre_puntero; para referirse a la
direccin de una variable, se utiliza la sintaxis: &nombre_variable.

Ejemplos:
unsigned int *resultado; // se define el puntero, como uno que apunta a una variable tipo entero sin signo
resultado = &numero; // se le asigna al puntero la direccin de la variable numero
*resultado = 8; /* se cambia a 8 el valor de la variable apuntada por el puntero
si se coloca: resultado = 8; se estara asignado el 8 como la direccin de la variable
a la cual apunta el puntero */

Funciones:

Se utiliza la siguiente sintaxis:

tipo_del_resultado nombre_funcion(tipo1 param1, tipo2 param2)


{
instruccion1;
Prof. Luis Llave
instruccion2;
...
}

Ejemplo:
int mayor_de_dos(int num1, int num2)
{
int mayor; // declaracin de la variable mayor
if (num1>num2)
mayor = num1;
else
mayor = num2;
return mayor; // indica el valor que retornar la funcin
}

En un programa, se podra utilizar esta funcin mediante la siguiente instruccin: t = mayor_de_dos(15, 20);

Estructura Programa para PIC:

Un programa para PIC tiene la siguiente estructura:

// declaracin de variables y constantes globales, a utilizarse en la ISR y el programa principal


void interrupt(){ // esto corresponde a la ISR, siempre debe colocarse as
instruccion1;
instruccion2;
instruccion3;
...
}
// declaracin de variables y constantes globales a utilizarse en el programa principal
void main() { // equivale al programa principal, siempre debe colocarse as
// declaracin de variables y constantes locales al programa principal
// configuraciones
instruccion1;
instruccion2;
instruccion3;
...
}

Durante todo el cdigo del programa, se encuentran disponibles los nombres de los registros del PIC utilizado, como si
fuesen variables ya definidas.

Cuando se ejecuta la funcin interrupt, el MikroC automticamente agrega las instrucciones necesarias para preservar
los valores de los registros W, STATUS, FSR y PCLATH; esto es vlido solamente en PIC12 y PIC16 (en PIC18 el
comportamiento es distinto).

mbito de variables y constantes:

Una variable o constante tiene validez desde el momento en que se declara y hasta que finaliza el bloque de
instrucciones (funcin) que contiene dicha declaracin. En ese sentido, se habla de variables globales, cuando las
mismas se han declarado fuera de cualquier funcin, por lo cual estn disponibles para cualquiera de ellas; y se habla
de variables locales, cuando las mismas se declaran dentro de una funcin, por lo cual slo tendrn validez dentro de
tal funcin.

Adicionalmente, si una variable local se declara como static, el ltimo valor que se le ha asignado se mantiene hacia la
siguiente ejecucin de la funcin en cuestin, es decir, los valores se preservan entre sucesivas ejecuciones de la
Prof. Luis Llave
funcin.

En MikroC se dispone de algunas rutinas interesantes, como las necesarias para implementar un retardo de K ms K
microseg, las cuales son: Delay_ms(K) y Delay_us(K), respectivamente. Este par de rutinas se pueden colocar en
cualquier parte, sin necesidad de alguna declaracin previa. Por otra parte, existen diferentes rutinas que facilitan al
gunas operaciones y el manejo de los recursos del PIC, como conversiones entre distintos tipos de datos, el uso del
convertidor ADC, el uso del mdulo para PWM, el uso del mdulo de comunicacin serial, etc. Cada tipo de rutina
pertenece a una librera, las cuales pueden habilitarse mediante el Library Manager de MikroC (men View).

Ejemplo de un programa para el PIC16F887:

// definiciones globales
const masc = 0b00001111;
extern sfr sbit sw_leer;
extern sfr sbit sw_fin;
sbit sw_leer at PORTA.B5; // asociar al pin RA5
sbit sw_limpiar at PORTA.B6; // asociar al pin RA6

void main() { // programa principal


// definiciones locales
int Num1;
// configuraciones
TRISA = 0xFF; // puerto A como entrada
TRISC = 0; // puerto C como salida
ANSEL = ANSELH = 0; // deshabilitar entradas analgicas
INTCON = 0;
while (1) // esto genera un ciclo infinito
{
if (sw_leer == 0) // si se cierra el switch de leer
{
Num1 = PORTA & masc;
PORTC = ~Num1; // se muestra Complemento_a_uno(numero_leido)
PORTC.B7 = 1; // enciende led abrir_switch
while (sw_leer == 1)
{} // esperar a que se abra el switch
PORTC.B7 = 0; // apaga led abrir_switch
}
if (sw_limpiar == 0)
{
PORTC = 0;
PORTC.B7 = 1; // enciende led abrir_switch
while (sw_limpiar == 1)
{} // esperar a que se abra el switch
PORTC.B7 = 0; // apaga led abrir_switch
Delay_ms(500); // espera medio segundo
}
}
}

Prof. Luis Llave

Das könnte Ihnen auch gefallen