Products

Solutions

Store

Distributors

Libstock

C ontact Us

se arch he re

Login | C art (0)

Programación de los microcontroladores - Microcontroladores PIC – Programación en C con ejemplos
TOC Capitulo 1 Capitulo 2 Capitulo 3 Capitulo 4 Apéndice A

Featured Development Tools EasyPIC v7 Development System

Capitulo 2 - Programación de los microcontroladores
Usted seguramente sab e que no es suficiente sólo conectar el microcontrolador a los otros componentes y encender una fuente de alimentación para hacerlo funcionar, ¿verdad? Hay que hacer algo más. Se necesita programar el microcontrolador. Si cree que esto es complicado, está equivocado. Todo el procedimiento es muy simple. Basta con leer el texto para entender de lo que estamos hab lando.

2.1 LENGUAJES DE PROGRAMACIÓN 2.2 CARACTERÍSTICAS PRINCIPALES DEL MIKROC 2.3 TIPOS DE DATOS EN MIKROC 2.4 VARIABLES Y CONSTANTES 2.5 OPERADORES 2.6 ESTRUCTURAS DE CONTROL 2.7 TIPOS DE DATOS AVANZADOS 2.8 FUNCIONES 2.9 CARACTERÍSTICAS PRINCIPALES DEL PREPROCESADOR 2.10 MIKROC PRO FOR PIC 2.11 PROGRAMAR LOS PIC UTILIZANDO MIKROC PRO FOR PIC

EasyPIC v7 is top selling PIC Development Board for 250 Microchip PIC MCUs in DIP packaging. It features USB 2.0 programmer/debugger and over 17 essential modules necessary in development. Board comes w ith PIC18F45K22. [more info]

Featured Compilers mikroC PRO for PIC

2.1 LENGUAJES DE PROGRAMACIÓN
El microcontrolador ejecuta el programa cargado en la memoria Flash. Esto se denomina el código ejecutable y está compuesto por una serie de ceros y unos, aparentemente sin significado. Dependiendo de la arquitectura del microcontrolador, el código binario está compuesto por palabras de 12, 14 o 16 bits de anchura. Cada palabra se interpreta por la CPU como una instrucción a ser ejecutada durante el funcionamiento del microcontrolador. Todas las instrucciones que el microcontrolador puede reconocer y ejecutar se les denominan colectivamente Conjunto de instrucciones. Como es más fácil trabajar

Popular PIC m icocontrollers are loved by hobbyists and 8-bit geeks. m ikroC

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

con el sistema de numeración hexadecimal, el código ejecutable se representa con frecuencia como una serie de los números hexadecimales denominada código Hex. En los microcontroladores PIC con las palabras de programa de 14 bits de anchura, el conjunto de instrucciones tiene 35 instrucciones diferentes.

helps you bring your ideas to life easy as never before. [more info]

LENGUAJE ENSAMBLADOR
Como el proceso de escribir un código ejecutable era considerablemente arduo, en consecuencia fue creado el primer lenguaje de programación denominado ensamblador (ASM). Siguiendo la sintaxis básica del ensamblador, era más fácil escribir y comprender el código. Las instrucciones en ensamblador consisten en las abreviaturas con significado y a cada instrucción corresponde una localidad de memoria. Un programa denominado ensamblador compila (traduce) las instrucciones del lenguaje ensamblador a código máquina (código binario).

HEste programa compila instrucción a instrucción sin optimización. Como permite controlar en detalle todos los procesos puestos en marcha dentro del chip, este lenguaje de programación todavía sigue siendo popular.

Ventajas de lenguajes de programación de alto nivel
A pesar de todos los lados buenos, el lenguaje ensamblador tiene algunas desventajas:

Incluso una sola operación en el programa escrito en ensamblador consiste en muchas instrucciones, haciéndolo muy largo y difícil de manejar. Cada tipo de microcontrolador tiene su propio conjunto de instrucciones que un programador tiene que conocer para escribir un programa Un programador tiene que conocer el hardware del microcontrolador para escribir un programa
Programa escrito en C (El mismo programa compilado al código ensamblador):

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Los lenguajes de programación de alto nivel (Basic, Pascal, C etc.) fueron creados con el propósito de superar las desventajas del ensamblador. En lenguajes de programación de alto nivel varias instrucciones en ensamblador se sustituyen por una sentencia. El programador ya no tiene que conocer el conjunto de instrucciones o características del hardware del microcontrolador utilizado. Ya no es posible conocer exactamente cómo se ejecuta cada sentencia, de todas formas ya no importa. Aunque siempre se puede insertar en el programa una secuencia escrita en ensamblador. Si alguna vez ha escrito un programa para un microcontrolador PIC en lenguaje ensamblador, probablemente sepa que la arquitectura RISC carece de algunas instrucciones. Por ejemplo, no hay instrucción apropiada para multiplicar dos números. Por supuesto, para cada problema hay una solución y éste no es una excepción gracias a la aritmética que permite realizar las operaciones complejas al

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

así que el mismo código se puede utilizar muchas veces en diferentes proyectos.. Las características de C pueden ser muy útiles al programar los microcontroladores.). basta con escribir a*b. + a). 2. la multiplicación se puede sustituir con facilidad por adición sucesiva (a x b = a + a + a + . Ya estamos en el comienzo de una historia muy larga. No hay que preocuparse al utilizar uno de estos lenguajes de programación de alto nivel como es C. Lenguaje C El lenguaje C dispone de todas las ventajas de un lenguaje de programación de alto nivel (anteriormente descritas) y le permite realizar algunas operaciones tanto sobre los bytes como sobre los bits (operaciones lógicas.2 CARACTERÍSTICAS PRINCIPALES DEL MIKROC A continuación vamos a presentar a los elementos principales del lenguaje mikroC desarrollado por Mikroelektronika. C es un lenguaje compilado.com ... En este caso. C está estandarizado (el estándar ANSI). es muy portable. lo que significa que los archivos fuentes que contienen el código C se traducen a lenguaje máquina por el compilador. porque el compilador encontrará automáticamente la solución a éste problema y otros similares. desplazamiento etc.. Lo que lo hace accesible para cualquiera que conozca este lenguaje sin reparar en el propósito de uso del microcontrolador. Además. Para multiplicar los números a y b. La figura anterior es un ejemplo general de lo que sucede durante la compilación de programa de un lenguaje de programación de alto nivel a bajo nivel.descomponerlas en un gran número operaciones más simples. Este lenguaje es open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Todas estas características hicieron al C uno de los lenguajes de programación más populares.

el compilador se utiliza para la programación de los microcontroladores PIC. definición de constantes y macros etc.dbg). Por con. un proyecto puede contener más de un archivo fuente y el programador puede utilizar funciones predefinidas y agrupadas dentro de los archivos denominados librerías. El enlazador (linker) recupera toda la información requerida para ejecutar el programa de los archivos externos y la agrupa en un solo archivo (.muy similar al C estándar. Además. Es el archivo que se va a cargar en el microcontrolador. el generador . Aquí vamos a presentar características específicas del lenguaje mikroC en la programación de los microcontroladores PIC. mientras que las demás son la consecuencia de la limitación de la arquitectura del hardware de los PIC.hex. Por último.hex produce un archivo . Más tarde vamos a describir estas directivas en detalle.mcl. Este libro describe una aplicación muy concreta del lenguaje de programación C utilizado en el compilador mikroC PRO for PIC. Algunas de estas diferencias se refieren a las mejoras. no obstante en determinados aspectos difiere del ANSI estándar en algunas características.com . El preprocesador se utiliza automáticamente por el compilador al iniciarse el proceso de la compilación. un conocimiento básico del funcionamiento puede ser útil para entender el concepto del lenguaje mikroC. lo que facilita el proceso. Luego. El analizador sintáctico (parser) elimina toda la información inútil del código (comentarios. destinadas a facilitar la programación de los microcontroladores PIC. espacios en blanco). El compilador busca las directivas del preprocesador (que siempre empiezan por ‘#’) dentro del código y modifica el código fuente de acuerdo con las directivas. En este caso. FASES DE COMPILACIÓN El proceso de compilación consiste en varios pasos y se ejecuta automáticamente por el compilador. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. el compilador traduce el código a un archivo binario denominado archivo . El término C se utilizará para referirse a las características comunes de los lenguajes C y mikroC. El archivo fuente contiene el código en mikroC que usted escribe para programar el microcontrolador. En esta fase se llevan a cabo inclusión de archivos.

Supongamos que es necesario escribir un programa para el microcontrolador para medir la temperatura y visualizar los resultados en un LCD. ESTRUCTURA DE PROGRAMA La idea principal de escribir un programa en C es de “romper” un problema mayor en varios trozos más pequeños. podemos decir que la función main() es obligatoria. Los lenguajes de programación de alto nivel como es C le permiten solucionar este problema con facilidad al escribir cuatro funciones que se ejecutarán cíclicamente sin parar.El proceso entero de la compilación que incluye todos los pasos anteriormente descritos se le denomina “b uilding”. 2. Esto es la primera función a ser ejecutada al iniciarse la ejecución de programa. Las otras funciones se pueden llamar dentro de la función main. Medir el valor analógico. Activar y configurar el convertidor A/D incorporado. Si todavía no ha escrito un programa en C.com . ¡Y ahora. acéptelo tal como es por el momento y más tarde entenderá la sintaxis. No se preocupe. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Calcular temperatura. El proceso de medición se realiza por un sensor que convierte temperatura en voltaje. de las que cada una corresponde a una acción específica: 1. y 4. La idea general es de dividir el problema en varios trozos. En otras palabras. señalando las partes en las que consiste. el programa se divide en cuatro partes. su primer programa ‘real’! La figura muestra la estructura de programa. de los que cada uno se puede escribir como una sola función. es probable que todo le resulte confuso. mientras que las demás son opcionales. Enviar los datos en el formato apropiado al LCD. En consecuencia. Todos los programas escritos en mikroC contienen por lo menos una función llamada main() que encierra entre llaves {} las sentencias a ser ejecutadas. El microcontrolador utiliza el convertidor A/D para convertir este voltaje (valor analógico) en un número (valor digital) que luego se envía al LCD por medio de varios conductores. 3.

La manera de escribir el código en C es muy importante. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. señalando las partes en las que consiste. C difiere entre minúsculas y mayúsculas. Además. así el compilador puede aislarlas y traducirlas a código máquina.’. Por ejemplo. En C todas las sentencias deben terminar con un punto y coma ‘. su primer programa ‘real’! La figura muestra la estructura de programa.¡Y ahora. note que dos líneas del código dentro de la función terminan con un punto y coma.com . así que la función main() no se puede escribir MAIN() o Main().

com .open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.

.17549435082·10.. Con frecuencia es necesario mejorar. Por eso. 2. Aunque los comentarios no pueden afectar a la ejecución de programa. es imposible alcanzar una mayor precisión de datos que la del tipo float.. actualizar. Aquí está el porqué. Hay dos tipos de tales caracteres. T I P O DE DA T O char int float T A M A ÑO ( NÚM ERO DE BI T S ) 8 16 32 DES C RI P C I Ó N Texto (caracteres) Valores enteros Valores en punto flotante Valores en punto flotante de doble precisión RA NG O DE V A L O RES de 0 a 255 de -32768 a 32767 de ±1. modificar.com . T I P O DE DA T O char T I P O DE DA T O C O N P REF I J O signed char T A M A ÑO ( NÚM ERO DE BI T S ) 8 RA NG O DE V A L O RES de -128 a 128 de 0 a 65535 open in browser PRO version unsigned int 16 Are you a developer? Try out the HTML to PDF API pdfcrowd. mientras que los de tipo char son sin signo. Esto permite al compilador conocer el tamaño de dato (número de bytes requerido en la memoria) y su representación. El calificador signed (con signo) indica que el dato puede ser positivo o negativo. Por defecto.80564774407·103 8 double 32 *Debido a las limitaciones impuestas por el hardware del microcontrolador. son tan importantes como cualquier otra parte de programa.3 TIPOS DE DATOS EN MIKROC En el lenguaje C.3 8 a ±6. Note que el prefijo es opcional..COMENTARIOS Los comentarios son las partes del programa utilizados para aclarar las instrucciones de programa o para proporcionar más información al respecto. el rango de sus posibles valores cambia así como el número de los bytes de memoria necesarios. Al añadir un prefijo (calificador) a cualquier tipo de dato entero o carácter. o sea. simplificar un programa. El prefijo unsigned indica que el dato puede ser sólo positivo. mientras que otros designan los comentarios cortos que caben en una sola línea //.80564774407·103 8 de ±1. No es posible interpretar incluso los programas simples sin utilizar los comentarios. cada dato utilizado en el programa debe tener su tipo especificado..3 8 a ±6. el tipo double en mikroC equivale al tipo float. El compilador no hace caso a los comentarios y no los compila al código ejecutable.17549435082·10. los datos tienen un tipo. los datos de tipo int son con signo. Hay varios tipos de datos que se pueden utilizar en el lenguaje de programación mikroC dependiendo del tamaño de dato y del rango de valores. Dicho de manera sencilla. Unos designan los comentarios largos que ocupan varias líneas de programa marcados por la secuencia especial /*.. La tabla muestra el rango de valores que los datos pueden tener cuando se utilizan en su forma básica. el compilador es capaz de reconocer los caracteres especiales utilizados para designar dónde los comentarios comienzan y terminan y no hace nada de caso al texto entre ellos durante la compilación.*/.

D.0 * 10^10 0. Los enteros octales empiezan con 0. Por ejemplo: ‘056’. E. Por ejemplo: ‘0x1A’. Un dato float es siempre consigno (signed). Por ejemplo: 569.0 -1.23 23. -25.23 23.09E34 // // // // // // = = = = = = 0.0 * 10^-5 3. Decimal (base 10): el número consiste en los dígitos (de 0 a 9). El primer dígito no puede ser 0. -1.short int int signed short int long int signed long int 8 8 32 32 de 0 a 255 de -128 a 127 de 0 a 4294967295 de -2147483648 a 2147483647 Tipo entero (int) Un entero es un número sin parte fraccionaria que puede estar expresado en los siguientes formatos: Hexadecimal (base 16): el número empieza con 0x (o 0X). En este formato. se puede introducir el signo de número (‘+’ o ‘-’). Por ejemplo: 0B10011111 0x11 11 -152 011 0b11 // // // // // formato formato formato formato formato hexadecimal equivale a decimal 17 decimal decimal octal equivale a decimal 9 binario equivale a decimal 3 Tipo punto flotante (float) El tipo punto flotante (float) se utiliza para los números reales con el punto decimal. 0. Binario: cuando un entero empieza con 0b (o 0B) se representan como una serie de bits (‘0’ y ‘1’).com .09 * 10^34 Are you a developer? Try out the HTML to PDF API open in browser PRO version pdfcrowd. F).45e6 2e-5 3E+10 . Los datos de tipo float se pueden representar de varias maneras. Los enteros hexadecimales consisten en los dígitos (de 0 a 9) y/o las letras (A.45 * 10^6 2. +1500. C. Octal (base 8): los números se representan a base 8 utilizando sólo 8 dígitos (de 0 a 7). B.

No obstante. por ejemplo: "Presione el botón RA0" 2. En mikroC.Tipo carácter (char) El tipo char es considerado como un entero por el compilador. Las cadenas están encerradas entre comillas dobles. así que no es necesario especificar el tipo adicionalmente.).com . En la primera línea del programa se define el tipo de variable */ int a = 1000. que significa que es necesario especificar el tipo de dato que se le asigna a una variable (int.4 VARIABLES Y CONSTANTES Definiciones Una variable es un objeto nombrado capaz de contener un dato que puede ser modificado durante la ejecución de programa. En C. las constantes se almacenan en la memoria Flash del microcontrolador para guardar el mayor espacio posible de memoria RAM. Las variables se almacenan en la memoria RAM y el espacio de memoria que ocupan (en bytes) depende de su tipo. 59 // entero 'p' // carácter ASCII 'p' Una secuencia de caracteres es denominada cadena (string). /* dos líneas de programa consecutivas */ open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Un dato de tipo carácter está encerrado entre comillas y codificado en un carácter ASCII. las variables tienen tipo. float etc. /* dos líneas de programa consecutivas. se utiliza normalmente para los datos de tipo carácter. el compilador reconoce automáticamente el tipo de dato de una constante. A diferencia de las variables. // Variable a es de tipo int y equivale a 1000 a = 15. // a equivale a 15 Una constante tiene las mismas características que una variable excepto el hecho de que su valor asignado no puede ser cambiado durante la ejecución de programa. El compilador las reconoce por el nombre y el prefijo const.

Sin embargo. Los nombres de funciones y variables se escriben con frecuencia con minúsculas. hay varias restricciones: Los identificadores pueden incluir cualquiera de los caracteres alfabéticos A-Z (a-z).P A L A BRA S C L A V E absolute asm at auto bit bool break case catch char class code const data default delete do double else enum explicit extern false float for if inline int io long mutable namespace operator org pascal private protected return rx sfr short signed sizeof static struct switch template this throw true typedef typeid typename union unsigned using virtual void volatile while open in browser PRO version friend public Are you a developer? Try out the HTML to PDF API pdfcrowd. mientras que los nombres de constantes se escriben con mayúsculas. los identificadores pueden ser tan largos como quiera. // ¡ERROR! no se puede modificar el valor de la constante Cada variable o constante debe tener un identificador que lo distingue de otras variables y constantes. a y A son identificadores. porque son las palabras reservadas del compilador. Reglas para nombrar En mikroC. El compilador es sensible a la diferencia entre minúsculas y mayúsculas. Los identificadores no pueden coincidir con las palabras clave del lenguaje mikroC. Los identificadores no pueden empezar con un dígito. Refiérase a los ejemplos anteriores.const A = 1000 // el valor de la constante A está definido A = 15.com . El compilador mikroC reconoce 33 palabras clave: M I KRO C . los dígitos 0-9 y el carácter subrayado '_'.

El compilador las reconoce como números en la memoria RAM sin conocer su tamaño y formato. Como las variables se almacenan en la memoria RAM. Al escribir un programa. Esto no es un paso obligatorio. variable2. sino ‘una cuestión de buenas costumbres’.07. es necesario reservar el espacio para ellas (uno.com . // Declarar una variable llamada peso open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.04 nombre de variable // // // // // // // // // // // OK OK OK OK OK OK NO NO NO NO NO ------ no no no no no puede empezar con un número pueden contener caracteres especiales puede coincidir con una palabra reservada puede contener caracteres especiales (punto) puede contener espacio en blanco Declaración de variables Cada variable debe ser declarada antes de ser utilizada en el programa. usted sabe qué tipo de datos quiere utilizar y qué tipo de datos espera como resultado de una operación. Para mejorar la legibilidad de código. No se olvide de que el programa maneja las variables con los nombres asignados. a las variables se les asignan con frecuencia los valores iniciales justamente enseguida de su declaración. Aparte del nombre y del tipo. <tipo> variable1. mientras que el compilador no lo sabe. variable3. las variables se declaran con frecuencia al principio de las funciones: <tipo> variable.const continue friend goto public register true try Ejemplos de los identificadores válidos e inválidos: temperatura_V1 Presión no_corresponder dat2string SuM3 _vtexto 7temp %más_alto if j23. dos o más bytes). Se parece a lo siguiente: unsigned int peso. Es posible declarar más de una variable de una vez si tienen el mismo tipo.

peso = 20. // constante carácter I_CLASS const Mensaje = "Presione el botón IZQUIERDA". Por otra parte. Tenga cuidado de no declarar la misma variable otra vez dentro de la misma función. peso1 no se puede representar con un número con punto decimal o un número con valor negativo. Por defecto. En el ejemplo anterior. siempre piense en los valores que la variable tendrá que contener durante la ejecución de programa.com . el proceso se puede simplificar: unsigned int peso1 = peso2 = peso3 = 20. las constantes deben ser inicializadas a la vez que se declaran. // Declarar constante MINIMUM Las constantes pueden ser de cualquier tipo. // constante de cadena Mensaje Las constantes de enumeración son un tipo especial de constantes enteras que hace un programa más comprensible al asignar los números ordinales a las constantes. // Asignar el valor 20 a la variable peso Un método más rápido se le denomina declaración con inicialización (asignación de los valores iniciales): unsigned int peso = 20. Dos siguientes declaraciones son equivalentes: const int MINIMUM = -100. el valor 0 se asigna automáticamente a la primera constante entre llaves. no es obligatorio especificar el tipo de constante al declararla. Puede modificar el contenido de una variable al asignarle un nuevo valor tantas veces que quiera Al declarar una variable. El compilador reconoce las constantes por su prefijo const utilizado en la declaración. // constante de punto flotante T_MAX const I_CLASS = 'A'. Declaración de constantes Similar a las variables. las constantes deben ser declaradas antes de ser utilizadas en el programa.260E1. int valor_inicial = un_mínimo_de_petróleo = 0. // peso está declarado y su valor es 20 Si hay varias variables con el mismo valor inicial asignado. En mikroC. el valor 1 a la open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. incluyendo cadenas: const T_MAX = 3. // Declarar constante MINIMUM const MINIMUM = -100.

Las variables y constantes pueden ser globales o locales. Velocidad_de_ascensor = NORMAL. Vea el siguiente ejemplo: enum surtidores {AGUA. después se reinicia a partir del valor asignado. El incremento se detiene al asignar un valor a un elemento de matriz.com . Un identificador tiene significado si el compilador lo puede reconocer. // Variable b equivale a 5 Ámbito de variables y constantes Una variable o una constante es reconocida por el compilador en base de su identificador. // AGUA = 0.MÁXIMO}. // AGUA = 0. // Variables a y b son de tipo positivo a = 10.segunda. El ámbito de una variable o una constante es el rango de programa en el que su identificador tiene significado.INICIO. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. El ámbito es determinado por el lugar en el que se declara una variable o una constante. mientras que una variable local se declara dentro del cuerpo de la función o dentro de un bloque anidado en una función. Una variable global se declara en el código fuente.CLORO}. GASÓLEO = 1. enum surtidores {AGUA. // Velocidad_de_ascensor = 2 Definir los nuevos tipos de datos La palabra clave typedef le permite crear con facilidad los nuevos tipos de datos. GÁSOLEO = 0.GASÓLEO. CLORO = 1 Las constantes de enumeración se utilizan de la siguiente manera: int Velocidad_de_ascensor enum motor_de_ascensor {PARADA. fuera de todas las funciones. // Variable a equivale a 10 b = 5. CLORO = 2 Es posible introducir directamente el valor de una constante dentro de la lista de enumeraciones.GASÓLEO=0. Todas las variables y constantes que pensamos utilizar en un programa deben ser declaradas anteriormente en el código. Una variable o una constante es invisible fuera de su ámbito. Intentar acceder a una variable o una constante fuera de su ámbito resulta en un error.b. el valor 2 a la tercera etc. // positivo es un sinónimo para el tipo sin signo int positivo a.NORMAL.CLORO}. typedef unsigned int positivo.

Por ejemplo. Las constantes se declaran normalmente en el inicio del código fuera de cualquier función (como variables globales). Un b loque compuesto es un grupo de declaraciones y sentencias (que pueden ser b loques tamb ién) encerradas entre llaves. Esto significa que son visibles dentro de su bloque a excepción de las constantes globales (declaradas fuera de cualquier función). Aunque las constantes no pueden ser modificadas en el programa. En mikroC se pueden utilizar diferentes clases de almacenamiento: open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Sin emb argo. El ámbito de variables locales está limitado por el bloque encerrado entre llaves {} en el que han sido declaradas. Clases de almacenamiento Las clases de almacenamiento se utilizan para definir el ámbito y la vida de variables.A las variables globales se les puede acceder de cualquiera parte en el código. una estructura de control etc. aún dentro de las funciones con tal de que sean declaradas. Un b loque puede ser una función. A las variables locales declaradas en main() no se les puede acceder desde la Función_1 y al revés.com . constantes y funciones dentro de un programa. Refiérase al ejemplo anterior. siguen las mismas reglas que las variables. si están declaradas en el principio del cuerpo de función (igual que en la función main) su ámbito está entre el punto de declaración y el fin de esa función. o sea. las variab les declaradas fuera del ámb ito todavía son visib les. El ámbito de una variable global está limitado por el fin del archivo fuente en el que ha sido declarado. ‘existe’ sólo dentro del b loque. Una variab le declarada dentro de un b loque se considera local.

hello(). Especifica que una variable es visible dentro del archivo. Esto le permite utilizar una variable. } open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com . El File_1 utiliza una variable y una función declaradas en File_2. . así que se utiliza raramente. En los siguientes ejemplos. void hello(){ // Modificaciones que afectan a la . para compilar y enlazar este archivo correctamente. static es una clase de almacenamiento por defecto para las variables globales. extern: la palabra clave extern se utiliza cuando el programa está compuesto por diferentes archivos fuente. una constante o una función declarada en otro archivo. // cnt en File_1 son visibles aquí . Se utiliza para definir que una variable local tiene duración local. La clase de almacenamiento auto no se puede utilizar con variables globales. el mismo debe ser incluido en su proyecto.auto es una clase de almacenamiento por defecto para las variables locales. A las variables locales declaradas con el prefijo static se les puede acceder dentro del archivo fuente (o sea se comportan como variables globales). // Función hello()se puede utilizar en File_1 void main(){ PORTA = cnt++. } File 2: // Cualquier modificación de cnt en File_1 será visible en File_2 // Función hello()se puede llamar desde aquí int cnt = 0. void hello(). el programa consiste en dos archivos: File_1 y File_2. Por supuesto. File 1: extern int cnt. // Variable cnt es visible en File_1 extern void hello().

2. c%2. lógica u otra operación particular. Cada operación se realiza sobre uno o más operandos que pueden ser variables o constantes. c Inicializar a Inicializar b c = 9 c = 1. Además. Por ejemplo: a+b o a/b. Hay más de 40 operaciones disponibles en el lenguaje C. cada operación se caracteriza por la prioridad de ejecución y por la asociatividad. En este caso. OPERADORES ARITMÉTICOS Los operadores aritméticos se utilizan en las operaciones aritméticas y siempre devuelven resultados numéricos.b. b. se requieren dos números para ejecutar una operación binaria. A diferencia de las operaciones unitarias que se realizan sobre un operando. Dicho de manera sencilla.5 OPERADORES Un operador es un símbolo que denota una operación aritmética. a + b. 4. // // // // // // // // Declarar 3 enteros a. En otras palabras. el resultado es 1 lo que significa que la variable es un número imparo OPERADORES DE ASIGNACIÓN Hay dos tipos de asignación en el lenguaje C: Los operadores simples asignan los valores a las variables utilizando el carácter común '='. O P ERA DO R + * / % O P ERA C I Ó N Adición Resta Multiplicación División Resto de la división int a = b = c = c = a.com . pero se utiliza un máximo de 10-15 de ellas en práctica. las operaciones binarias se realizan sobre dos operandos. Hay dos tipos de operadores. Por ejemplo: a =8 open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. los unitarios y los binarios.c. Esta operación se utiliza con frecuencia para comprobar la paridad. 5. varias operaciones aritméticas y lógicas se realizan por medio de los operadores.

c. Se utilizan para simplificar la sintaxis y habilitar la ejecución más rápida.com . En primer caso (++x). Lo mismo se aplica a la operación de decremento. Estos caracteres pueden preceder o seguir a una variable. O P ERA DO R EJ EM P L O ++a a++ --b b-DES C RI P C I Ó N ++ Variable "a" es incrementada por 1 -- Variable "a" es decrementada por 1 int a = c = b = a. // Declarar e inicializar la variable a a += 10. 1 + a++. la variable se utilizará en la expresión antes de ser aumentada por 1. b = 5. // c = 6 ++c + a // b = 7 + 6 = 13 OPERADORES RELACIONALES open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. b. // a = a + 10 = 15 OPERADORES DE INCREMENTO Y DECREMENTO Las operaciones de incremento y decremento por 1 se denotan con "++" y "--". Consisten en dos caracteres como se muestra en la tabla a la derecha. De lo contrario. la variable x será incrementada por 1 antes de ser utilizada en la expresión. EJ EM P L O O P ERA DO R Expresión += -= *= /= %= a += 8 a -= 8 a *= 8 a /= 8 a %= 8 Equivalente a=a+8 a=a-8 a=a*8 a=a/8 a=a%8 int a = 5.Las asignaciones compuestas son específicas para el lenguaje C.

Por ejemplo: 1 && 0 es igual a (expresión verdadera) && (expresión falsa) El resultado 0.. O (OR) lógico y negación . O P ERA DO R && || ! F UNC I Ó N Y O NO open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. En mikroC. si una expresión es evaluada como falsa (false). devuelve 1. o sea . entonces.com . Los operadores lógicos devuelven verdadero (1 lógico) si la expresión evaluada es distinta de cero. Por lo tanto. int var = 5. Esto es muy importante porque las operaciones lógicas se realizan generalmente sobre las expresiones.’ O P ERA DO R > >= < <= == != DES C RI P C I Ó N mayor que mayor o igual que menor que menor o igual que igual que desigual que EJ EM P L O b>a a >= 5 a<b a <= b a == 6 a != b C O NDI C I Ó N DE V ERA C I DA D si b es mayor que a si a es mayor o igual que 5 si a es menor que b si a es menor o igual que b si a es igual que 6 si a es desigual que b int prop. prop = var < 10. el operador devuelve 0. // Expresión es evaluada como verdadera. devuelve falso (0 lógico) si la expresión evaluada equivale a cero. Esto se utiliza en expresiones tales como ‘si la expresión es evaluada como verdadera.NO (NOT) lógico. las operaciones lógicas se refieren a la veracidad de toda la expresión. y no sobre las variables (números) particulares en el programa. mientras que si una oración es evaluada como verdadera (true).Falso en ambos casos.. prop = 1 OPERADORES LÓGICOS Hay tres tipos de operaciones lógicas en el lenguaje C: Y (AND) lógico.OPERADORES RELACIONALES Los operadores relacionales se utilizan en comparaciones con el propósito de comparar dos valores. En caso contrario.

+(unitario) -(unitario) *Puntero &Puntero * / % + A S O C I A T I V I DA D de izquierda a derecha de derecha a izquierda de izquierda a derecha de izquierda a derecha open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. se introducirá un 1 para mantener el signo correcto de la variab le. dos operadores no deben estar escritos uno junto al otro. ¿CÓMO UTILIZAR LOS OPERADORES? Aparte de los operadores de asignación. // esta expresión generará un error Cada operador tiene su prioridad y asociatividad como se muestra en la tabla: Similar a las expresiones aritméticas. P RI O RI DA D Alta O P ERA DO RES () [] -> . los operadores se agrupan juntos por medio de paréntesis. Primero se calculan las expresiones encerradas entre paréntesis.com . Se enumeran en la siguiente tabla: O P ERA DO R ~ << >> & DES C RI P C I Ó N C omplemento a uno Desplazamiento a la izquierda Desplazamiento a la derecha Y lógico para manejo de bits EJ EM P L O a = ~b a = b << 2 a = b >> 2 c=a&b b=5 b = 11110011 b = 11110011 a = 11100011 b = 11001100 a = 11100011 b = 11001100 a = 11100011 b = 11001100 RES UL T A DO a = -5 a = 11001100 a = 00011110 c = 11000000 | O lógico para manejo de bits c=a|b c = 11101111 ^ EXOR lógico para manejo de bits c=a^b c = 00101111 Note que el resultado de la operación de desplazamiento a la derecha depende del signo de la variab le. se pueden utilizar los paréntesis múltiples (anidados). ! ~ ++ -.OPERADORES DE MANEJO DE BITS A diferencia de las operaciones lógicas que se realizan sobre los valores o expresiones. Si se aplica a un entero con signo negativo. x*%12. se introducirán los ceros en el espacio vacío creado por desplazamiento. Si es necesario. En caso de que el operando se aplique a una variab le sin signo o positiva. las operaciones de manejo de bits se realizan sobre los bits de un operando.

< > < <= > >= == != & ^ | && || ?: Baja = += -= *= /= /= &= ^= |= <= >= de izquierda a derecha de izquierda a derecha de izquierda a derecha de izquierda a derecha de izquierda a derecha de izquierda a derecha de izquierda a derecha de derecha a izquierda de derecha a izquierda de izquierda a derecha int a = b = res res a.com . Si dos operandos de tipo diferente se utilizan en una operación aritmética. hay una alta posibilidad de que el resultado no sea un entero. = a*(a + b). Los tipos de datos principales se colocan según el siguiente orden jerárquico: open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. 10. // resultado = 1100 = a*a + b. Por ejemplo. 100. El mikroC realiza una conversión automática cuando se requiera. el tipo de operando de la prioridad más baja se convierte automáticamente en el tipo de operando de la prioridad más alta. si divide dos valores enteros. // resultado = 200 CONVERSIÓN DE TIPOS DE DATOS Algunas operaciones implican conversión de datos. b. res.

// c = 0/0. // A la variable x se le asigna el tipo integer (un entero) x = 3. Las condiciones permiten ejecutar una o varias sentencias dependiendo de validez de una expresión. Los operandos condicionales if-else y switch se utilizan en las operaciones condicionales. Ejemplo del operador if: open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.1 = 0. velocidad = (int)(a/b). velocidad. OPERADOR CONDICIONAL if-else El operador if se puede utilizar solo o asociado al operador else (if-else). // El valor 3. // A la variable x se le asigna el valor 3 x+ = 3. double distancia. tiempo = 0.89. se descarta o se redondea para coincidir con el tipo de la variable.14. se deb e hacer (. se deb e hacer (. como era de esperar. si la condición no se cumple.. se debe declarar x como un punto flotante.. El resultado de la expresión de la derecha del operador de la asignación siempre se convierte en el tipo de la variable de la izquierda del operador.9 = 8.. De lo contrario.14 se agrega a la variable x al // realizar la operación de asignación /* El resultado de la adición es 6 en vez de 6. siempre se descartan los números que siguen al punto decimal.0 2. */ Para realizar una conversión explícita. Al convertir un dato real en un entero. tiempo. Si el resultado es de tipo de la prioridad más alta.1.6 ESTRUCTURAS DE CONTROL ESTRUCTURAS CONDICIONALES Las condiciones son ingredientes comunes de un programa. Una sentencia condicional puede ser seguida por una sola sentencia o por un bloque de sentencias a ser ejecutadas.La autoconversión se realiza asimismo en las operaciones de asignación. En otras palabras.0 velocidad = ((int)a)/b.). distancia = 0. // c = (int)8. ‘Si se cumple la condición (..14.. Para obtener el resultado esperado sin descartar los números que siguen al punto decimal. int x.)’. antes de escribir una expresión o una variable hay que especificar el tipo de resultado de operación entre paréntesis.com ..).

.. // operación1 . Como hemos mencionado. Por ejemplo: if(expresión) { . la otra forma combina tanto el operador if como el else: if(expresión) operación1 else operación2. Si el resultado de la expresión es falso (0).} // else operación2 El operador if-else se puede sustituir por el operador condicional '?:': (expresión1)? expresión2 : expresión3 open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.. La sentencia if-else se parece a lo siguiente: if(expresión) operación1 else operación2 Si operación1 u operación2 está compuesta.com . // ... escriba una lista de sentencias encerradas entre llaves. Después de realizar una de las operaciones. Si el resultado de la expresión encerrada entre paréntesis es verdadero (distinto de 0) la operación se realiza y el programa continúa con la ejecución. la operación no se realiza y el programa continúa inmediatamente con la ejecución. el programa continúa con la ejecución.if(expresión) operación. se realiza operación1. Si el resultado de la expresión es verdadero (distinto de 0).. de lo contrario se realiza la operación2.

De lo contrario... el resultado de la expresión entera será equivalente al resultado obtenido de la expresión3. el operador switch permite elegir entre varias opciones. // ninguna constante equivale al selector break. el resultado de la expresión entera será equivalente al resultado obtenido de la expresión2. ....com . default: operación_esperada // El grupo de operadores que se ejecuta si . Si coinciden. // el selector y la constante2 son equivalentes break. case constante2: operación2 // El grupo de operadores se ejecuta si .. // el selector y la constante1 son equivalentes break. } La operación switch se ejecuta de la siguiente manera: primero se ejecuta el selector y se compara con la constante1. La sintaxis de la sentencia switch es: switch (selector) // Selector es de tipo char o int { case constante1: operación1 // El grupo de operadores que se ejecutan si . si la expresión1 es 0 (falso)...Si el valor de la expresión1 es distinto de 0 (verdadero). las open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Por ejemplo: maximum = (a>b)? a : b // A la variable maximum se le asigna el // valor de la variable mayor(a o b) Operador Switch A diferencia de la sentencia if-else que selecciona entre dos opciones en el programa.

es posib le salir de un b loque aunque la condición para su final no se haya cumplido. Cuántas veces se ejecutará. Si coincide con alguna de ellas. se ejecutarán las operaciones que siguen al operador default. BUCLES A menudo es necesario repetir una cierta operación un par de veces en el programa. break. Si el selector no coincide con ninguna constante.. Si la expresión es falsa en la entrada del bucle. case6:case7: LCD_message = 'Fin de semana'. es decir cuánto tiempo el programa se quedará en el bucle. depende de las condiciones de salir del bucle. } Los comandos se ejecutan repetidamente (el programa se queda en el bucle) hasta que la expresión llegue a ser falsa. Un tipo especial del bucle de programa es un bucle infinito. Si coinciden. Bucle While El bucle while se parece a lo siguiente: while(expresión){ comandos . También es posible comparar una expresión con un grupo de constantes. La ejecución es open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com . Al utilizar ‘b reak’. se ejecutarán las operaciones apropiadas: switch (días) // La variable días representa un día de la semana.sentencias que pertenecen a ese bloque se ejecutan hasta llegar a la palabra clave break o hasta el final de la operación switch. o para forzar un b ucle a terminar antes de lo normal. Un conjunto de comandos que se repiten es denominado un bucle de programa. break. Se forma si la condición sigue sin cambios dentro del bucle. } La palab ra clave de C ‘b reak’ se puede utilizar en cualquier tipo de b loques. default:LCD_message_1 = 'Elija un día de la semana'. Si no coinciden. el selector se compara con la constante2. Se puede utilizar para terminar un b ucle infinito. entonces el bucle no se ejecutará y el programa continuará desde el fin del bucle while. { // Es necesario determinar si es un día laborable o no lo es case1:case2:case3:case4:case5: LCD_message = 'Día laborable'. las sentencias que pertenecen a ese bloque se ejecutan hasta llegar a la palabra clave break etc.. break.

. Se forma si la condición sigue sin cambios dentro del bucle. } La ejecución de esta secuencia de programa es similar al bucle while.. // repetidamente (bucle infinito) } Bucle For El bucle for se parece a lo siguiente: for(expresión_inicial. que más tarde se compara con la expresión_ de_condición antes de entrar al bucle. k<5..Un tipo especial del bucle de programa es un bucle infinito. Las operaciones dentro del bucle se ejecutan repetidamente y después de cada iteración el valor de la expresión_inicial se incrementa de acuerdo con la regla cambiar_expresión. se puede escribir "while(true)" . La expresión_ inicial especifica la variable inicial del bucle.. La iteración continúa hasta que la expresión_de_condición llegue a ser falsa. cambiar_expresión) { operaciones . al comprobar se valida que la expresión k<5 sea falsa (después de 5 iteraciones k=5) y el programa saldrá del bucle for. for(k=0.com . Luego. // Expresiones encerradas entre llaves se ejecutarán . La operación se ejecutará cinco veces. k++) // La variable k se incrementa 5 veces (de 1 a 4) y operación // cada vez se repite la expresión operación . La ejecución es simple en este caso ya que el resultado entre llaves es siempre verdadero (1=verdadero).... Bucle Do-while El bucle do-while se parece a lo siguiente: do open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. lo que significa que el programa se queda en el mismo bucle: while(1){ // En vez de "while(1)". expresión_de_condición. salvo que en este caso el proceso de especificar el valor inicial (inicialización) se realice en la declaración..

i++) { Lcd_Out(1. Delay_ms(500). Delay_ms(500). Todos los siguientes ejemplos son equivalentes. que se encuentran en las librerías del compilador mikroC PRO for PIC. condición. i++. el procedimiento se repite. Delay_ms(1000).3. Si el resultado es distinto de 0 (verdadero). Delay_ms(1000). i = 0."hello"). Lcd_Cmd(_LCD_CLEAR). do { // Inicialización del contador Lcd_Out(1."hello"). // // // // Visualizar “hello” en el LCD Retardo de 1000 ms Borrar LCD Retardo de 500ms open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Lcd_Cmd(_LCD_CLEAR). Esta parte del código visualiza "hello" en un LCD 10 veces con un retardo de un segundo. Su comportamiento general dentro del bucle se explica por medio de los comentarios."hello"). i<10. No obstante le aconsejamos que no trate de entenderlas en detalle. incremento Visualizar “hello” en el LCD Retardo de 1000 ms Borrar el LCD Retardo de 500ms i = 0.operación while (cambiar_condición). Lcd_Cmd(_LCD_CLEAR).3. // Inicialización del contador while (i<10) { Lcd_Out(1. que significa que operación se ejecuta como mínimo una vez sin reparar en que si la condición es verdadera o falsa. } // // // // // Inicialización. Delay_ms(1000). Delay_ms(500).3.com . } // // // // // // Condición Visualizar “hello” en el LCD Retardo de 1000 ms Borrar el LCD Retardo de 500ms Contador se incrementa for(i=0. Note que en este ejemplo se utilizan funciones predefinidas. La expresión cambiar_condición se ejecuta al final del bucle.

el programa se queda dentro del bucle y las iteraciones continúan. puede ocurrir una división por 0. // Delay_ms(1000).com . salir del bucle Visualizar “Esperar” en el LCD Retardo de 1000 ms Borrar LCD Retardo de 500ms SENTENCIA CONTINUE La sentencia continue colocada dentro de un bucle se utiliza para saltar una iteración. Lcd_Out(1."Esperar"). while(1){ // Bucle infinito if(PORTA. x=1.F0 == 1) // break. // Delay_ms(500). A diferencia de la sentencia break. Delay_ms(1000). while (x<=10) { if (x == 7) { // saltar x=7 para evitar división por 0 Lcd_Cmd(_LCD_CLEAR). “Esperar” está parpadeando en la pantalla LCD hasta que el programa detecte un uno lógico en el pin 0 del puerto PORTA. for. si equivale."Division by 0"). En este ejemplo. // Si x=7.3. } while (i<10). // Lcd_Cmd(_LCD_CLEAR).3. do while) y en las sentencias switch también. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. En éstas la sentencia break se utiliza para salir de las sentencias switch si la condición case es verdadera. // Lcd_Out(1. // continue se utiliza aquí para evitar esta situación. // Contador se incrementa // Condición SENTENCIAS DE SALTO SENTENCIA BREAK A veces es necesario detener y salir de un bucle dentro de su cuerpo.i++. x++. // } Probar si el estado lógico del pin 0 del puerto PORTA es 1. La sentencia break se puede utilizar dentro de cualquier bucle (while.

. utilizada como un argumento para la sentencia goto. // Si se consta que el valor de la variable CO2_sensor =1 hacer salto a la línea de programa Aire acondicionado Desde aquí sigue la parte del código que se ejecutará en caso de una concentración de CO2 demasiado alta en el ambiente 2. Esta característica se debe utilizar con precaución ya que su ejecución puede causar un salto incondicional sin hacer caso a todos los tipos de limitaciones de anidación. saltar a la sentencia while con x=8 } a = 1/(x-7)."Division is OK"). es necesario especificar el tipo de sus elementos (denominado tipo de matriz). // .. Una etiqueta consiste en un identificador válido seguido por un colon (:). x++. // // // . if(CO2_sensor) goto aire acondicionado. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.. } SENTENCIA GOTO La sentencia goto le permite hacer un salto absoluto al otro punto en el programa..com . su nombre y el número de sus elementos encerrados entre corchetes. // Después de esta línea.. Para declarar una matriz.. // Poner este mensaje en el LCD Delay_ms(1000). El punto destino es identificado por una etiqueta. .7 TIPOS DE DATOS AVANZADOS MATRICES Una matriz es una lista de elementos del mismo tipo colocados en localidades de memoria contiguas. Aire acondicionado: // // . Todos los elementos de una matriz tienen el mismo tipo.. Cada elemento es referenciado por un índice. // Esta división generará un error si x=7 /* Muchas operaciones pueden ocurrir aquí */ Lcd_Out(1..continue.3.

1. El tamaño de una matiz no puede ser una variable. // Declaración de la matriz display capaz de contener 3 enteros // método 2 const DÍGITOS = 5. Por eso. este paso se realiza al utilizar llaves: int array_1[3] = {10. En ambos casos. o más tarde en el programa. Para leer o modificar un elemento de matriz del ejemplo anterior.tipo_de_matriz nombre_de_matriz [nº_de_elementos].com . // A la variable a se le asigna el valor del miembro de matriz // con índice 0 (a = 10) array_1[2] = 20.100}. se pueden utilizar dos métodos: // método 1 int display [3]. En C. basta con introducir su índice encerrado entre corchetes: /* Se supone que a ha sido declarado anteriormente como un entero */ a = array_1[0]. El compilador tiene que “saber” cuántas localidades de memoria debe alojar al declarar una matriz. Los elementos de una matriz se identifican por su posición. // Miembro de matriz array_1[2] es modificado (nuevo valor es 20) open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. el índice va desde 0 (el primer elemento de una matriz) a N-1 (N es el número de elementos contenidos en una matriz). char Matriz_nueva[DÍGITOS]. // Declaración de la matriz Matriz_nueva // capaz de contener 5 enteros Una matriz se puede inicializar a la vez que se declara.

tipo_de_matriz nombre_de_matriz [número_de_filas] [número_de_columnas]. } // Aquí tenemos: profundidad_de_sonda [MUESTRAS_DE_AGUA] = {1987.25. // temp se utiliza para guardar un valor // temporalmente profundiad_de_sonda [i] = profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i].i<(MUESTRAS_DE_AGUA/2). Note que el índice se puede expresar mediante variables y operaciones básicas.1. respectivamente.// Todos // los miembros de la matriz profundidad // de sonda son de tipo int for(i=0.24} } MATRICES BIDIMENSIONALES Aparte de las matrices unidimensionales que se pueden interpretar como una lista de valores. void main() { const MUESTRAS_DE_AGUA = 4. // Valor de la constante MUESTRAS_DE_AGUA es 4 int i. // Variables i y temp son de tipo int int profunidad_de_sonda [MUESTRAS_DE_AGUA] = {24.com . En esta parte vamos a describir sólo las matrices bidimensionales. // Tabla se define de modo que tenga 3 filas y 4 columnas Esta matriz se puede representar en la forma de una tabla. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. temp. el nombre de matriz y el tamaño de cada dimensión. también denominadas tablas o matrices.1987}. profundiad_de_sonda [MUESTRAS_DE_AGUA-1-i] = temp. Vea la siguiente matriz bidimensional: int Tabla [3][4]. Una matriz bidimensional se declara al especificar el tipo de dato de matriz. el lenguaje C le permite declarar matrices multidimensionales.i++){ // Bucle se ejecuta 2 veces temp = profundiad_de_sonda [i].25.1. En la declaración de esta matriz número_de_filas y número_de_columnas representan el número de filas y columnas en las que consiste una tabla.El siguiente programa cambia el orden de los elementos de una matriz.

19} }. '&n' es la dirección de la localidad de memoria 'n'. La matriz anterior se puede representar también en la forma de una tabla de valores: 3 7 42 7 1 19 PUNTEROS Un puntero es una variable destinada a recibir una dirección. referenciada por una dirección.42. Para acceder al contenido de la memoria en una dirección específica (también llamado objeto apuntado). la dirección de un objeto se puede obtener por medio un operador unitario &. '*(&n)' es el contenido de la dirección '(&n)'. se debe que especificar el tipo de la variable apuntada: tipo_de_variable *puntero. o sea. o sea de 'n'.tabla[0][0] tabla[1][0] tabla[2][0] tabla[0][1] tabla[1][1] tabla[2][1] tabla[0][2] tabla[1][2] tabla[2][2] tabla[0][3] tabla[1][3] tabla[2][3] Similar a las matrices unidimesionales.com . esta matriz tiene dos filas y tres columnas: int Tabla [2][3]= { {3. es posible asignar los valores a los elementos de una tabla en la línea de declaración. Así que. En C.{7. Como hemos visto anteriormente. En esta etapa. Un puntero “apunta” a una localidad de memoria. Para declarar un puntero.1}. La asignación debe ser realizada línea a línea como en el siguiente ejemplo. a un valor desconocido. una inicialización es muy recomendable: open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.7. el puntero mi_puntero apunta al valor almacenado en esta localidad de memoria. se utiliza un operador de indirección (*).

es fácil manejar los elementos de una matriz.5. // v++. Los punteros son muy útiles para manejar las matrices. // {0.puntero = &variable. Ahora. v = &(voltio[0]). Para acceder al contenido de la variable apuntada. Fíjese en la diferencia entre ‘*v+1’ y ‘*(v+1)’ en el siguiente ejemplo: short int voltio[3] = short int *v. Debido al hecho de que es posible realizar operaciones básicas sobre los punteros (aritmética de punteros). debe utilizar ‘*’. En este caso.10}. // *(v+1) = 2. El siguiente ejemplo muestra el contenido de memoria dependiendo de la acción realizada por medio del puntero. un puntero se utilizará para apuntar al primer elemento de una matriz. puntero contiene la dirección de variab le. // *(v+2) = *(v+1). // *v = 1.com . // voltio[2] = *v+1. v contiene la dirección de voltio[0] voltio[1] = 2 tab[2] = 1 (tab[0] + 1) voltio[2] = 2 v contiene la dirección de voltio[1] voltio[1] = 1 Are you a developer? Try out the HTML to PDF API open in browser PRO version pdfcrowd.

turbina_2. Para acceder a las variables. char corriente.. No obstante. struct generadores turbina_1.corriente = 12. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. su valor no puede ser modificado después de la inicialización.Los punteros también pueden ser declarados con el prefijo ‘const’.voltaje = 150. al utilizar este método todos los elementos deben ser del mismo tipo. A cada uno de estos tres objetos (turbinas) se le asignan las variables ‘corriente’ y ‘voltaje’. Las variables dentro de una estructura se le denominan los miembros de la estructura.com . ESTRUCTURAS Ya hemos visto cómo agrupar los elementos dentro de matrices. . No es posible inicializar variables dentro de la declaración de la estructura de datos: struct generador { int voltaje. A diferencia de C. En este caso. }. turbina_3. podrá definir los objetos denominados ‘turbina’ en el código. tipo2_de_miembro2 miembro2. Entonces. tipo3_de_miembro3 miembro3. similar a una constante. Al utilizar estructuras. Las estructuras de datos se declaran al utilizar la siguiente sintaxis: struct nombre_de_estructura { tipo1_de_miembro1 miembro1. el mik roC no admite alojamiento dinámico. es preciso utilizar el operador '.' turbina_3. }. turbina_3. es posible agrupar diferentes tipos de variables bajo el mismo nombre.

Por supuesto.’ devuelve un error en mikroC.8 FUNCIONES Una función es una subrutina que contiene una lista de sentencias a realizar. recuerde que mikroC no admite la inicialización de los miemb ros de estructura por medio de las llaves. No obstante. La sintaxis de esta función es la siguiente: void main (void) { /* el primer 'void' significa que main no devuelve ningún valor. 2. la función main(). igual que al utilizar los punteros. Además. Esto significa que f es una función que recibe un número real x como parámetro y devuelve 2*x-y. las funciones nos permiten utilizar las destrezas y el conocimiento de otros programadores. aunque el número de funciones es normalmente mayor. El segundo 'void' significa que no recibe ningún valor. un programa contiene como mínimo una función. puede escribir todas las sentencias dentro de la función principal.‘m’}. Por ejemplo. ‘conjunto_1 ={15. el programa termina una vez completada la ejecución de esta función. FUNCIÓN PRINCIPAL La función principal main() es una función particular puesto que es la que se ejecuta al iniciar el programa.*/ . En C. en caso de que su programa sea muy corto y simple. todavía se le permite realizar operaciones por medio de operadores y sentencias definidos en las partes anteriores. El compilador reconoce automáticamente esta función y no es posible llamarla por otra función. La idea principal es dividir un programa en varias partes utilizando estas funciones para resolver el problema inicial con más facilidad. /* --. Una función se ejecuta cada vez que se llame dentro de otra función. Si está familiarizado con el lenguaje C. Al utilizar funciones el código se hace más corto ya que es posible llamar una función tantas veces como se necesite. Note que el compilador también admite la siguiente sintaxis: 'main()' o 'void main()' o 'main(void)' */ . el código normalmente consiste en muchas funciones. En C. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.. }. Además.Introduzca su programa aquí --.com .

Cada parámetro consiste en una variable. Sentencia.. La declaración contiene los siguientes elementos: Tipo de resultado (valor devuelto): tipo de dato del valor devuelto Nombre de función: es un identificador que hace posible llamar a una función. la función evalúa un valor (puede ser una expresión) y lo devuelve a la línea de programa desde la que fue llamada. float y) // variables flotantes x y y se pueden utilizar en f { float r. pero deb e estar entre paréntesis.y. Para hacerlo más claro. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com .. tipo argumento2. return . } Note que una función no necesita parámetros (función main() por ejemplo). // devolver el valor de r } Cada función debe ser declarada apropiadamente para poder interpretarla correctamente durante el proceso de compilación. // almacenar el resultado del cálculo en r return r.... Cuerpo de función: bloque de sentencias dentro de llaves Una función se parece a lo siguiente: tipo_de_resultado nombre_de_función (tipo argumento1. VALOR DEVUELTO Una función puede devolver un valor (esto no es obligatorio) por medio de la palabra clave return.. . puntero o matriz. precedidos por la etiqueta de tipo de dato.) { Sentencia. Los parámetros diferentes están delimitados por comas. el compilador malinterpretaría la función. constante. En caso contrario. Al llegar a return.La misma función en C se parece a lo siguiente: float f (float x. // declarar r para almacenar el resultado r = 2*x . Declaración de parámetros se parece a la declaración de variable regular (por ejemplo: float x).. Se utilizan para pasar la información a la función al llamarla. puede sustituir el espacio en b lanco encerrado entre paréntesis por la palab ra clave void: main (void).

i++) // Bucle que copia el contenido de tab en r r[i] = tab[DIM-1-i]. Tenga cuidado al utilizar matrices y punteros. la función devuelve sólo el valor &r[0]. for(i=0. // Devolver el valor r } En realidad. float y) // Devolver el valor absoluto de 2*x-y { if ((2*x .return r. La función puede contener más de una sentencia return. else return (-2*x + y).y) >= 0) return (2*x . el compilador reserva memoria para el almacenamiento de variables de la función reverse sólo durante su ejecución. Una vez completada la ejecución de reverse. estarán listas para recibir los nuevos valores. etc. o sea.com . En este caso. float abs (float x. // Devolver el valor de la expresión 2*x-y Una función no puede devolver más de un valor. El siguiente ejemplo es un error típico: int *reverse(int *tab) // Esta función debe devolver una matriz r { // cuyo contenido está en orden inverso con // respecto a la matriz tab int r[DIM]. la función devuelve el valor correspondiente y se detiene la ejecución de la función. serán consideradas por el compilador como espacios en blanco. // al invertir el orden return r. Concretamente.y). pero puede devolver un puntero o una estructura. // Declaración de una nueva matriz denominada r int i. // Devolver el valor contenido en r return (2*x . tales como &tab[1].i<DIM. &tab[2]. Esto significa que la dirección que contiene los valores de i o r[] está libre para introducir datos nuevos. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. la localidad de memoria para la variable i o para la matriz r ya no está reservada. Para escribir esta función es necesario pasar la matriz r [] como parámetro (vea la subsección Pasar los parámetros).y). Las demás localidades de memoria. al ejecutar la primera sentencia return. así que sólo el primer elemento de la matriz tab será almacenado en la memoria.

Vea los siguientes ejemplos: open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Un prototipo de función está compuesto por: tipo de resultado nombre de función tipos de parámetros un punto y coma (. float). Sin embargo.} Si la función no devuelve ningún valor. Para ejecutar una función. el compilador debe ser consciente de su presencia en el programa.com . se puede utilizar en culquier parte de programa. // Incremento de una variable global cnt Delay_ms(a) . // Ejecución de la función Delay_ms } // Note que Delay_ms no devuelve nada DECLARAR PROTOTIPOS DE FUNCIONES Para utilizar una función. Puede ser omitida como en el siguiente ejemplo: void wait_1 (unsigned int a) { cnt ++. es necesario escribir su nombre y los parámetros asociados. como la función main es 'raiz' del programa. /* no es obligatorio escribir los nombres de los parámetros. */ LLAMAR UNA FUNCIÓN Mientras una función es definida y su prototipo declarado. la palabra void debe ser utilizada como un tipo de resultado en la declaración. la sentencia return no debe ser seguida por ninguna expresión. que utiliza dos parámetros de tipo float y devuelve el resultado del tipo float. En la programación en C. se requiere declarar los prototipos de funciones en el principio de programa antes de la función main(). no puede ser llamada de ninguna parte de programa. En este caso. los programadores normalmente primero escriben la función main() y luego las funciones adicionales.) El prototipo de la función main no necesita ser declarado. Para avisar al compilador de la presencia de las funciones adicionales. float f (float. Este prototipo informa al compilador: en el programa se utilizará la función f.

la función llamada será capaz de modificar el contenido de esta localidad de memoria. resultado = f(a. después vuelve a la línea desde la que fue llamada. En este caso.a. Vea los siguientes ejemplos: float resultado. funciónX().54. es el más fácil. y no una variable. // resultado. El otro método.b. // Función 'sort'ordena los miembros de la matriz por valor ascendente // y devuelve el miembro con máximo valor int sort(int *). el programa salta a la función llamada. el valor de cada parámetro se copia a un nuevo espacio de memoria reservado durante la ejecución de la función.a. PASAR LOS PARÁMETROS Al llamar una función.b. Tenga en cuenta de que la función devuelve un valor. denominado ‘paso por valor’. La mayor desventaja del ‘paso por el valor’ es que la única interacción que una función tiene con el resto del programa es el valor devuelto de un solo resultado (o la modificación de las variables globales). pero sus modificaciones no se quedan en la memoria una vez completada la ejecución de la función. se le pasan los parámetros. // // int time = 100. // a = 10. // El valor devuelto se le asigna a la variable resultado // Ejecutar la función pausa_1 por medio de la variable tiempo // Ejecutar la función funciónX (sin parámetros) Cuando se llama una función.b).2. la ejecuta.time deben coincidir con los tipos definidos en la declaración de las funciones f y wait_1 Ejecutar la función f por medio de los parámetros a y b pausa_1(tiempo). Como los parámetros se consideran como variables locales por el compilador. se crean copias de los valores de los parámetros. los parámetros se pueden considerar como variables locales de la función. El primer método.com . por lo que sus nombres en la función f pueden ser diferentes de los parámetros utilizados en la main().nombre y los parámetros asociados. b = 5. denominado 'paso por dirección' le permite sobrepasar este problema. Entonces. sus valores pueden ser modificados dentro de la función. // Prototipo de función open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. se debe enviar la dirección de memoria del valor. En C existen dos formas diferentes para pasar parámetros a una función. Cuando se llama una función. Además. En vez de enviar el valor de una variable al llamar a función.

permut. permut = 1.const SIZE = 5. // Número de miembros a ordenar void main() { int maximum. por medio de una función se realizan dos operaciones: ordena los miembros de la matriz por valor asdendente y devuelve el máximo valor. temp. // Bandera reiniciada for(i=0. // Declaración de variables // Bandera de bit indica que se ha hecho una permutación while(permut!=0) { // Quedarse en el bucle hasta reinicar la bandera permut = 0. Para utilizar una matriz en una función es necesario asignar la dirección a la matriz (o a su primer miembro).10. sequence[i+1] = temp. // Declaración de variables en la matriz maximum = sort(input). // Se ha hecho una permutación. // Llamar a función y asignarle el máximo // valor a la variable maximum } int sort(int *sequence) { int i.com .i++) { // Comparar y oredenar los miembros de la // matriz (dos a dos) if(sequence [i] > sequence[i+1]){ temp = sequence [i]. input[SIZE] = {5. Vea el siguiente ejemplo: float método_1(int[]). sequence[i] = sequence[i+1].i<SIZE-1.3. bandera de bit //se pone a uno } } } return sequence[SIZE-1].0}. // Declaración de prototipo de la función Método_1 // Declaración de prototipo de la función Método_2 open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. float método_2(int*).12. // Devolver el valor del último miembro } // que es al mismo tiempo el miembro con el máximo valor En este ejemplo. permut = 1.

// Declaración de prototipo de la función Método_2 const NÚMERO_DE_MEDICIONES = 7. // Parámetro de la función es la dirección de // la matriz } //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× float método_1(int voltaje[]) // Inicio de la función método_1 { int i.9}. // Declaración de las variables locales i y suma for(i=0. // Es posible utilizar *(voltaje+i)en vez de voltaje[i] return(suma/NÚMERO_DE_MEDICIONES). } open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.3.8.5.i++) // Cálculo del valor promedio de voltaje suma += voltaje[i].6. // Es posible utilizar voltaje[i] en vez de *(voltaje+i) return(suma/NÚMERO_DE_MEDICIONES).com .i<NÚMERO_DE_MEDICIONES. suma. } //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× float método_2 (int *voltaje) //Inicio de la función método_2 { int i.1.i<NÚMERO_DE_MEDICIONES. // Declaración de la // matriz voltaje promedio1 = método_1(&voltaje[0]). // Número de los miembros de la matriz void main() { double promedio1.i++) // Cálculo del valor promedio de voltaje suma += *(voltaje+i). // Declaración de las variables locales i y suma for(i=0. suma. // Parámetro de la función es la dirección // del primer miembro promedio2 = método_2(voltaje). promedio2. // Declaración de las variables promedio1 // y promedio2 int voltaje [NÚMERO_DE_MEDICIONES] = {7.float método_2(int*).

Funciona bajo el control de las líneas de comando del preprocesador denominadas directivas. Sin embargo.com . Sólo tenga en cuenta que el preprocesador es una herramienta muy poderosa para los programadores avanzados en C.9 CARACTERÍSTICAS PRINCIPALES DEL PREPROCESADOR El preprocesador es un programa que procesa el código antes de que pase por el compilador. Las dos devuelven el valor promedio de la matriz 'voltaje[]'. especialmente para el control de compilación. DIRECTIVAS DEL PREPROCESADOR PARA DEFINIR MACROS open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. la dirección del primer miembro se puede escribir como 'voltaje' o '&voltaje[0]'. normalmente en el principio del archivo.Las funciones 'método_1' y 'método_2' son completamente equivalentes. vamos a presentar sólo las directivas del preprocesador utilizadas con más frecuencia. el código fuente se examina por el preprocesador que detecta y ejecuta todas las directivas del preprocesador. Después de declararla. empiezan por un símbolo ‘#’ y no requieren ningún punto y coma al final (. Las directivas del preprocesador siguen a una regla de la sintaxis especial. DIRECTIVAS DEL PREPROCESADOR La siguiente tabla contiene un conjunto de directivas del preprocesador frecuentemente utilizadas: Las directivas del preprocesador se pueden dividir en tres categorías: DI REC T I V A S #include #undef #define #ifdef #endif #ifndef #if #else #elif F UNC I O NES Define una sustitución de macro Quita una definición de nombre de macro Especifica un archivo a ser incluido Prueba para definición de macro Especificar el final de #if Prueba si una macro no está definida Prueba las condiciones de compilar Especifica alternativas cuando la prueba de #if falla Especifica alternativas cuando más de dos condiciones se necesitan Definiciones de macro Inclusiones de archivos Control de compilación Ahora. 2. Las directivas del preprocesador se colocan en el código fuente. Antes de pasar por el compilador. no es necesario saber todas ellas para programar microcontroladores.).

En el primer ejemplo.altura).H) (((D/2)*(D/2)*PI))*H // Macro con parámetros Entonces. la siguiente sentencia: Tanque_1 = VOLUMEN (Diámetro.com . así que el preprocesador lo open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. La acción se realiza por medio de la directiva '#define'. Esto significa que el código sustituido debe respetar la sintaxis del mikroC. será sustituida por: Tanque_1 = (((Diámetro/2)*(Diámetro/2)*PI)*altura. #undef TANQUE // Quitar la definición del macro VOLUMEN INCLUSIÓN DE ARCHIVOS La directiva de preprocesador #include copia un archivo específico en el código fuente. PI será sustituido por // el valor 3.14159 // Sustitución simple.14159 en todas las partes del programa También puede utilizar los parámetros para realizar substituciones más complejas: #define VOLUMEN (D. Por medio de la directiva #undef es posible quitar una definición de nombre de macro. Así se especifica que la substitución que se ha definido anteriormente ya no va ocurrir en el siguiente código. en el código. Hay dos formas de escribir estas directivas. El preprocesador sustituye cada ocurrencia del identificador en el código fuente por una cadena. #define PI 3.Por medio de los macros es posible definir las constantes y ejecutar funciones básicas. Esto es útil cuando usted quiere restringir la definición sólo a una parte particular del programa. el código será compilado normalmente. Después de la sustitución. Una sustitución de macro es un proceso en el que un identificador del programa se sustituye por una cadena predefinida. El código incluido debe observar la sintaxis de C para ser compilado correctamente. sólo el nombre de archivo se especifica.

se puede utilizar '.FX' así como '. es necesario acceder a estos registros (para leerlos o escribir en ellos).F5 = 1.B0 = 0. En el segundo ejemplo.def). // todos los pines del puerto PORTB se configuran como salidas PORTB = 0. // Poner a 0 el bit de interrupción global (GIE) Para acceder a un bit individual.buscará dentro del archivo include. // Poner a 1 el bit 5 del registo ADCON0 INTCON. así que el archivo estará directamente incluido (este método es más rápido). Una variable de tipo sb it se comporta open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. En este capítulo vamos a presentar las características específicas del mikroC con el propósito de facilitar la programación de los microcontroladores PIC. TIPO SBIT Si quiere declarar una variable que corresponde a un bit de un SFR.BX' (X es un entero entre 0 y 7 que representa la posición de bit). #include <nombre_de_archivo> #include "C:\Ruta\nombre_de_archivo. hay que utilizar el tipo sb it. Este archivo contiene todos los SFR del microcontrolador PIC a programar.GIE = 0. los de familia PIC tienen los registros de funciones especiales (SFR). hay varias divergencias entre los lenguajes mikroC y ANSI C. Los registros de funciones especiales se definen en un archivo externo e incluido dentro del compilador (archivo . TRISB = 0. ACCESO A LOS REGISTROS DE FUNCIONES ESPECIALES (SFR) Como todos los microcontroladores. // Poner a 0 el bit 0 del registro INTCON ADCON0. Al utilizar el compilador mikroC PRO for PIC es posible de acceder a cualquier SFR del microcontrolador de cualquier parte del código (los SFR se consideran como variables globales) sin necesidad de declararlo anteriormente. se especifica la ruta entera.10 MIKROC PRO FOR PIC Como ya hemos visto. // todos los pines del PORTB se ponen a 0 ACCESO A LOS BITS INDIVIDUALES El compilador mikroC PRO for PIC le permite acceder a los bits individuales de variables de 8 bits por su nombre o su posición en byte: INTCON. Para programar un PIC.h" // Se especifica sólo el nombre del archivo // Se especifica la localidad // exacta del archivo 2.com .

// Botón_PARADA está definido . bg = 0.B7 afectará a Botón_PARADA } En este ejemplo. TIPO BIT El compilador mikroC PRO for PIC proporciona un tipo de datos bit que se puede utilizar para declarar variables. bit *ptr. // Cualquier modificación de PORTA. // // // bit bg = 0. No se puede utilizar en las listas de argumentos.como un puntero y se debe declarar como una variable global: sbit Botón_PARADA at PORTA. Además. mientras que PORTA.B7 .. bit bf. Por ejemplo. El compilador determina el bit en uno de los registros disponibles para almacenar las variables. punteros y los valores devueltos de funciones. En tales casos la solución más simple sería utilizar el código ensamblador en la parte del programa que controla la duración de pulsos..B7 (bit 7 del puerto PORTA) será automáticamente reconocido por el compilador...B7. No hay punteros a una variable de tipo bit ERROR . El Botón_PARADA es una variable declarada por el usuario. // Variable de tipo bit válida Varibale de tipo bit inválida. void main() { // Cualquier modificación de Botón_PARADA afectará a PORTA. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com . declaración con inicialización no está permitida Declaración e inicialización válidas INSERTAR CÓDIGO ASM EN C A veces el proceso de escribir un programa en C requiere las partes del código escritas en ensamblador. // bit bg. cuando se necesita que los pulsos muy cortos (de unos microsegundos) aparezcan periódicamente en un pin del microcontrolador. Esto permite ejecutar las partes complicadas del programa de una forma definida con precisión en un período de tiempo exacto. no es posible declarar e inicializar una variable de tipo bit en la misma línea.

. Por supuesto.W // W = maximum = 100 . // Declarar variables: maximum = 100 asm { // Inicio del código ensamblador MOVF maximum. utilizando el comando asm: asm { instrucciones en ensamblador . como el programa entero está escrito en C. } // Final del código ensamblador open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. unsigned char maximum = 100. } Los códigos escritos en ensamblador pueden utilizar constantes y variables anteriormente definidos en C. sus reglas se aplican al declarar estas constantes y variables..com .Una o más instrucciones en ensamblador están insertadas en el programa escrito en C...

es necesario comunicárselo al compilador al marcarlas en la lista de las librerías del compilador existentes.FUNCIÓN DE INTERRUPCIÓN Una interrupción detiene la ejecución normal de un programa para ejecutar las operaciones específicas. que contiene un conjunto de variables y funciones. Por ejemplo. como la ejecución de esta función no forma parte de la ejecución de programa regular. Estas funciones están definidas en las librerías contenidas en el compilador mikroC. Una librería representa un código compilado. // Al producirse una interrupción // la cnt se incrementa en 1 PIR1. no es necesario declarar el prototipo de la función interrupt(). mientras que C_math proporciona algunas funciones matemáticas. la librería LCD contiene funciones de visualización de la pantalla LCD. Si el compilador encuentra una función desconocida durante la ejecución de programa. Cada librería tiene un propósito específico. LIBRERÍAS Usted probablemente ha notado que en los ejemplos anteriores hemos utilizado algunas funciones como son 'Delay_ms'. // Poner a 0 el bit TMR1IF } A diferencia de las funciones estándar. 'LCD_cmd' etc. no se debe llamar de ninguna parte de programa (se ejecutará automáticamente dependiendo de las condiciones que el usuario ha definido en el programa). La sintaxis de una interrupción en mikroC se parece a lo siguiente: void interrupt() { cnt++ . En el siguiente capítulo vamos a dar una clara explicación de la ejecución y definición de subrutinas de interrupción. 'LCD_out'. Antes de utilizar alguna de ellas en el programa.TMR1IF = 0. primero va a buscar su declaración en las librerías marcadas. anteriormente escrito en mikroC.com . open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Una lista de sentencias a ejecutar debe estar escrita dentro de una función particular denominada interrupt(). Además.

Aparte de las librerías existentes, es posible crear las librerías y luego utilizarlas en el programa. El procedimiento de cómo crear librerías se describe en detalles en Help (Ayuda) del compilador. El compilador mikroC incluye tres tipos de librerías: - librerías ANSI C estándar:
L I BRA RÍ A ANSI C C type Library ANSI C Math Library ANSI C Stdlib Library ANSI C String Library DES C RI P C I Ó N Utilizada principalmente para probar o para convertir los datos Utilizada para las operaciones matemáticas de punto flotante C ontiene las funciones de librerías estándar Utilizada para realizar las operaciones de cadenas y de manipulación de memoria

- librerías misceláneas:
L I BRA RÍ A Button Library C onversion Library Sprint Library PrintOut Library Time Library DES C RI P C I Ó N Utilizada para desarrollar los proyectos Utilizada para la conversión de tipos de datos Utilizada para formatear los datos con facilidad Utilizada para formatear los datos e imprimirlos Utilizada para cálculos de tiempo (formato UNIX time)

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Trigonometry Library Setjmp Library

Utilizada para la implementación de funciones trigonométricas fundamentales Utilizada para los saltos de programa

- librerías para el hardware:
L I BRA RÍ A ADC Library C AN Library C ANSPI Library C ompact Flash Library EEPROM Library EthernetPIC 18FxxJ60 Library Flash Memory Library Graphic Lcd Library I2C Library Keypad Library Lcd Library Manchester C ode Library Multi Media C ard Library One Wire Library Port Expander Library PS/2 Library PWM Library RS-485 Library Software I2C Library Software SPI Library Software UART Library Sound Library SPI Library DES C RI P C I Ó N Utilizada para el funcionamiento del convertidor A/D Utilizada para las operaciones con el módulo C AN Utilizada para las operaciones con el módulo C AN externo (MC P2515 o MC P2510) Utilizada para las operaciones con las tarjetas de memoria Compact Flash Utilizada para las operaciones con la memoria EEPROM incorporada Utilizada para las operaciones con el módulo Ethernet incorporado Utilizada para las operaciones con la memoria Flash incorporada Utilizada para las operaciones con el módulo LC D gráfico con resolución 128x64 Utilizada para las operaciones con el módulo de comunicación serial I2C incorporado Utilizada para las operaciones con el teclado (botones de presión 4x4) Utilizada para las operaciones con el LC D (de 2x16 caracteres) Utilizada para la comunicación utilizando el código Manchester Utilizada para las operaciones con las tarjetas multimedia MMC flash Utilizada para las operaciones con los circuitos utilizando la comunicación serial One Wire Utilizada para las operaciones con el extensor de puertos MC P23S17 Utilizada para las operaciones con el teclado estándar PS/2 Utilizada para las operaciones con el módulo PWM incorporado Utilizada para las operaciones con los módulos utilizando la comunicación serial RS485 Utilizada para simular la comunicación I2C con software Utilizada para simular la comunicación SPI con software Utilizada para simular la comunicación UART con software Utilizada para generar las señales de audio Utilizada para las operaciones con el módulo SPI incorporado

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

SPI Ethernet Library SPI Graphic Lcd Library SPI LC D Library SPI Lcd8 Library SPI T6963C Graphic Lcd Library UART Library USB Hid Library

Utilizada para la comunicación SPI con el módulo ETHERNET (ENC 28J60) Utilizada para la comunicación SPI de 4 bits con el LC D gráfico Utilizada para la comunicación SPI de 4 bits con el LC D (de 2x16 caracteres) Utilizada para la comunicación SPI de 8 bits con el LC D Utilizada para la comunicación SPI con el LC D gráfico Utilizada para las operaciones con el módulo UART incorporado Utilizada para las operaciones con el módulo USB incorporado

2.11 PROGRAMAR LOS PIC UTILIZANDO MIKROC PRO FOR PIC
En las secciones anteriores hemos presentado el lenguaje mikroC, especialmente diseñado para programar los PIC. Ahora, lo que hemos revisado es suficiente para empezar a programar, es hora de presentar el software que utilizará para desarrollar y editar los proyectos. Este software se le denomina Entorno de desarrollo integrado (Integrated Developement Environment - IDE) e incluye todas las herramientas necesarias para desarrollar los proyectos (editor, depurador etc.). Por extensión, IDE es a veces llamado compilador. En esta sección le enseñaremos lo básico que debe saber para empezar a desarrollar su primer proyecto en mikroC utilizando el IDE del compilador mikroC PRO for PIC. Aparte de todas las características comunes de cualquier IDE, mikroC PRO for PIC contiene las informaciones de arquitectura de los microcontroladores PIC (registros, módulos de memoria, funcionamiento de circuitos particulares etc.) para compilar y generar un archivo legible por un microcontrolador PIC. Además, incluye las herramientas específicas para programar los microcontroladores PIC. El proceso de crear y ejecutar un proyecto contiene los siguientes pasos:

1. Crear un proyecto (nombre de proyecto, configuración de proyecto, dependencias entre archivos) 2. Editar un programa 3. Compilar el programa y corrección de errores 4. Depurar (ejecutar el programa paso a paso para asegurarse de que se ejecutan las operaciones deseadas). 5. Programar un microcontrolador (cargar el archivo .hex generado por el compilador en el microcontrolador utilizando el programador PICflash).

INSTALAR MIKROC PRO FOR PIC
Antes que nada, usted debe instalar el compilador (con su IDE) en la PC. La instalación del mikroC PRO for PIC es similar a la instalación de cualquier programa en Windows. Todo el procedimiento se lleva a cabo por medio de los wizards (asistentes de instalación):

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Por ahora. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. basta con saber que es un software autónomo utilizado para cargar el programa en el microcontrolador. es el mismo procedimiento menos la última opción: 'Do you want to install PICFLASH v7. Next. OK. Next.Basta con seguir las instrucciones y pulsar sobre Next. Una vez más: Next..11 programmer?'. Next. Next. OK... En general.com . ¿Para qué sirve este software? De eso vamos a hablar más tarde..

el sistema operativo le preguntará a instalar otro programa similar. un software para programar un grupo especial de los microcontroladores PIC que funcionan en modo de bajo consumo (3. Salte este paso.3 V). En este caso.Una vez completada la instalación del PICflash. este dispositivo es el programador (hardware) del sistema de desarrollo.¡la instalación del controlador (driver)! Pulse sobre Yes. El último paso ..com . Un controlador es un programa que permite al sistema operativo comunicar con un periférico. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd..

Next... Next. ¡todo está instalado para iniciar a programar! open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com . OK. Otra vez. Seleccione el controlador correspondiente al SO (sistema operativo) utilizado (por medio de abrir la carpeta correspondiente) e inicie la instalación. Bueno.El controlador a instalar depende del sistema operativo utilizado. Next.

com .CARACTERÍSTICAS PRINCIPALES DEL MIKROC PRO FOR PIC Al iniciar el IDE del compilador mikroC PRO for PIC por primera vez. aparecerá una ventana como se muestra a continuación: open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.

Desgraciadamente. un código ensamblador. una descripción detallada de todas las opciones disponibles de este IDE nos tomaría mucho tiempo. usted debe crear un proyecto. Un archivo con extensión ... open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. De todos modos. Por eso vamos a describir sólo lo más importante del compilador mikroC PRO for PIC. basta con seleccionar la opción Project/New Project. ¿Qué hacer entonces? Siga las instrucciones. MANEJAR LOS PROYECTOS Antes de empezar a escribir el código. para obtener más informacion presione el botón de Ayuda (Help) [F1]. cabecera y otros archivos. sino que forma parte de un proyecto que incluye un código hex.mcppi le permite abrir cualquiera de estos proyectos. Un programa escrito en el compilador mikroC PRO for PIC no es un archivo fuente autónomo. Para crear un proyecto. Algunos de ellos se requieren para compilar el programa.com . y un wizard aparecerá automáticamente. mientras que otros se crean durante el proceso de compilación.

PROJECT MANAGER (ADMINISTRADOR DEL PROYECTO) Una vez creado el proyecto. es posible manejar todos los archivos que contiene al utilizar la ventana Project Manager. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Basta con pulsar con el botón derecho del ratón sobre una carpeta y seleccionar la opción que necesita para su proyecto.hex que se cargará en el microcontrolador.com . el compilador genera el archivo . PROJECT SETTINGS (CONFIGURACIÓN DE PROYECTOS) Al compilar un proyecto. Estos archivos serán diferentes lo que depende del tipo del microcontrolador así como del propósito de la compilación. Por esta razón es necesario ajustar algunos parámetros de proyectos utilizando la ventana Project Settings.

In Circuit Debugger) permite ejecutar el programa paso a paso y proporcionar open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. la función Delay_ms). el compilador no puede afectar más a la ejecución de programa después de la compilación. enlazar (linking) y generar los archivos . el compilador se queda conectado al microcontrolador por medio del cable USB y el programador. y todavía puede afectar a su funcionamiento. Dependiendo del modo seleccionado. lo que requiere información del tiempo (por ejemplo.hex compatible. de sus direcciones de memoria y algunas variables de programación específicas a ese tipo del microcontrolador. Una herramienta denominada mikroICD (Depurador en circuito .com .hex generado contiene los datos adicionales que permiten el funcionamiento del depurador. Build/Debugger Type: Todo el proceso de compilar (building) está compuesto por análisis sintáctico (parsing).hex. El archivo . La velocidad de operación se configura de modo que permita al oscilador interno del microcontrolador funcionar a una frecuencia seleccionada. difieren los archivos generados a cargar en el microcontrolador.def) asociado. Oscillator (oscilador): Se debe especificar la velocidad de operación del microcontrolador. El programa a cargar en el microcontrolador no será modificado de ninguna manera. ICD debug: Al elegir esta opción. compilar.Device (dispositivo): Al seleccionar el tipo de microcontrolador a utilizar permite al compilador extraer el archivo de definición (archivo . Por supuesto. El archivo de definición de un microcontrolador contiene las informaciones específicas de sus registros SFR. el programador necesitará esta información también. El tipo de compilación le permite ajustar el modo de compilación. una vez completado el proceso de la compilación y cargado el programa en la memoria del microcontrolador. El compilador la necesita para compilar rutinas. Es obligatorio crear un archivo . este valor depende del oscilador utilizado. Más tarde. Release: Al elegir esta opción .

. El simulador no utiliza los dispositivos reales para simular el funcionamiento del microcontrolador. Por ejemplo. y marque las que quiere utilizar en el programa. Una descripción de cada librería está disponible al pulsar con el botón derecho del ratón sobre su nombre y seleccionar la opción Help. Al marcar una librería. Las librerías contienen un gran número de funciones listas para ser utilizadas.com .. Abra la ventana Lib rary Manager. No se olvide de recompilar y reprogramar su dispositivo después de modificar una configuración. se añade automáticamente al proyecto y se enlaza durante el proceso de la compilación. debe especificar cuáles de ellas se utilizan. así que algunas operaciones no pueden ser reproducidas (por ejemplo. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. interrupción). Así. Además. Note que es posible modificar cualquier configuración en cualquier momento mientras se edita el programa. LIBRARY MANAGING (EDITOR DE LIBRERÍAS) El compilador tiene que conocer todas las dependencias de su archivo fuente en mikroC para compilarlo apropiadamente. no necesita incluir las librerías manualmente en sus archivos del código fuente por medio de la directiva del preprocesador #include.) en su programa. cada vez que intente utilizar una función de la librería LCD. si su programa utiliza un LCD no hace falta escribir nuevas funciones ya que al seleccionar la librería Lcd. De todos modos. LCD_Init. Por ejemplo. Las librerías en mikroC proporcionan muchas facilidades para escribir programas para los microcontroladores PIC. si las librerías forman parte de su proyecto.un acceso al contenido actual de todos los registros de un microcontrolador real. Si esta librería no está seleccionada en la ventana Library Manager. el compilador le informará de un error. usted podrá utilizar funciones listas para ser utilizadas de la librería LCD (Lcd_Cmd. resulta más rápido depurar un programa por medio de un simulador. no se requiere ningún dispositivo destino.

resulta más fácil solucionar los errores de programa para no “tomar un camino erróneo” en redactar su programa. aunque el compilador no tenga las restricciones de formateo. usted tendrá que editar el programa entero. COMPILAR Y SOLUCIONAR LOS ERRORES open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. si usted busca una función utilizada en el programa. basta con pulsar dos veces sobre su nombre en esta ventana. De este modo.EDITAR Y COMPILAR PROGRAMAS CODE EDITOR (EDITOR DE CÓDIGO) El proceso de editar programas se debe realizar dentro de la ventana principal del IDE denominada Code Editor. CODE EXPLORER (EXPLORADOR DEL CÓDIGO) La ventana Code Explorer le permite localizar funciones y procedimientos dentro de los programas largos. siempre debe seguir a las mismas reglas de editar (como en los ejemplos proporcionados en este libro). Por ejemplo. Al escribir un programa. no espere que termine la redacción del programa para compilarlo. Al escribir el programa no se olvide de los comentarios. Como no hay limitaciones de tamaño. y el cursor estará automáticamente posicionado en la línea apropiada en el programa. Compile su código de forma regular con el propósito de corregir cuánto más errores de sintaxis.com . no vacile en utilizar los espacios en blanco para hacer su código más legible. Los comentarios son muy importantes para depurar y mejorar el programa. Además. Asimismo usted puede compilar su programa cada vez que se complete la redacción de una nueva función así como probar su comportamiento al utilizar modo de depuración (ver la próxima sección). De lo contrario.

El principio de depuración se basa en ejecutar el programa paso a paso y monitorear el contenido de los registros y los valores de las variables.). Cada error encontrado se asocia con su línea de programa y su descripción. Durante una depuración el programa será modificado.hex etc. Al ejecutar el programa paso a paso. simplemente debe intentar solucionar el primer error en la lista y después recompile su programa. Durante el proceso de compilación se generan muchos mensajes que se visualizan en la ventana Messages. De todas formas. El editor del código será ligeramente modificado automáticamente y aparecerá una ventana denominada Watch Values. o solucionar los errores descubiertos mientras se ejecuta el programa. el proyecto entero se ha compilado. se generarán los archivos de salida (asm. En realidad. DEPURAR EL PROGRAMA La depuración es un paso muy importante ya que permite probar el programa después de una compilación realizada con éxito. su tarea todavía no está terminada. es recomendable solucionar los errores uno a uno. De este modo. Una compilación se ha realizado con éxito si no se ha encontrado ningún error. En el ejemplo anterior hay dos errores y una advertencia: faltan un punto y coma y una declaración de variable La advertencia le informa que falta el tipo del valor devuelto de la función main. Para iniciar la depuración. podrá localizar los problemas con facilidad. En caso de elegir la opción ICD deb ug. Como un error en su código puede generar mucho más errores. La compilación le permite corregir su programa por medio de solucionar todos los errores en mikroC.Para compilar su código. . advertencia y errores. hay que cargar el programa en el microcontrolador antes de depurarlo. es posible comprobar el resultado de un cálculo y ver si algo inesperado ha ocurrido. y si la compilación se ha realizado con éxito. El procedimiento de depuración es el mismo sin reparar en el modo elegido. porque aún no sabe si su programa se comporta como se esperaba o no. Como ya hemos visto. En otras palabras. pulse sobre la opción Build en el menú Project. hay dos modos de depurar: un depurador software que simula el funcionamiento del microcontrolador (modo por defecto) y depurador hardware (mikroICD) que lee directamente el contenido de la memoria del microcontrolador. Cuando todos los errores se solucionen. pulse sobre la opción Start deb ugger del menú Run. Estos mensajes consisten en información. por lo que usted siempre debe recompilar el programa después de cada open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. su programa está listo para ser cargado en el microcontrolador.com .

utilice el comando Run/Pause Debugger. Cuando la instrucción es una llamada a una rutina. Para añadir o quitar un punto de ruptura basta con pulsar sobre la línea apropiada en el lado izquierdo del editor del código. el depurador no hará un salto a la rutina. puesto que permiten ejecutar el programa a toda velocidad y detenerlo automáticamente en una línea específica (punto de ruptura). PUNTOS DE RUPTURA (BREAKPOINTS) Los puntos de ruptura hacen el proceso de depurar los programas de una manera más eficiente. o presionar [F5]. Step out . Para ejecutar la parte de programa desde la línea en la que está el cursor hasta el punto de ruptura. Note que las líneas designadas como puntos de ruptura están marcadas en rojo.corrección.com .Ejecuta una sola instrucción. Una pequeña ventana denominada Breakpoints muestra dónde están los puntos de ruptura. permitiéndole comprobar sólo las partes críticas del programa y no perder el tiempo probando todo el programa línea a línea. y reiniciar el depurador para comprobar qué ha sido modificado. Es posible leer el contenido de registros y variables seleccionados en la ventana Watch Values en cualquier momento. El depurador se detiene a la primera instrucción después de la llamada a la rutina. Run To Cursor . Eso resulta muy útil.Se ejecuta una sola instrucción. Cuando la instrucción es una llamada a una rutina. Step Over . el depurador hará un salto a la rutina y se detendrá después de ejecutar la primera instrucción dentro de la rutina. COMANDOS DEL DEPURADOR Hay varios comandos disponibles para depurar el código: Step Into . La línea que se está ejecutando actualmente está marcada en azul. El depurador se detiene inmediatamente al salir de la rutina.Se ejecutan las demás instrucciones dentro de la rutina. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.El programa se ejecuta hasta la línea en la que se encuentre el cursor. sino que se ejecutará toda la rutina.

resulta fácil comprobar si un pin está a cero o a uno. Como la ventana Watch Values permite monitorear el estado de todos los registros. La diferencia es que el depurador software simula ejecución de programa en una PC. Cualquier cambio de estado lógico de los pines se indica en el registro (puerto) apropiado. mientras que el depurador ICD (depurador hardware) utiliza un microcontrolador real.VENTANA WATCH VALUES El depurador software y hardware tienen la misma función de monitorear el estado de los registros durante la ejecución del programa. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. La última modificación está marcada en rojo en la ventana Watch Values. Esto le permite localizar la modificación en la lista de variables y registros durante el proceso de la depuración.com .

Por ejemplo. el siguiente paso es cargarlo en el open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. ¿Cómo funciona un cronómetro? Eso es pan comido. step over. seleccione la opción Run/View Stopwatch. run/pause etc. se mide tiempo para ejecutar un programa. Entonces usted puede hacer una lista de registros/variables que quiere monitorear y la manera de visualizarlos. Aparecerá una ventana como se muestra en la figura a la derecha.. El tiempo que tarda un comando (step into.) en ejecutarse por el depurador se mide automáticamente y se visualiza en la ventana Stopwatch. PROGRAMAR EL MICROCONTROLADOR Si ha solucionado todos los errores en su código y cree que su programa está listo para ser utilizado. tiempo para ejecutar el último paso etc.com ..Para visualizar esta ventana es necesario seleccionar la opción View/Deb ug Windows/Watch Values. STOPWATCH (CRONÓMETRO) Si quiere saber cuánto tiempo tarda un microcontrolador en ejecutar una parte del programa.

. Está compuesto por dos partes: La parte hardware se utiliza para introducir un código hexadecimal (el programa a ser cargado en el microcontrolador) y para programar el microcontrolador por medio de niveles de voltaje específicos. Durante el proceso de la programación.. Se puede utilizar para controlar el open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. La parte de software se encarga de enviar el programa (archivo . Por consiguiente. Escribir.microcontrolador. TERMINAL USART El terminal USART representa una sustitución para la estándar Windows Hyper Terminal.). es posible modificar algunas configuraciones del programador y controlar el funcionamiento de la parte hardware (Cargar. un nuevo programa se escribe en la memoria flash del microcontrolador. Verificar. OTRAS HERRAMIENTAS DEL COMPILADOR El compilador mikroC PRO for PIC proporciona herramientas que en gran medida simplifican el proceso de escribir el programa. A la interfaz de usuario de este software se le puede acceder desde IDE al pulsar sobre la opción mE_Programmer del menú Tools o al pulsar [F11]. El programador PICflash se utiliza para este propósito.hex ) a la parte hardware del programador por medio de un cable USB. Se puede reprogramar el microcontrolador tantas veces como se necesite. mientras que el programa anterior se borra automáticamente. Es una herramienta diseñada para programar todos los tipos de microcontroladores PIC. En la siguiente sección vamos a darle una breve descripción de todas ellas. Todas estas herramientas se encuentran en el menú Tools.com .

Luego.funcionamiento del microcontrolador que utiliza la comunicación USART. El nuevo contenido es un dato de un tipo específico (char. pulse sobre el botón Save para guardarlo como un documento con extensión . EDITOR EEPROM Al seleccionar la opción EEPROM Editor del menú Tools. Si quiere cambiar de su contenido después de cargar el programa en el microcontrolador. ésta es la forma correcta de hacerlo. La ventana USART terminal dispone de opciones para configurar la comunicación serial y visualizar los datos enviados/ recibidos.hex. primero debe seleccionarlo. aparecerá una ventana como se muestra en la siguiente figura.com . Así es cómo funciona la memoria EEPROM del microcontrolador. int o double). open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Si la opción Use EEPROM in Project está activa. introducir el valor en el campo Edit Value y pulsar sobre Edit. los datos se cargarán automáticamente en el microcontrolador durante el proceso de la programación. Tales microcontroladores están incorporados en un dispositivo destino y conectados al conector RS232 de la PC por medio de un cable serial.

Usted probablemente sabe que cada tecla de teclado está asociada con un código (código ASCII). seleccione la opción ASCII chart del menú Tools. Si envía el mismo número en forma de un carácter a un LCD.número 7. obtendrá el resultado esperado . si quiere visualizar un número sin convertirlo en un carácter apropiado. es necesario añadir el número 48 a cada dígito en el que consiste el número a visualizar.com . Por consiguiente. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Por esta razón. Aparecerá una tabla. como se muestra en la figura que está a continuación. los caracteres que representan los números tienen valores diferentes. sino el equivalente a la instrucción BEL. la instrucción de programa para visualizar el número 7 en un LCD no visualizará este número. Como se puede ver.VENTANA ASCII CHART Si necesita representar numéricamente un carácter ASCII.

Se visualizará inmediatamente el número a introducir en el programa.EDITOR DE SIETE SEGMENTOS Un editor de siete segmentos le permite determinar con facilidad el número a poner en un puerto de salida con el propósito de visualizar un símbolo deseado.com . open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. Por supuesto. se da por entendido que los pines del puerto deben estar conectados a los segmentos del visualizador de manera apropiada. Basta con colocar el cursor en cualquier segmento del visualizador y pulsar sobre él.

pulse sobre los cuadros pequeños en la ventana LCD custom character. Para crear un símbolo. el microcontrolador también puede visualizar los caracteres creados por el programador.com . No es necesita pulsar más. Copy to Clipboard (copiar al portapapeles) .Paste (pegar). Seleccione la opción Tools/Glcd Bitmap Editor aparecerá la ventana apropiada.. seleccione el tipo de visualizador a utilizar y cargue un mapa de bits. Para utilizarlo. luego seleccione la posición y la fila y pulse sobre el botón GENERATE. Al seleccionar la herramienta LCD custom character.. El mapa de open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. se evitará un pesado trabajo de crear funciones para enviar un código apropiado a un visualizador. Esta herramienta le permite visualizar un mapa de bits con facilidad. El código apropiado aparece en otra ventana.LCD CUSTOM CHARACTER (CARACTERES LCD DEFINIDOS POR EL USUARIO) Además de los caracteres estándar. GENERADOR DE MAPA DE BITS PARA UN LCD GRÁFICO El generador de mapa de bits para un LCD gráfico es una herramienta insustituible en caso de que el programa que escribe utilice el visualizador LCD (GLCD).

. ← previous chapter | table of contents | next chapter → MikroElektronika Embedded Solutions PIC Solution PIC De ve lopm e nt Boards PIC C om pile rs PIC Program m e rs/De bugge rs Follow us on STM32 Solution STM32 De ve lopm e nt Boards STM32 C om pile rs STM32 Program m e rs/De bugge rs dsPIC Solution dsPIC De ve lopm e nt Boards dsPIC C om pile rs dsPIC Program m e rs/De bugge rs 8051 Solution 8051 De v. no se olvide de marcar la caja de chequeo junto a esta lib rería en la ventana Lib rary Manager.bits debe ser monocromático y tener la resolución apropiada del visualizador (128 x 64 píxeles en este ejemplo). Un código generado que utiliza herramientas para controlar los visualizadores LCD y GLCD contiene funciones de la lib rería Lcd. Si las utiliza en el programa. El procedimiento a seguir es igual que en el ejemplo anterior: Copy to Clipboard..com . Así el compilador será capaz de reconocer estas funciones correctamente. Boards 8051 C om pile rs 8051 Program m e rs Add-on boards C lick Boards m ik rom e dia shie lds C om m unication open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.

2014. All trade and/or services marks mentioned are the property of their respective owners. open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd. MikroElektronika.PIC Kits PIC Book s dsPIC Kits dsPIC Book s STM32 Kits 8051 Book s 8051 Kits Storage R e al Tim e C lock Display Me asure m e nt Audio & Voice Powe r Supply GPS GSM/GPR S Tiva C Series Solution Tiva C De ve lopm e nt Boards Tiva C C om pile rs Tiva C Program m e rs/De bugge rs Tiva C Kits PIC32 Solution PIC 32 De ve lopm e nt Boards PIC 32 C om pile rs PIC 32 Program m e rs/De bugge rs PIC 32 Kits AVR Solution AVR De ve lopm e nt Boards AVR C om pile rs AVR Program m e rs/De bugge rs AVR Kits Additional Software Visual TFT Visual GLC D Pack age Manage r GLC D Font C re ator Tim e r C alculator Support Forum m ik roBUS Le ts m ak e Pre ss Le gal Inform ation Product Archive About Us C opyright © 1998 . All rights reserved.com .