Академический Документы
Профессиональный Документы
Культура Документы
La gua de microcontroladores fue hecha pensando bsicamente en un material escrito para los
estudiantes, el cual pueda servirles como medio de consulta en las diferentes prcticas y
proyect os que enfrentaran durante el curso de microcontroladores.
Inicialmente explica los conceptos bsicos, como sistemas de numeracin, contina con una
breve explicacin sobre el lenguaje C, ms adelante explica las caractersticas bsicas del
microcontrolador recomendado en el curso (PIC16F873 o PIC16F876) y por ltimo plantea
diferent es ejemplos con el microcontrolador, cada uno refirindose a un tema especfico.
Los ejemplos que se desarrollan en esta gua son relativamente sencillos, y con seguridad no
siempre ser la mejor manera de desarrollarlos, solo es una de muchas formas de hacerlo.
2 MEMORIAS 7
2.1 MEMORIA RAM 7
2.2 MEMORIA ROM 7
2.3 MEMORIA EPROM 7
2.4 MEMORIA EEPROM 7
2.5 MEMORIA FLASH 7
3 INTRODUCCION AL MICROCONTROLADOR 8
3.1 ORGANIZACIN DE LA MEMORIA DE DATOS RAM 8
3.2 DESCRIPCION DE LOS PINES 8
3.3 CONFIGURACION DE LOS PUERTOS 10
4 LENGUAJE DE PROGRAMACION EN C 12
4.1 ESTRUCTURAS DE CONTROL EN C 12
La estructura de control condicional if 13
Clusula else 13
Seleccin mltiple con la sentencia switch 13
4.2 ESTRUCTURAS DE CONTROL REPETITIVAS 14
Bucle while 14
Bucle for 14
Equivalencia entre For y While 13
Bucles infinitos 13
5 OPERADORES 13
5.1 OPERADORES ARITMETICOS 13
5.2 OPERADORES RELACIONES 14
5.3 OPERADORES LGICOS 14
5.4 OPERADORES DE INCREMENTO Y DECREMENTO 14
6 ENCABEZADO DE UN PROGRAMA 16
7 INSTRUCCIONES BASICAS 17
8 INSTRUCCIONES DE ROTACION 21
12 MULTIPLEXAJE DE DISPLAY 31
13 INTERRUPCIONES 35
14 TIMER 37
BIBLIOGRAFA 66
ANEXOS 67
Sistemas de numeracin
BINARIO27 26 25 24 23 22 21 20
DECIMAL...103 102 101 100
HEXADECIMAL...163 162 161 160
1 0101
24 23 22 21 20
16 + 0 + 4 + 0 + 1 = 21
La matriz de 4 x 8, se puede entender como una memoria de 32 bits o como una memoria de 4
bytes.
unsigned define un nmero de 8 bits sin signed define un nmero de 8 bits con
signo signo
unsigned int define un nmero de 8 bits sin signed int define un nmero de 8 bits con
signo signo
int define un nmero de 8 bits sin signo signed long define un nmero de 16 bits
int16 define un nmero de 16 bits sin signo con signo
char define un nmero de 8 bits sin signo float define un nmero de 32 bits en punto
long define un nmero de 16 bits sin signo flotante
long int define un nmero de 16 bits sin short define un bit
signo short int define un bit
if (condicin)
Sintaxis {
if (condicin) // Aqu se incluye el cdigo
sentencia; // que ha de ejecutarse slo
// si se cumple la condicin del if
o un bloque de instrucciones: // (sangrado para que se vea dnde
// empieza y dnde acaba el if)
if (condicin) }
{
bloque Error comn:
}
if (condicin);
if (condicin)
SELECCIN MLTIPLE CON LA
; // Sentencia vaca
SENTENCIA SWITCH
sentencia;
if (condicin)
{
bloque1
}
else
{
bloque2
}
case n::
sentencia n;
break ;
Por lo general, dentro de la proposicin del
bloque de ellas, se modifican trminos de la
default: expresin condicional, para controlar la
sentencia; duracin de la iteracin.
}
BUCLE FOR
Si se trabaja con datos de tipo real, se tendr Permite ejecutar una instruccin o un bloque
que usar sentencias if encadenadas. de instrucciones una cantidad determinada
Estructuras de control repetitivas/iterativas de veces. Se suele emplear en sustitucin
del bucle while cuando se conoce el nmero
de iteraciones que hay que realizar.
4.2 ESTRUCTURAS DE CONTROL
REPETITIVAS
Equivale a:expr1;
while(expr2)
{
bloque;
expr3;
}
BUCLES INFINITOS
Tal como era de esperarse los operadores Hay tres operadores que realizan las
aritmticos, mostrados en la TABLA 5.1.1, conectividades lgicas Y (AND), O (OR) y
comprenden las cuatro operaciones bsicas, NEGACIN (NOT) y estn descriptos en la
suma, resta, multiplicacin y divisin, con un TABLA 5.3.1.
agregado, el operador mdulo.
Tabla 5.3.1 Operadores Logicos
La cuarta, quinta y sexta lnea consiste en definir un nombre a los diferentes bits que se van a
utilizar en el programa.
La sptima lnea indica la direccin de memoria RAM del puerto B.
La octava lnea indica que se declara la variable CONT tipo entero, esta variable es global, ya
que fue declarada en el encabezado del programa y se podr utilizar tanto en el programa
principal como en las diferentes funciones.
Las tres instrucciones equivalen exactamente a lo mismo, llevar el valor 15 al puerto B, solo
que en diferente formato.
#INCLUDE <16f873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#DEFINE SW PORTB,1
#DEFINE LED PORTB,0
#BYTE PORTB= 6
MAIN()
{
SET_TRIS_B(0B11111110); //Configura el puerto B
WHILE(TRUE) // Haga por siempre
{
IF(BIT_TEST(SW)) // Si SW esta activado
{
BIT_SET(LED); // Active el led
}
ELSE // Sino, es decir si SW esta desactivado
#INCLUDE <16f873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#DEFINE LED PORTB,0
#BYTE PORTB= 6
MAIN()
{
SET_TRIS_B(OB11111110); //Configura el puerto B
WHILE(TRUE) // Haga por siempre
{
BIT_SET(LED); // Active el led
DELAY_MS(1000) // Retardo de 1 segundo
BIT_CLEAR(LED); // Apagar el led
DELAY_MS(1000) // Retardo de 1 segundo
}
}
Encender los 8 leds conectados al puerto B si los suiches conectados a RC0 y RC1 estn
activados y apagarlos si RC0=1 y RC1 =0.
#INCLUDE <16F873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#DEFINE SW1 PORTC,0
#DEFINE SW2 PORTC,1
#BYTE PORTB= 6
#BYTE PORTC= 7
MAIN()
{
SET_TRIS_C(OB11111111); //Configura el puerto C
SET_TRIS_B(OB00000000); //Configura el puerto B
Hacer un programa en microcontrolador que controle un secador de manos de tal manera que
cuando se oprima el pulsador encienda el motor y la resistencia durante 10 segundos.
#INCLUDE <16f873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#BYTE PORTB= 6
#BYTE PORTC= 7
#DEFINE MOTOR PORTB,0
#DEFINE RESISTENCIA PORTB,1
#DEFINE PULSADOR PORTC,0
MAIN()
{
SET_TRIS_B(0B0000000);
SET_TRIS_C(0B1111111); //Configura el puerto B
#INCLUDE <16F873.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#BYTE PORTB= 6
#BYTE PORTC= 7
#DEFINE SONIDO PORTB,0
#DEFINE ENCENDIDO PORTC,0
#DEFINE LUCES PORTC,1
>> 1: Rotacin a la derecha, la cantidad de rotaciones es especificada por l nmero que tiene
enseguida.
<< 1: Rotacin a la izquierda, la cantidad de rotaciones es especificada por el nmero que tiene
enseguida.
Encender uno a uno los bits del puerto B, cada medio segundo, comenzando por RB0. En
ningn momento se pueden encender dos leds al mismo tiempo.
#INCLUDE <16f873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#BYTE PORTB= 6
MAIN()
{
SET_TRIS_B(OB00000000); //Configura el puerto B
WHILE(TRUE) // Haga por siempre
{
Encender uno a uno los bits del puerto B (0.5seg) desde RB0 hasta RB7 y luego apagarlos en
sentido contrario desde RB7 hasta RB0.
#INCLUDE<16F873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
5 terminales
#INCLUDE <16f873.h>
#fuses XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP,WRT
#use delay(clock=4000000)
MAIN()
{
SET_TRIS_C(OB11111111); //Configura el puerto C
SET_TRIS_B(OB00000000); //Configura el puerto B
WHILE(TRUE)
{
IF(BIT_TEST(SW)) // Pregunta si SW esta encendido
{
CONT=0; //Se pone Cont en cero
WHILE((CONT<4)&&(BIT_TEST(SW))) //Mientras que cont sea menor a 4 //y
. SW=1(encendido)
{
PORTB=(HORARIO[CONT]); //Enve al puerto B la informacin //de
. //la tabla de horario
DELAY_MS(100); //Retardo de 30 milisegundos
CONT++; //Incremente la variable cont
}
}
Controlar un motor paso a paso conectado a los cuatro bits menos significativos del puerto B,
de tal manera que si el suiche conectado a RC0 esta en uno gire a la derecha y si el suiche
conectado a RC1 esta en uno, el motor gire a la izquierda.
#INCLUDE <16f873.h>
#fuses XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP,WRT
#use delay(clock=4000000)
Para manejar una estructura en C, lo nico que se debe hacer es aadir la estructura al
encabezado.
#INCLUDE <16F873.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
BYTE CONST DISPLAY[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#BYTE PORTB=6
INT CONTADOR;
MAIN()
{
SET_TRIS_B(0B00000000); //Configura el puerto B
WHILE(TRAE) // Haga por siempre
{
CONTADOR = 0; // Inicializa contador en cero
WHILE(CONTADOR<10) // Mientras contador < 10
{
}
}
}
#INCLUDE <16F873.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
BYTE CONST DISPLAY[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#BYTE PORTB=6
#BYTE PORTC=7
#DEFINE SW1 PORTC,0
#DEFINE SW2 PORTC,1
#DEFINE LED PORTC,4
INT CONTADOR;
MAIN()
{
SET_TRIS_B(0B00000000); //Configura el puerto B
SET_TRIS_C(0B00001111); //Configura el puerto B
CONTADOR = 0; // Inicializa contador en cero
WHILE(TRUE) // Haga por siempre
{
PORTB= DISPLAY[CONTADOR];
BIT_CLEAR(LED);
IF (BIT_TEST(SW1))
{
DELAY_MS(200); // Antirrebote
CONTADOR++;
PORTB= DISPLAY[CONTADOR];
IF(CONTADOR==10)
{
CONTADOR=0;
}
}
IF (BIT_TEST(SW2))
{
DELAY_MS(200);
BIT_SET(LED);
WHILE (CONTADOR>0)
{
PORTB= DISPLAY[CONTADOR];
DELAY_MS(1000);
CONTADOR--;
}
BIT_CLEAR(LED);
}
}
}
#INCLUDE <16F873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#BYTE PORTB= 6
#BYTE PORTC= 7
#DEFINE TUNI PORTC,4 //Definicin de variables
#DEFINE TDEC PORTC,5 //Definicin de variables
INT CONT; //Declarar la variable CONT como
//un entero, es decir de 8 bits
LONG CONTRET; //Declarar la variable CONTRET
//como long, es decir de 16 bits
MAIN()
En el ejemplo anterior se utilizan funciones, son pequeos subprogramas que se pueden llamar
desde el programa principal. Se debe digitar antes del programa principal que es quien las
llama.
Si la funcin no retorna ningn valor se pone la directiva VOID antes del nombre de la funcin
indicando que no retorna ningn valor.
#INCLUDE <16F873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#BYTE PORTB= 6
#BYTE PORTC= 7
#DEFINE TUNI PORTC,4 //Definicin de variables
#DEFINE TDEC PORTC,5 //Definicin de variables
INT CONT; //Declarar la variable CONT
. //como un entero.
MAIN()
{
SET_TRIS_B(0); //El puerto B esta configurado
como salida
SET_TRIS_C(0B11001111); // El puerto C esta configurado
//como entrada,
//excepto los bits RC4 y RC5
CONT=0; //la variable CONT se inicializa con
//cero
WHILE(TRUE) //Haga por siempre
{
CONT=76;
WHILE(TRUE) //Haga por siempre
{
MOSTRAR(); //Llamar la rutina Mostrar
}
}
}
Las interrupciones ocurren por sucesos externos como la generacin de un flanco o nivel en
una patica del microcontrolador o eventos internos tales como el desbordamiento de un
contador, terminacin del conversor anlogo a digital, entre otras.
Slo se trata en esta gua la interrupcin externa por cambio de estado en la patica RB0.
Los pasos que se deben seguir para atender una interrupcin, son los siguientes:
Digitar la funcin correspondiente a la interrupcin. La funcin debe comenzar con # y la
interrupcin correspondiente, por ejemplo para la funcin de interrupcin por RB0 se digita
#int_EXT
En el programa principal, habilitar las interrupciones en forma global, con la instruccin:
enable_interrupts(GLOBAL);
En el programa principal, habilitar la interrupcin correspondiente, como ejemplo se muestra
como habilitar la interrupcin externa por RB0:
enable_interrupts(INT_EXT);
#INT_EXT
VOID INTERRUPCION()
{
DELAY_MS(200);
CONT++; //Incremente la variable
//CONT
IF(CONT==10) //Si la variable CONT es igual a 10
CONT=0; //Ponga en cero la variable CONT
}
MAIN()
{
SET_TRIS_B(0B11111111); //Configurar el puerto B
SET_TRIS_C(0); //Configurar el puerto C
ENABLE_INTERRUPTS(GLOBAL); //Habilita todas las interrupciones
ENABLE_INTERRUPTS(INT_EXT); //Habilita la interrupcin externa
WHILE(TRUE)
{
PORTC= (display[CONT]); //Muestra lo que hay en la variable
//CONT en el display
}
}
1000000/RTCC_DIV_X
X = Este valor puede ser cualquiera de los indicados al principio, el que se elija ser con el que
se seguir trabajando en la programacin. En este caso el RTCC escogido es 256.
Observacin: estos dos valores son aleatorios y deben ser menores a 256.
3906 = 18 * 217
Cualquiera de estos dos valores pueden ser el valor inicial del timer 0. En este caso, se elige
18 como valor inicial del timer 0. Al obtener el valor inicial del timer 0 se debe restar el RTCC
utilizado, en este caso 256 para obtener el nmero donde el temporizador debe iniciar para que
en el momento que incremente las 18 veces llegue al valor del RTCC utilizado (256) y produzca
la interrupcin salto. Es decir:
18 Salto
238 255 0
Se genera la
interrupcin
WHILE(I>=10)
{
I=I -10;
DEC++;
}
UNI=I;
PORTC=display[UNI];
BIT_SET(U);
BIT_CLEAR(D);
PORTC=display[DEC];
BIT_SET(D);
BIT_CLEAR(U);
DELAY_MS(1);
}
IF(VECES==0)
{
SEG++;
VECES=217;
}
}
MAIN()
{
SET_TRIS_B(0);
SET_TRIS_C(0);
UNI=0;
DEC=0;
VECES=217;
SEG=0;
SET_RTCC(238);
SETUP_COUNTERS(RTCC_INTERNAL, RTCC_DIV_256);
ENABLE_INTERRUPTS(INT_RTCC);
ENABLE_INTERRUPTS(GLOBAL);
WHILE(TRUE)
{
IF(SEG==60)
SEG=0;
ELSE
MOSTRAR();
}
}
Hacer un contador de 0 a 9, de tal manera que incremente cada segundo por interrupcin a
travs del timer, al llegar a 9 comienza de nuevo.
#INCLUDE<16F873.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOLVP,NOWDT
BYTE CONST DISPLAY[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X67};
#BYTE PORTB=6
#DEFINE INTS_PER_SECOND 15 // (4000000/(4*256*256)) 4=4mhz, 256=
//Divisin 256, 256=Timer 256 se carga
//con cero.
BYTE SEGUNDOS;
MAIN()
{
SET_TRIS_B(0);
INT_CONTADOR=INTS_PER_SECOND;
SET_RTCC(0);
SETUP_COUNTERS( RTCC_INTERNAL, RTCC_DIV_256);
ENABLE_INTERRUPTS(INT_RTCC); //Habilita la interrupcin por RTCC
ENABLE_INTERRUPTS(GLOBAL); //Habilita todas las interrupciones
DO
{
IF(SEGUNDOS==10)
{
SEGUNDOS=0;
}
PORTB=(DISPLAY[SEGUNDOS]);
#INCLUDE <16F873.H>
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP,WRT
#USE DELAY(CLOCK=4000000)
Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#DEFINE USE_PORTB_KBD
#INCLUDE <KBD.C>
#BYTE PORTC= 7
#BYTE PORTB= 6
CHAR K;
VOID MAIN()
{
PORT_B_PULLUPS(TRUE); //Habilitar resistencias del puerto B a
// positivo
KBD_INIT(); //Inicializar la rutina del teclado
SET_TRIS_C(0); //Configurar el puerto C como salida
WHILE (TRUE)
{
K=0; //Ponga la variable K en cero
K=KBD_GETC(); //Captura cualquier tecla oprimida
IF(K=='0') //Si la tecla que se oprime es igual al
//caracter cero
PORTC=(display[0]);//Muestre en el display el nmero cero
IF(K=='1') //Si la tecla que se oprime es igual al
. //caracter uno
PORTC=( display [1]);//Muestre en el display el nmero uno
IF(K=='2') //Tecla que se oprime = al caracter
//dos
PORTC=( display [2]); //Muestre en el display el nmero
//dos
IF(K=='3') // Tecla que se oprime = al caracter
//tres
PORTC=( display [3]);//Muestre en el display el nmero tres
IF(K=='4') // Tecla que se oprime = caracter
//cuatro
PORTC=( display [4]);//Muestre en el display el nmero cuatro
IF(K=='5') // Tecla que se oprime = caracter
//cinco
PORTC=( display [5]);//Muestre en el display el nmero cinco
IF(K=='6') // Tecla que se oprime = caracter
Mostrar el numero digitado por el teclado en el display y cuando se oprima la tecla #, el display
comienza a decrementar cada segundo hasta llegar a cero.
#INCLUDE <16F873.H>
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP,WRT
#USE DELAY(CLOCK=4000000)
Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#DEFINE USE_PORTB_KBD
#INCLUDE <KBD.C>
#BYTE PORTC= 7
#BYTE PORTB= 6
CHAR K;
INT CONT;
VOID MAIN()
{
PORT_B_PULLUPS(TRUE); //Habilitar resistencias del puerto B a
//positivo
KBD_INIT(); //Inicializar la rutina del teclado
SET_TRIS_C(0B00000000); //Configurar el puerto C como salida
CONT=0; //Carga el contador con cero
PORTC=( display [CONT]); //Muestra el cero en el display
WHILE (TRUE)
{
IF(K=='0') //Si la tecla que se oprime es
//igual al caracter uno
{
CONT=0;
PORTC=( display [CONT]); //Muestre en el display el nmero
//uno
}
IF(K=='1') //Si la tecla que se oprime es igual al
//caracter uno
{
CONT=1;
PORTC=( display [CONT]); //Muestre en el display el nmero
//uno
}
IF(K=='2') //Si la tecla que se oprime es igual
// al caracter dos
{
CONT=2;
}
IF(K=='4') //Si la tecla que se oprime es igual
// al caracter cuatro
{
CONT=4;
PORTC=( display [CONT]); //Muestre en el display el nmero
//cuatro
}
IF(K=='5') //Si la tecla que se oprime es igual al
//caracter cinco
{
CONT=5;
PORTC=( display [CONT]); //Muestre en el display el nmero
//cinco
}
IF(K=='6') //Si la tecla que se oprime es igual
// al caracter seis
{
CONT=6;
PORTC=( display [CONT]); //Muestre en el display el nmero
//seis
}
IF(K=='7') //Si la tecla que se oprime es igual
// al caracter siete
{
CONT=7;
PORTC=( display [CONT]); //Muestre en el display el nmero
//siete
}
IF(K=='8') //Si la tecla que se oprime es igual
// al caracter ocho
{
CONT=8;
PORTC=( display [CONT]); //Muestre en el display el nmero
//ocho
}
IF(K=='9') //Si la tecla que se oprime es igual
// al caracter nueve
{
CONT=9;
PORTC=( display [CONT]); //Muestre en el display el nmero
//nueve
}
IF(K=='#') //Si la tecla que se oprime es igual
// al caracter #
{
WHILE(CONT>0) //Mientras el contador sea mayor a
//cero
{
Existe en el compilador un driver para manejar un display de cristal lquido de 2 lneas por 16
caracteres cada una.
El procedimiento para trabajar con el LCD es parecido al procedimiento del teclado telefnico.
La conexin entre el LCD y el microcontrolador es la siguiente:
+5V
+5V
Los pasos que se deben seguir para manejar 3. En el programa principal se inicializa
el LCD son: el driver LCD_INIT();
(16,
(1,
Mostrar un mensaje fijo en el LCD que en la primera fila GUIA EN PIC C y en la segunda
EAFIT.
+5V
5K
#INCLUDE <16F873.H>
#USE DELAY(CLOCK=4000000)
#DEFINE USE_PORTB_LCD TRUE
#INCLUDE <LCD.C>
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP,WRT
#BYTE PORTB= 6
MAIN()
{
SET_TRIS_B(0); //Define el puerto B como salida
WHILE(TRUE)
{
LCD_GOTOXY(1,1); //En la fila 1
LCD_PUTC(" GUIA EN PIC C "); //Muestre el mensaje GUIA EN
//PIC C
LCD_GOTOXY(1,2); //Ubicarse en la columna 1 fila 2
LCD_PUTC(" EAFIT "); // Sacar el mensaje EAFIT
} //Cierra while true
}
#INCLUDE <16F873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
#DEFINE USE_PORTB_LCD TRUE
#INCLUDE <LCD.C>
#BYTE PORTC= 7
#DEFINE PULSADOR1 PORTC,0
#DEFINE PULSADOR2 PORTC,1
#DEFINE PULSADOR3 PORTC,2
MAIN()
{
} //Cerrar main
Mostrar el mensaje BIENVENIDOS en la primera lnea del LCD, que se vaya desplazando y
luego el mensaje fijo SELECCIONE MENU en la segunda lnea.
#INCLUDE <16F873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
#DEFINE USE_PORTB_LCD TRUE
#INCLUDE <LCD.C>
#BYTE PORTC= 7
BYTE J;
VOID MAIN()
{
SET_TRIS_C(0B11111111); //Configurar el puerto C como entrada
LCD_INIT(); //Inicializar el LCD
J=16;
WHILE (J>0) //Mientras J sea mayor que 0
{
LCD_PUTC("\f"); //Borrar el contenido del LCD
LCD_GOTOXY(J,1); //En la fila 1
LCD_PUTC(" BIENVENIDOS "); //Mostrar el mensaje BIENVENIDOS
DELAY_MS(150); //Esperar 150 milisegundos
J--;
}
WHILE(1) //Haga por siempre
{
LCD_GOTOXY(J,2); //En la fila 2
LCD_PUTC("SELECCIONE MENU:"); //Mostrar SELECCIONE MENU
}
} //Cerrar main
+5V
Mostrar en el LCD los nmeros digitados por el teclado telefnico, hasta completar 16 nmeros.
#INCLUDE <16F873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD //Por defecto el teclado se conecta al puerto D,
//como el microcontrolador que se esta usando
//no tiene puerto D se conecta al puerto B.*/
#INCLUDE <LCD.C>
#INCLUDE <KBD.C> //Incluir en el encabezado el driver para
//manejar el teclado telefnico:*/
#BYTE PORTC= 7
#DEFINE INC PORTC,0
#DEFINE DEC PORTC,1
#DEFINE START PORTC,2
CHAR K;
INT DIR;
VOID MAIN()
{
port_b_pullups(TRUE); //En el programa principal habilitar las
//resistencias pullup del puerto B, con esto
WHILE(1)
{
DIR=0;
LCD_PUTC("\f");
while (DIR<17)
{
k=kbd_getc(); //Llamar la funcin del teclado y almacenar el
//valor digitado en una variable tipo carcter. Si
//no se oprime ninguna tecla el teclado
//retornara el carcter nulo.*/
WHILE( (k=='\0')) //si no se oprime ninguna tecla sigue //llamando
//al teclado.
{
k=kbd_getc();
}
if( (k!='*')&&(k!='#'))
{
lcd_putc(k);
DIR++;
}
}
}
}
#INCLUDE <16f873.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD //Se aade esta instruccin porque por defecto
//el teclado se conecta al puerto D en este caso
//se esta usando el puerto B.*/
#INCLUDE<KBD.C> //Incluir en el encabezado el driver para
//manejar el teclado telefnico:*/
#INCLUDE<LCD.C>
#BYTE PORTC= 7
#BYTE PORTB= 6
#DEFINE LED1 PORTC,7
#DEFINE LED2 PORTC,4
INT CONT;
BYTE J=16;
CHAR K;
INT MIL,CEN,DEC,UNI,VAL;
VOID TECLADO()
{
k=kbd_getc(); //Llamar la funcin del teclado y almacenar
//el valor digitado en una variable tipo
TECLADO();
LCD_PUTC("\f");
LCD_GOTOXY(1,1);
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
UNI=VAL;
}
TECLADO();
ELSE
{
LCD_PUTC("\f");
LCD_GOTOXY(1,2);
LCD_PUTC(" CLAVE INVALIDA ");
BIT_SET(LED2);
DELAY_MS(4000);
BIT_CLEAR(LED2);
}
}
}
#INCLUDE<16F873.H>
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP,WRT
#USE DELAY(CLOCK=4000000)
#BYTE PORTC= 7
EEPROM
EXT
Los pasos que se deben seguir para almacenar datos en memoria eeprom externa son:
1. En el encabezado del programa incluir el driver para manejar la memoria eeprom
externa (en el ejemplo se trabaja con la 24LC02)
#INCLUDE<2402.C>
Con un teclado telefnico, un LCD y una memoria eeprom externa digitar 4 nmeros y luego
recuperarlos, en el LCD mostrar el valor digitado y el valor recuperado.
+5K
+5V
1 8 +5V
2
3
4
+5V +5V
#INCLUDE<16F873.H>
#USE DELAY(CLOCK=4000000)
#DEFINE USE_PORTB_KBD
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP,WRT
#DEFINE USE_PORTB_LCD TRUE
#INCLUDE <LCD.C>
#INCLUDE <KBD.C>
#INCLUDE <2402.C>
CHAR K; //Defino la variable K como carcter
BYTE J=16,DIR;
MAIN()
{
PORT_B_PULLUPS(TRUE); //Activar las resistencias a positivo del
//puerto B
LCD_INIT();
KBD_INIT();
INIT_EXT_EEPROM();
resolucin =
(VREF GND )
1024
As, por ejemplo, si VREF = +5V y VREF- es 0V, la resolucin es 5V/1024 = 4.8mV, cuando la
seal anloga sea 0V le corresponde un nmero digital = 0000000000 y para 5V ser
1111111111.
Si VREF+ = +5V y VREF- se puede determinar en todo momento a que nmero digital aproximado
corresponde cualquier seal anloga de entrada, con la frmula:
V Entrada V
= Entrada
4.8mV 0.0048V
Por ejemplo si la seal anloga es 2V, el nmero digital aproximado, es:
416
2V =
0.0048
La tensin de referencia VREF+ puede implementarse con la tensin interna de alimentacin
VDD, o bien, con una externa que se pone en la patica RA2/AN2/ VREF-.
A: Entrada anloga.
D: Entrada/salida digital.
a. SETUP_ADC_PORTS(Valor);
Esta funcin configura los pines del ADC para que sean entradas anlogas,
digitales o alguna combinacin de ambos. Las combinaciones permitidas varan de
acuerdo al microcontrolador.
b. SETUP_ADC (Modo)
Selecciona el tipo de reloj del conversor A/D
Modo puede ser:
ADC_CLOCK_DIV_2
ADC_CLOCK_DIV_8
ADC_CLOCK_DIV_32
ADC_CLOCK_INTERNAL
c. SET_ADC_CHANNEL (Canal)
Especifica el canal a utilizar por la funcin
READ_ADC()
Mostrar en el LCD el valor numrico correspondiente a la seal anloga que entra por RA0.
#INCLUDE <16F873.H>
#DEVICE ADC=10 //Define que el conversor trabaja a
//10 bits
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#BYTE PORTA=5
#DEFINE USE_PORTB_LCD TRUE
#INCLUDE <LCD.C>
LONG VOLTAJE; //Definir la variable VOLTAJE como
//una variable tipo LONG
MAIN()
{
SET_TRIS_A(0B11111111); //Configura todo el puerto A como
//entrada
SETUP_ADC_PORTS(ALL_ANALOG); //Define todo el puerto A
//como entradas anlogas
SETUP_ADC(ADC_CLOCK_INTERNAL); //Define que el conversor
//trabaje con el reloj interno
LCD_INIT(); //Inicializa LDC
WHILE(1)
{
SET_ADC_CHANNEL(0); //Selecciona el canal 0 (RA0)
DELAY_MS(1); //Llama un retardo de 1 milisegundo
VOLTAJE=READ_ADC(); //Almacena en VOLTAJE el valor
//de la conversin
LCD_PUTC("\f");
LCD_GOTOXY(1,1);
LCD_PUTC("CONVERSOR A/D");
#INCLUDE <16F873.H>
#INCLUDE <16F873.H>
#USE DELAY(CLOCK=4000000)
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
#DEFINE USE_PORTB_LCD TRUE
#INCLUDE <LCD.C>
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP,WRT
#BYTE PORTB= 6
#BYTE PORTC= 7
MAIN()
{
CHAR K; //Definir la variable K como una
//variable tipo caracter
http://scmstore.com/micros/PICC/
El PicC C Compiler fue desarrollado para cumplir con las especificaciones del lenguaje ANSI
C. El compilador produce tres tipos de archivos. Archivos con extensin .hex que le permitir
grabar el programa ejecutable en el PIC por medio del uso de un programador. El archivo con
extensin .asm contendr un listado en assembler del programa compilado con la
informacin del mapeo de memoria. Estos archivos son muy tiles para el debugging de los
programas y para determinar la cantidad de pasos de programas (ciclos de ejecucin) tiene la
aplicacin. Los archivos con extensin .pre contienen la informacin preprocesada del
programa, #defines, #includes, etc. La cual es expandida y guardada en el archivo.
Es el producto ideal para aquellas personas que le gusta desarrollar en bajo nivel con los
recursos de un lenguaje de alto nivel como el C. Se recomienda ser utilizado por personas
vinculadas con la programacin y sintaxis de C.
Beneficios
Los iconos de guardar, abrir, nuevo, funcionan igual que en archivo de Microsoft.
Los iconos nuevos y ms utilizados son:
1. File New.
2. Se guarda el archivo
3. Sale una hoja con el nombre que se le puso
4. Se escribe el programa
Cuando termina la compilacin este genera un cuadro donde muestra: el nombre del archivo,
los errores, la memoria que se utiliz, etc.
Nota: Los errores ms comunes son: corchetes, punto y coma, palabras mal escritas, etc.
7. Al compilar se debe tener mucho cuidado con el archivo que se esta compilando, porque
cuando hay varios abiertos el programa no sabe cual compilar.
Nota: Para que se compile el que debe ser, se debe cerrar los otros archivos.
8. Para saber que archivo es el que se quiere cerrar o el que se esta utilizando, slo se debe
observar que pestaa es la que sobresale.
Nota: La que sobresale es el archivo que esta activo.
El programa donde se quema el programa realizado en PIC C, se llama ICPROG. Los pasos
que se deben seguir son:
1. Abrir el programa.
2. Seleccionar el microcontrolador que se va a utilizar.
3. Cargar el programa
NOTA: Los que estn programando en PIC C C, desde el comienzo deshabilitan estos bits al
escribir:
7.1 Al presionar el icono aparece una ventana de confirmacin: Realmente desea programar el
dispositivo?
7.2 Cuando termina de programar aparece una ventana de informacin, que dice: Verificacin
correcta!
8.1 Cuando termina, sale una ventana indicando que ya el dispositivo esta borrado.
Elaborado por: