You are on page 1of 123

Circuitos Integrados Programables

Juan Antonio Barrios Huzar 2



INTRODUCCIN
En 1980 aproximadamente, los fabricantes de circuitos integrados iniciaron
la difusin de un nuevo circuito para control, medicin e instrumentacin al que
llamaron microcomputador en un slo chip, o de manera ms exacta
MICROCONTROLADOR.
Los microcontroladores estn conquistando el mundo. Estn presentes en
nuestro trabajo, en nuestra casa y en nuestra vida en general. Se pueden
encontrar en el ratn y teclados de las computadoras, en los telfonos, en los
hornos microondas y en los televisores de nuestro hogar. Pero la invasin acaba
de comenzar y el nacimiento del siglo XXI ser testigo de la conquista masiva de
estas diminutas computadoras, que controlarn la mayor parte de los aparatos que
fabricamos y usamos.
Las extensas reas de aplicacin de estos microcontroladores exigirn un
gigantesco trabajo de diseo y fabricacin. Aprender a manejar y aplicar
microcontroladores slo se consigue desarrollando prcticamente diseos reales.

QU ES UN MICROCONTROLADOR?
Un microcontrolador es un circuito integrado que contiene toda la estructura
(arquitectura) de un microcomputador, o sea CPU, RAM, ROM y circuitos de
entrada y salida. Son componentes que integran en un nico dispositivo todos los
circuitos necesarios para realizar un completo sistema digital programable,
incluyendo convertidores anlogo digital, temporizadores, contadores y un
sistema para permitir la comunicacin en forma serial o en paralelo.


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 3

QU ES UN PIC?
Es un microcontrolador creado por la empresa MICROCHIP TECHNOLOGY
INC. conocido como Circuito Integrado Programable (Programmable Integrated
Circuits=PIC), son componentes sumamente tiles en los Sistemas de Desarrollo
en la Electrnica de Control y en la Electrnica Robtica.
Los PIC se presentan externamente como los normales
circuitos integrados TTL o CMOS, pero internamente disponen de todos los
dispositivos tpicos de un sistema microprocesador es decir:
Una CPU (Central Processor Unit es decir, unidad central de
procesamiento)
cuyo objeto es el de interpretar las instrucciones de programa.
Una memoria PROM ( Programable Read Only Memory es decir, memoria
programable de solo lectura) en la cual son memorizadas en manera
permanente las instrucciones del programa a seguir.
Una memoria RAM (Random Access Memory es decir, memoria de acceso
casual) utilizada para memorizar las variables utilizadas en el programa.
Una serie de LINEAS DE I/O para manejar dispositivos externos o recibir
impulsos de sensores, pulsantes, etc.
Una serie de dispositivos auxiliares para el funcionamiento tales como
generadores de reloj, bus, contadores, etc.
La presencia de todos estos dispositivos en un espacio extremadamente
reducido, le da al proyectista enormes ventajas derivadas del uso de un sistema a
microprocesador, debido a que estos hace poco tiempo se construan con circuitos
tradicionales.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 4

Los PIC son disponibles en una amplia gama de modelos para adaptarse mejor
a las exigencias de los proyectos, diferencindose por l numero de lneas I/O y
por la dotacin de dispositivos. Se parte de los modelos ms pequeos
identificados con la sigla PIC12Cxx dotados de solo 8 pines, hasta llegar a
modelos ms grandes con una sigla PIC17Cxx dotados de 40 pines.

QU ES UN SISTEMA DE DESARROLLO?
Un sistema de desarrollo esta formado por el conjunto de herramientas,
tanto de tipo hardware como software, que se necesitan para desarrollar un diseo
con microcontroladores. Se puede comenzar con un sistema de desarrollo mnimo
con las herramientas imprescindibles e irlo ampliando hasta configurar un equipo
ms profesional. Uno de los mayores atractivos de los microcontroladores PIC es
la inmensa oferta de herramientas de desarrollo disponible a todos los niveles.

CARACTERSTICAS DE LOS PIC
1. La arquitectura del procesador sigue el modelo Harvard, En esta
arquitectura, el CPU se conecta de forma independiente y con buses
distintos con la memoria de instrucciones y con la de datos. La arquitectura
Harvard permite al CPU acceder simultneamente a las dos memorias.
Adems, propicia numerosas ventajas al funcionamiento del sistema como
se irn describiendo.
2. Se aplica la tcnica de segmentacin ("pipe-line") en la ejecucin de las
instrucciones. La segmentacin permite al procesador realizar al mismo
tiempo la ejecucin de una instruccin y la bsqueda del cdigo de la
siguiente. De esta forma se puede ejecutar cada instruccin en un ciclo (un
ciclo de instruccin equivale a cuatro ciclos de reloj). La segmentacin

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 5
permite al procesador ejecutar cada instruccin en un ciclo de instruccin
equivalente a cuatro ciclos de reloj. En cada ciclo se realiza la bsqueda de
una instruccin y la ejecucin de la anterior. Las instrucciones de salto
ocupan dos ciclos al no conocer la direccin de la siguiente instruccin
hasta que no se haya completado la de bifurcacin.
3. El formato de todas las instrucciones tiene la misma longitud. Todas las
instrucciones de los microcontroladores de la gama baja tienen una longitud
de 12 bits. Las de la gama media tienen 14 bits y ms las de la gama alta.
Esta caracterstica es muy ventajosa en la optimizacin de la memoria de
instrucciones y facilita enormemente la construccin de ensambladores y
compiladores.
4. Procesador RISC (Computador de Juego de Instrucciones Reducido). Los
modelos de la gama baja disponen de un repertorio de 33 instrucciones, 35
los de la gama media y casi 60 los de la alta.
5. Todas las instrucciones son ortogonales. Cualquier instruccin puede
manejar cualquier elemento de la arquitectura como fuente o como destino.
6. Arquitectura basada en un banco de registros. Esto significa que todos los
objetos del sistema (puertos de E/S, temporizadores, posiciones de
memoria, etc.) estn implementados fsicamente como registros.
7. Diversidad de modelos de microcontroladores con prestaciones y recursos
diferentes. La gran variedad de modelos de microcontroladores PIC permite
que el usuario pueda seleccionar el ms conveniente para su proyecto.
8. Herramientas de soporte potentes y econmicas. La empresa Microchip y
otras que utilizan los PIC ponen a disposicin de los usuarios numerosas
herramientas para desarrollar hardware y software. Son muy abundantes
los programadores, los simuladores software, los emuladores en tiempo
real, ensambladores, Compiladores C, Intrpretes y Compiladores BASIC,
etc.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 6

Los microcontroladores de Microchip combinan un alto desempeo a un
bajo costo, en un empaquetado pequeo; ofreciendo la mejor relacin
precio/rendimiento en la industria. Mas de 200 millones de estos productos se
distribuyen cada ao para satisfacer los consumibles: perifricos de computadora,
automatizacin de oficinas, sistemas de control automotriz, aplicaciones en
seguridad y telecomunicaciones. La combinacin de los microcontroladores de 8-
bit, con las tecnologas de EEPROM, memoria FLASH, memoria ROM y la
industria, hacen de Microchip un lder proveedor en el desarrollo de herramientas
para ajustarse mejor a las necesidades reales.
El alto nivel de integracin reduce notablemente la cantidad de
componentes externos y los costos de desarrollo, mejora el desempeo del
sistema, reduce la interferencia electromagntica, minimiza el consumo de
potencia y agiliza el tiempo de realizacin. Los microcontroladores cuentan
adems con un set de instrucciones compatible, y una gran variedad de perifricos
y un amplio rango de empaquetados y rangos de voltaje, todo esto para ajustarse
mejor a las demandas en los sistemas actuales.
La arquitectura RISC (Reduced Instuction Set Computer) de 8-bit de los
microcontroladores PIC se ha vuelto estndar alrededor del mundo. Todos los
microcontroladores PIC emplean una arquitectura RISC modificada y un poderoso
set de instrucciones que reduce dramticamente los ciclos de ejecucin y el costo.
Combinando las caractersticas RISC con una arquitectura Harvard de bus-
dual, los microcontroladores PIC de 8-bit de Microchip son mas rpidos y flexibles
y es el ncleo de la arquitectura mas popular para los nuevos diseos de
microcontroladores. Disminuyendo, a su vez, la migracin entre las familias de
productos debido al simple set de instrucciones.



Circuitos Integrados Programables
Juan Antonio Barrios Huzar 7
VENTAJAS
Las instrucciones de 12-,14-, y 16-bit de ancho son compatibles con los
dispositivos siguientes-posteriores, para maximizar la eficiencia en el
procesamiento y el funcionamiento. Las instrucciones y los datos son transferidos
en buses separados permitiendo el procesamiento simultneo.
sta arquitectura de dos estados permite que una instruccin se este
ejecutando mientras la siguiente se esta cargando. Instrucciones de palabras de
un ancho sencillo, incrementando la eficiencia del software y reduciendo los
requerimientos de memoria para el programa. Instrucciones sencillas, rpidas y
fciles de aprender.
Compatibilidad entre los dispositivos, lo que permite realizar el cdigo para
un dispositivo y poder utilizarlo para otro mejorado (superior). Para resolver
aplicaciones sencillas se precisan pocos recursos; en cambio, las aplicaciones
grandes requieren numerosos y potentes. Siguiendo esta filosofa, Microchip
construye diversos modelos de microcontroladores orientados a cubrir, de forma,
las necesidades de cada proyecto. As, hay disponibles microcontroladores
sencillos y baratos para atender las aplicaciones simples y otros complejos y ms
costosos para las de mucha envergadura.
Entre los fabricantes de microcontroladores hay dos tendencias para
resolver las demandas de los usuarios:
1. MICROCONTROLADORES DE ARQUITECTURA CERRADA
Cada modelo se construye con un determinado CPU, cierta capacidad de
memoria de datos, cierto tipo y capacidad de memoria de instrucciones, un
nmero de E/S y un conjunto de recursos auxiliares muy concreto. El modelo no
admite variaciones ni ampliaciones. La aplicacin a la que se destina debe
encontrar en su estructura todo lo que precisa y, en caso contrario, hay que
desecharlo. Microchip ha elegido principalmente este modelo de arquitectura.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 8

2. MICROCONTROLADORES DE ARQUITECTURA ABIERTA
Estos microcontroladores se caracterizan porque, adems de disponer de
una estructura interna determinada, pueden emplear sus lneas de E/S para sacar
al exterior los buses de datos, direcciones y control, con lo que se posibilita la
ampliacin de la memoria y las E/S con circuitos integrados externos.
Microchip dispone de modelos PIC con arquitectura abierta, sin embargo,
esta alternativa se escapa de la idea de un microcontrolador incrustado y se
asemeja a la solucin que emplean los clsicos microprocesadores. En nuestra
opinin, los verdaderos microcontroladores responden a la arquitectura cerrada y
permiten resolver una aplicacin con un solo circuito integrado y a precio muy
reducido.
La mayora de los sistemas de control incrustados requieren CPU, memoria
de datos, memoria de instrucciones, lneas de E/S, y diversas funciones auxiliares
como temporizadores, comunicacin serie y otras.
La capacidad y el tipo de las memorias, el nmero de lneas de E/S y el de
temporizadores, as como circuitos auxiliares, son parmetros que dependen
exclusivamente de la aplicacin y varan mucho de unas situaciones a otras.
Microchip oferta tres gamas de microcontroladores de 8 bits. Con las tres
gamas de PIC se dispone de gran diversidad de modelos y encapsulados,
pudiendo seleccionar el que mejor se acople a las necesidades de acuerdo con el
tipo y capacidad de las memorias, el nmero de lneas de E/S y las funciones
auxiliares precisas.
Sin embargo, todas las versiones estn construidas alrededor de una
arquitectura comn, un repertorio mnimo de instrucciones y un conjunto de
opciones muy apreciadas, como el bajo consumo y el amplio margen del voltaje de
alimentacin.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 9
Junto con los microcontroladores, Microchip ha creado una serie de
herramientas de ayuda al desarrollo del hardware y software de los proyectos de
aplicacin, que son vlidas para la mayora de sus modelos y que se citan a
continuacin.
1 Ensamblador MPASM.
2 Simulador software MPSlM. No soporta los modelos PICI7CXX.
3 Compilador de lenguaje C, MP-C.
4 Programador universal PRO MATE.
5 Emulador universal PIC MASTER.
6 Entorno de Desarrollo Integrado MPLAB
7 Herramienta econmica de desarrollo PICSTART
PIC16C5X FAMILIA BASE
La familia 16C5X se consolido como la base en el desarrollo de nuevas
tecnologas ofreciendo la solucin costeable mas efectiva. Estos
microcontroladores cuentan con un conjunto de instrucciones de 12-bit de ancho y
se ofrecen en empaquetados de 18, 20 y 22 pines.
En opciones de empaquetado SOIC o SSOP. Con bajo voltaje de operacin
hasta de 2 volt, hacen de esta familia un elemento ideal para ser operado por
aplicaciones a bateras.
PIC16C5XX FAMILIA DE RANGO MEDIO
La familia de rango medio ofrece un amplio rango de opciones, desde
empaquetados de 18 hasta 44 pines, as como un alto nivel de integracin de
perifricos. Esta familia cuenta con un conjunto de instrucciones de 14-bit de
ancho y la capacidad de manejar interrupciones.
PIC 17CXX FAMILIA DE RANGO ALTO
Esta familia de alto rendimiento ofrece la mas alta velocidad de ejecucin de
todos los microcontroladores de 8-bit de la industria. Utilizando una arquitectura de

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 10
instrucciones de 16-bit , mejora el conjunto de instrucciones y las capacidades de
interrupcin.

EL PICSTAR
El PICSTART Lite es una herramienta que nos ayuda a programar de
manera rpida las aplicaciones desarrolladas para los microcontroladores de la
familia PIC16C5X y mejorados, como tambin el PIC16C61, PIC16C71 y el
microcontrolador PIC16C84.
El programador PICSTART Lite es un dispositivo basado en una interfaz de
DOS (modo de TEXTO) el cual puede ser manejado por cualquier IBM o PC
compatible. En el manual que ser provisto en esta parte del proyecto, constara
entonces con la informacin sobre las familias de microcontroladores (arquitectura
y operacin, tipos y formatos de las instrucciones, interrupciones y timers) y la
manera de programarlos (rutinas y subrutinas, llamadas y saltos,
direccionamientos y pilas, E/S y prioridades).
El PICSTART Lite cuenta con una interfaz propia y el software para su
manejo, se requerir nicamente el conectarla a una computadora que cumpla con
los requerimientos mnimos y el software necesario, a travs de la cual se
realizara la programacin.
El primer paso en un diseo basado en microcontrolador habindose ya
seleccionado el controlador adecuado de acuerdo a las caractersticas del mismo
y las necesidades del problema consiste en escribir el cdigo fuente del programa
en el lenguaje seleccionado (en este caso lenguaje ensamblador). Posteriormente
viene la compilacin y ensamblado del programa, siguiendo la depuracin y
simulacin del mismo. Para todo ello es necesario seguir una cierta metodologa
en la creacin de nuestros programas respetando:


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 11

A) CAMPOS PARA ETIQUETAS
La mayora de los ensambladores establecen un lmite al tamao de las
etiquetas del programa as como los caracteres que se pueden usar en ellas.
B) CAMPOS DE INSTRUCCIONES
Es el espacio dedicado a escribir las directivas del programa.
C) CAMPOS DE DATOS
Contiene los datos u operandos para las instrucciones, que pueden ser
registros y/o constantes; aunque algunas instrucciones no llevan datos existen
otras que llevan varios separados por comas.
D) CAMPOS DE COMENTARIOS
Los comentarios son uno de los trabajos mas importantes que el programador
debe desarrollar a la hora de escribir el cdigo ya que describen la tarea que estn
tratando de realizar las instrucciones, as como las directivas propias del programa
y las extensiones que deben seguir los archivos.
El PICSTAR Lite se basa en la compatibilidad de los pines en los
dispositivos microcontroladores; esto es dispositivos que tienen el mismo tipo de
empaquetado, localizacin de los pines VDD , VSS y MCLR.
Esto nos permite operar diferentes dispositivos en el mismo socket.
Los dispositivos compatibles requieren solamente cambios menores en el software
para permitir una operacin apropiada en el socket de aplicacin. No todos los
dispositivos con el mismo tamao de empaquetado son compatibles en los pines;
por ejemplo el PIC16C62 es compatible con el PIC16C63 pero no lo es con el
PIC16C55.


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 12

La compatibilidad con los pines no quiere decir que el dispositivo ofrece las
mismas caractersticas. Como por ejemplo, el PIC16C54 es compatible en sus
pines con el PIC16C71, pero no tiene un convertidor A/D o interrupciones.

Dispositivos Pin-Compatibles Empaquetado
PIC16C61, PIC16C620, PIC16C621,
PIC16C622, PIC16C71, PIC16C84,
PIC16C54, PIC16C54A, PIC16CR54,
PIC16C56, PIC16C58A, PIC16CR58A
18 pines
PIC16C62, PIC16C63, PIC16C73 28 pines
PIC16C55, PIC16C57, PIC16CR57A 28 pines
PIC17C42, PIC17C43, PIC17C44 40 pines
PIC16C64, PIC16C65, PIC16C74 40 pines















Circuitos Integrados Programables
Juan Antonio Barrios Huzar 13




























Circuitos Integrados Programables
Juan Antonio Barrios Huzar 14

PIC 16F84
El " PIC 16F84 " es un MICROCONTROLADOR
con memoria de programa tipo FLASH, lo que
representa gran facilidad en el desarrollo de
prototipos y en su aprendizaje ya que no se
requiere de borrado con luz ultravioleta como las
versiones EPROM sino, permite reprogramarlo
nuevamente si ser borrado con anterioridad.
El PIC 16C84 es un microcontrolador de la familia MICROCHIP, totalmente
compatible con el PIC 16F84. Su principal caracterstica es que posee memoria
"EEPROM" en lugar de memoria Flash, pero su manejo es igual. Con respecto al
PIC16F84, este microcontrolador presenta dos diferencias:
La memoria de datos tiene menor tamao, aqu se tienen 32 registros de
propsito general (el mapa de memoria de datos llega hasta 2Fh).
En el momento de programar el microcontrolador, el fusible de seleccin del
temporizador de arranque (Power Up Timer) trabaja de forma inversa, es
decir, si en el PIC 16F84 se selecciona la opcin "Low" para activarlo, en el
PIC 16C84 se debe seleccionar "High".
Este microcontrolador ha sido reemplazado de forma gradual por el PIC 16F84,
por lo tanto, los diseos que lo utilicen como elemento de control deben ser
actualizados. Aunque, como se ve, es un proceso casi transparente.
Este microcontrolador se basa en la Arquitectura Harvard, en la cual el
programa y los datos se pueden trabajar desde memorias separadas, lo que
posibilita que las instrucciones y los datos posean longitudes diferentes. Esta
misma estructura es la que permite la superposicin de los ciclos de bsqueda y

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 15
ejecucin de las instrucciones, lo cual se ve reflejado en una mayor velocidad del
microcontrolador.
En la figura siguiente se muestra el esquema a bloques simplificado de la
arquitectura interna del PIC16F84.







Circuitos Integrados Programables
Juan Antonio Barrios Huzar 16
MEMORIA DE PROGRAMA
Las posiciones de memoria presentes en el
REGITER FILE son direccionables directamente
en una longitud de memoria que va de 00H a 2FH
para un total de 48 byte, denominada pagina 0.
Un segundo segmento de direccionamiento
denominado pagina 1 va de 80H a AFH. Para
acceder a este segundo espacio es necesario
recurrir a los dos bit auxiliares RP0 y RP1.
Las primeras 12 posiciones de la pagina 0
(de 00H a 0BH) y de la pagina 1 ( de 80H a 8BH )
son aquellas reservadas a las funciones
especiales de funcionamiento del PIC y como
dijimos, no pueden ser utilizadas para otros fines.
Las 36 posiciones de la pagina 0
direccionables de 0CH a 2FH pueden ser
utilizadas libremente por nuestros programas para
memorizar variables, contadores, etc.

MEMORIA EEPROM
Es una memoria de 1 Kbyte de longitud con palabra de 14 bits. Como es del
tipo FLASH se puede programar y borrar elctricamente, en otras palabras, se
puede programar o borrar sin necesidad de un borrador de luz ultravioleta, lo que
facilita el desarrollo de programas y la experimentacin. Como el PIC 16F84 tiene
un contador de programa de 13 bits, tiene una capacidad de direccionamiento de
8K x 14, pero solamente tiene implementado el primer 1K x 14 (000h hasta
03FFh). Si se direccionan posiciones de memoria superiores a 3FFh se causar
un solapamiento o desborde con el espacio del primer 1K.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 17

VECTOR DE RESET
Cuando ocurre un reset o se enciende el microcontrolador, el contador de
programa se pone en ceros (000h). Por esta razn, en la primera direccin del
programa se debe escribir todo lo relacionado con la iniciacin del mismo.

VECTOR DE INTERRUPCION
Cuando el microcontrolador recibe una seal de interrupcin el contador de
programa apunta a la direccin 04h de la memoria de programa, por eso all se
debe escribir toda la programacin necesaria para atender dicha interrupcin.

REGISTROS (Memoria RAM)
El PIC 16F84 puede direccionar 128 posiciones de memoria RAM, pero
solamente tiene implementado fsicamente los primeros 80 (0 a 4Fh). De estos los
primeros 12 son registros que cumplen un propsito especial en el control del
microcontrolador y los 68 siguientes son registros de uso general que se pueden
usar para guardar los datos temporales de la tarea que se esta ejecutando. Los
registros estn organizados como dos bancos (paginas) de 128 posiciones de 8
bits cada una (128 x 8); todas las posiciones se pueden accesar directa o
indirectamente (estas ultimas a travs del registro FSR). Para seleccionar que
pagina de registro se trabaja en un momento determinado se utiliza el bit RP0 del
registro STATUS.




Circuitos Integrados Programables
Juan Antonio Barrios Huzar 18

PINES Y FUNCIONES

Los PUERTOS son el puente entre el microcontrolador y el mundo exterior.
Son lneas digitales que trabajan entre cero y cinco voltios y se pueden configurar
como entradas o como salidas.
El PIC 16F84 tiene dos puertos. El puerto A con 5 lneas y el puerto B con
8 lneas. Cada pin se puede configurar como entrada o como salida independiente
programado por un par de registros diseados para tal fin. En ese registro un "0"
configura el pin del puerto correspondiente como salida y un "1" lo
configura como entrada.


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 19

PUERTO A
RA0 = Pin de Entrada/Salida (TTL).
RA1 = Pin de Entrada/Salida (TTL).
RA2 = Pin de Entrada/Salida (TTL).
RA3 = Pin de Entrada/Salida (TTL).
RA4/TOCKI = Pin de Entrada/Salida o entrada de Reloj Externo para el TMR0,
cuando este pin se configura como salida es de tipo Open Drain (ST), cuando
funciona como salida se debe conectar a Vcc (+5V) a travs de una resistencia.
PUERTO B
RB0/INT = Pin de Entrada/Salida o entrada de interrupcin externa. (TTL/ST).
RB1 = Pin de Entrada/Salida (TTL).
RB2 = Pin de Entrada/Salida (TTL).
RB3 = Pin de Entrada/Salida (TTL).
RB4 = Pin de Entrada/Salida con Interrupcin por cambio de Flanco (TTL).
RB5 = Pin de Entrada/Salida con Interrupcin por cambio de Flanco (TTL).
RB6 = Pin de Entrada/Salida con Interrupcin por cambio de Flanco (TTL/ST).
RB7 = Pin de Entrada/Salida con Interrupcin por cambio de Flanco (TTL/ST).
PINES ADICIONALES
MCLR = Pin de Reset del Microcontrolador (Master Clear). Se activa (el pic se
resetea) cuando tiene un "0" lgico en su entrada.
Vss = Ground o Tierra
VDD = Fuente Positiva (+5V)


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 20
OSC2/CLKOUT = Entrada del Oscilador del Cristal. Se conecta al Cristal o
Resonador en modo XT (Oscilador de Cristal). En modo RC (Resistencia-
Condensador), este pin acta como salida el cual tiene 1/4 de la frecuencia que
entra por el pin OCS1/CLKIN.
OCS1/CLKIN = Entrada del Oscilador del Cristal / Entrada de reloj de una Fuente
Externa.
El Puerto B tiene Internamente unas resistencias de pull-up conectadas a
sus pines (sirven para fijar el pin a un nivel de cinco voltios), su uso puede ser
habilitado o deshabilitado bajo control del programa. Todas las resistencias de
pull-up conectan o desconectan a la vez. La resistencia de pull-up es
desconectada automticamente en un pin si este se programa como salida. El pin
RB0/INT se puede configurar por software para que funcione como interrupcin
externa.
El pin RA4/TOCKI del puerto A puede ser configurado como un pin de
entrada/salida como se mencionaba anteriormente o como entrada del
temporizador/contador. Cuando este pin se programa como entrada digital,
funciona como un disparador de Schmitt (Schmitt trigger, ST), esto quiere decir
que puede reconocer seales un poco distorsionadas y llevarlas a niveles lgicos
(cero y cinco voltios). Cuando se usa como salida digital se comporta como
colector abierto, por lo tanto se debe poner una resistencia de pull-up (resistencia
externa conectada a un nivel lgico de cinco voltios). Como salida, la lgica es
inversa: un "0" escrito al pin del puerto entrega en el pin un "1" lgico. Adems
como salida no puede manejar cargas como fuente, slo en el modo sumidero.
Como este dispositivo es de tecnologa CMOS, todos los pines deben estar
conectado a alguna parte, nunca dejarlos al aire por que se puede daar el
integrado. Los pines que no se estn usando se deben conectar la fuente de
alimentacin +5V con una resistencia de < 5 Kilo Ohmio.
La mxima capacidad de corriente de cada uno de los pines de los puertos
en modo sumidero (sink) es de 25 mA y en modo fuente (source) es de 20 mA.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 21
El consumo de corriente del microcontrolador para su funcionamiento
depende del voltaje de operacin, la frecuencia y de las cargas que tengan sus
pines.
Por Ejemplo: Para un reloj de 4 MHz el consumo es de aproximadamente
de 2mA; aunque este se puede reducir a 40 microamperios cuando est en el
modo sleep (en este modo el micro se detiene y disminuye el consumo de
potencia). Se sale de este estado cuando se produce alguna condicin especial
que veremos mas adelante.
EL OSCILADOR EXTERNO
Todo Microcontrolador requiere un circuito externo que le indique la
velocidad a la que debe trabajar. Este circuito, que se conoce con el nombre de
oscilador o reloj, es muy simple pero de vital importancia para el buen
funcionamiento del sistema. El PIC 16F84 puede utilizar cuatro tipos de oscilador
diferentes. Estos tipos son:
RC. Oscilador con resistencia y condensador.
XT. Cristal de cuarzo.
HS. Cristal de alta velocidad.
LP. Cristal para baja frecuencia y bajo consumo de potencia.
En el momento de programar o "quemar" el microcontrolador se debe
especificar que tipo de oscilador se usa. Esto se hace a travs de unos fusibles
llamados "fusibles de configuracin".
En la mayora de las practicas que realizaremos se sugiere el cristal de 4
MHz, por que garantiza una mayor precisin y un buen arranque del
microcontrolador. Internamente esta frecuencia esta dividida por cuatro, lo que
hace que la frecuencia efectiva de trabajo sea de 1 MHz, por lo que cada
instruccin se realiza en un microsegundo (1 S). El cristal debe ir acompaado de
dos condensadores y se conecta como se muestra en la figura siguiente.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 22

Dependiendo de la aplicacin, se pueden utilizar cristales de otras
frecuencias; por ejemplo se usa el cristal de 3.579545 MHz por que es muy
econmico, el de 32.768 KHz cuando se necesita crear bases de tiempo de un
segundo muy precisas. El lmite de velocidad de estos microcontroladores es de
10 MHz.
Si no se requiere mucha precisin en el oscilador y se requiere economizar
dinero, se puede utilizar una resistencia y un condensador, como se muestra a
continuacin:

Nota: Cuando el oscilador del dispositivo esta en modo RC, no maneje el pin
OSC1 con un reloj externo por que puede daar el dispositivo. La frecuencia del
oscilador dividida por cuatro est disponible en el pin OSC2/CLKOUT, y puede ser
usada para chequear propsitos o para sincronizar otra lgica.
16
15
16
15

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 23
RESET
En los microcontroladores se requiere un pin de reset para reiniciar el
funcionamiento del sistema cuando sea necesario, ya sea por una falla que se
presente o por que as se halla diseado el sistema. El pin de reset en los PIC es
llamado "Master Clear". El PIC 16F84 admite diferentes tipos de reset:
Al encendido (Power On Reset)
Pulso en el pin Master Clear durante operacin normal
Pulso en el pin Master Clear durante el modo de bajo consumo (modo
sleep)
El rebase del conteo del circuito de vigilancia (watchdog) durante operacin
normal.
El rebase del conteo del circuito de vigilancia (watchdog) durante el modo
de bajo consumo (sleep)
El reset al encendido se consigue gracias a dos temporizadores. El primero
de ellos es el OST (Oscillator Star-Up Timer: Temporizador de encendido del
oscilador), orientado a mantener el microcontrolador en reset hasta que el
oscilador de cristal es estable. El segundo es el PWRT (Power-Up Timer:
Temporizador de encendido), que provee un retardo fijo de 72 mS (nominal) en el
encendido nicamente, diseado para mantener el dispositivo en reset mientras la
fuente se estabiliza. Para utilizar estos temporizadores, solo basta con conectar el
pin Master Clear a la fuente de alimentacin evitndose utilizar las tradicionales
redes RC externas en el pin de reset.
El reset por Master Clear se consigue llevando momentneamente este pin
a un estado lgico bajo, mientras que el watchdog WDT produce un reset cuando
su temporizador rebasa la cuenta, o sea que pasa de 0FFh a 00H. Cuando se
quiere tener control sobre el reset del sistema se puede conectar un botn como
se muestra en la siguiente figura

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 24

Reset por Brown-Out: Un brown-out es una condicin en donde la
alimentacin del dispositivo (Vdd) baja a un valor mnimo, pero no a cero y luego
se normaliza. El dispositivo debe resetearse en caso de presentarse un brown-out.
Para resetear un PIC 16F84 cuando un brown-out ocurre se debe construir un
circuito de proteccin externo como el de la siguiente figura:
Circuito de Proteccin # 1.

Este circuito entrar en un reset activo cuando VDD baja por debajo de Vz
+ 0.7, en donde Vz = Voltaje del Zener.
Circuito de Proteccin # 2.


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 25
Este circuito es ms econmico, aunque menos eficaz. El transistor Q1
pasar a un estado de corte cuando VDD est por debajo de un cierto nivel tal
que:
VDD * (R1 / (R1 + R2)) = 0.7 V

REGISTROS (MEMORIA RAM)
El PIC 16F84 puede direccionar 128 posiciones de memoria RAM, pero
solamente tiene implementado fsicamente los primeros 80 (0 a 4Fh). De estos los
primeros 12 son registros que cumplen un propsito especial en el control del
microcontrolador y los 68 siguientes son registros de uso general que se pueden
usar para guardar los datos temporales de la tarea que se esta ejecutando. Los
registros estn organizados como dos bancos (paginas) de 128 posiciones de 8
bits cada una (128 x 8); todas las posiciones se pueden accesar directa o
indirectamente (estas ultimas a travs del registro FSR). Para seleccionar que
pagina de registro se trabaja en un momento determinado se utiliza el bit RP0 del
registro STATUS.
00h o INDO: Registro para el direccionamiento indirecto de datos.
Este no es un registro disponible fsicamente; utiliza el contenido del FSR y
el bit RP0 del registro STATUS para seleccionar indirectamente la memoria de
datos o RAM del usuario; la instruccin determinara que se debe sealar con el
registro sealado.
01h o TMR0: Temporizador/contador de 8 bits.
Este se puede incrementar con una seal externa aplicada al pin
RA4/TOCKI o de a cuerdo a una seal interna proveniente del reloj de
instrucciones del microcontrolador. La rata o tasa de incremento del registro se
puede determinar por medio de un preescalador, localizado en el registro

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 26
OPTION. Los anteriores microcontroladores no contaban con la generacin de una
interrupcin cuando se rebasaba la cuenta (el paso de 0FFh a 00h).
02h o PCL: CONTADOR DE PROGRAMA.
Se utiliza para direccionar las palabras de 14 bits del programa del usuario
que se encuentra almacenado en la memoria ROM; este contador tiene un tamao
de 13 bits. Sobre el byte bajo, se puede escribir o leer a voluntad directamente,
mientras que en el byte alto, no. El byte alto se maneja mediante el registro
PCLATH (0Ah). A diferencia de los PIC de primera generacin el 16F84 ante una
condicin de reset inicia el contador de programa con todos sus bits en "cero".
Durante la ejecucin normal del programa, y dado que todas las instrucciones
ocupan solo una posicin de memoria, el contador se incrementa con cada
instruccin, a menos que se trate de alguna instruccin de salto.
03h o STATUS: REGISTRO DE ESTADO.
Contiene el estado Aritmtico de la ALU, la causa de reset y los bits de
preseleccin de pagina para la memoria de datos. En la siguiente figura se
muestran los bits correspondientes a este registro.
REGISTRO STATUS
IRP
bit 7
RP1
bit 6
RP0
bit 5
T0
bit 4
PD
bit 3
Z
bit 2
DC
bit 1
C
bit 0
IRP
Selector de pgina para direccionamiento indirecto. Este bit no se utiliza
efectivamente en el PIC 16F84, por lo que se puede utilizar como un bit de propsito
general.
RP1,0
Selectores de pgina para un seleccionamiento directo. Solamente RP0 se utiliza en
el PIC 16F84. RP1 se puede utilizar como un bit de propsito general.
T0
Time Out o bit de finalizacin del temporizador. Se coloca en 0 cuando el circuito de
vigilancia Watchdog finaliza la temporizacin
PD
Power Down o bit de bajo consumo. Se coloca en 0 por la instruccin sleep.
Z
Zero o bit de cero. Se coloca en 1 cuando el resultado de una operacin aritmtica o
lgica es cero.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 27
DC
Digit Carry o bit de acarreo de dgito. En operaciones aritmticas se activa cuando
hay un acarreo entre el bit 3 y 4, es decir cuando hay acarreo entre el nible de menor
y de mayor peso.
C
Carry o bit de acarreo. En instrucciones aritmticas se activa cuando se presenta
acarreo desde el bit ms significativo del resultado.

Los bits 5 y 6 (RP0 y RP1) son los bits de seleccin de pagina (Bank 0 y
Bank 1), para el direccionamiento directo de la memoria de datos; solamente RP0
se usa en los PIC 16F84. RP1 se puede utilizar como un bit de propsito general
de lectura/escritura. Los bits TO y PD no se pueden modificar por un proceso de
escritura; ellos muestran la condicin por la cual se ocasiono el ultimo reset.
04h o FSR: REGISTRO SELECTOR DE REGISTROS.
En asocio con el registro IND0, se utiliza para seleccionar indirectamente
los otros registros disponibles. Mientras que los antecesores del PIC 16F84 solo
posean 5 bits activos, en este microcontrolador se poseen solo 8 bits. Si en el
programa no se utilizan llamadas indirectas, este registro se puede utilizar como
un registro de propsito general.
05h o PORTA: PUERTO DE ENTRADA/SALIDA DE 5 BITS (RA0~ RA4).
Este puerto al igual que todos sus similares en los PIC, puede leerse o
escribirse como si se tratara de un registro cualquiera. El registro que controla el
sentido (entrada o salida) de los pines de este puerto esta localizado en la pagina
1 (Banco 1), en la posicin 85h y se llama TRISA.
06h o PORTB: PUERTO DE ENTRADA/SALIDA DE 8 BITS (RB0~RB7).
Al igual que en todos los PIC, este puede leerse o escribirse como si se
tratara de un registro cualquiera; algunos de sus pines tienen funciones alternas
en la generacin de interrupciones. El registro de control para la configuracin de
la funcin de sus pines se localiza en la pagina 1 (Banco 1), en la direccin 86h y
se llama TRISB.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 28

08h o EEDATA: REGISTRO DE DATOS DE LA EEPROM.
Este registro contiene el dato que se va a escribir en la memoria EEPROM
de datos o el que se ley de sta.
09h o EEADR: REGISTRO DE DIRECCION DE LA EEPROM.
Aqu se mantiene la direccin de la EEPROM de datos que se van a
trabajar, bien sea para una operacin de lectura o para una de escritura
0Ah o PCLATH: REGISTRO PARA LA PARTE ALTA DE LA DIRECCION.
Este registro contiene la parte alta del contador de programa y no se puede
acceder directamente.
0Bh o INTCON: REGISTRO PARA EL CONTROL DE INTERRUPCIONES.
Es el encargado del manejo de las interrupciones y contiene los bits que se
muestran en la siguiente figura.
REGISTRO INTCON
GIE
Bit 7
EEIE
bit 6
TOIE
bit 5
INTE
bit 4
RBIE
bit 3
TOIF
bit 2
INTF
bit 1
RBIF
bit 0
GIE
Global Interrup Enable o Habilitador general de interrupciones.
0: Deshabilita todas las interrupciones
1: Habilita las interrupciones
EEIE
EEPROM Write Interrup Enable o Habilitacin de interrupcin por escritura de la EEPROM.
0: La deshabilita
1: La habilita
T0IE
TMR0 Interrup Enable o Habilitacin de interrupcin del temporizador TMR0.
0: La deshabilita
1: La habilita
INTE
INT Interrup Enable o Habilitacin de la interrupcin INT.
0: La deshabilita
1: La habilita

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 29
RBIE
RBIF Interrup Enable o Habilitacin de la interrupcin RBIF.
0: La deshabilita
1: La habilita
TOIF
TMR0 Overflow Interrup Flag o Bandera de la interrupcin por desbordamiento del TMR0.
Se coloca en 1 cuando el TMR0 pasa de 0FFh a 00h; sta debe ser puesta a 0 por programa.
INTF
INT Interrup Flag o Bandera de interrupcin INT.
Se coloca en 1 cuando la interrupcin INT ocurre; sta debe ser puesta cero por programa.
RBIF
RB Port Change Interrup Flag o Bandera de interrupcin por cambio en el puerto B.
Se coloca en 1 cuando una de las entradas (RB4 a RB7) cambia; sta debe ser puesta a 0
por programa

81h u OPTION: REGISTRO DE CONFIGURACION MULTIPLE.
Posee varios bits para configurar el preescalador, la interrupcin externa, el
timer y las caractersticas del Puerto B. Los bits que contiene y las funciones que
realiza este registro se muestran en la siguiente figura.
REGISTRO OPTION
RBPU
bit 7
INTEDG
bit 6
GRTS
bit 5
RTE
bit 4
PSA
bit 3
PS2
bit 2
PS1
bit 1
PS0
bit 0
RBPU
Portb Pull-up Enable o Habilitacin de pull-up del puerto B.
0: Habilita las pull-ups internas
1: Las deshabilita
INTEDG
INT Interrup Edge Select o Selector de flanco de la interrupcin INT.
0: Flanco de bajada
1: Flanco de subida
RTS
TMR0 Signal Source o Fuente de seal del TMR0.
0: Ciclo de instrucciones interno (Temporizador)
1: Transicin en el pin RA4/TOCKI (Contador)
RTE
TMR0 Signal Edge o Flanco de la seal del TMR0
0: Incremento de transicin de bajo a alto
1: Incremento en transicin
PSA
Preescaler Assignment o Asignacin del preescalador
0: TMR0 (Contador / Temporizador)
1: WDT (Circuito de vigilancia)
PS2, 1, 0
Preescaler Value o Valores del preescalador.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 30
Valor TMR0 WDT
000
001
010
011
100
101
110
111
1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256
1:1
1:2
1:4
1:8
1:16
1:32
1:64
1:128

El preescalador es compartido entre el TMR0 y el WDT; su asignacin es
mutuamente excluyente ya que solamente puede uno de ellos ser preescalado a la
vez.
85h o TRISA: REGISTRO DE CONFIGURACION DEL PUERTO A.
Es el registro de control para el puerto A. Un "cero" en el bit
correspondiente al pin lo configura como salida, mientras que un "uno" lo hace
como entrada.
86h o TRISB: REGISTRO DE CONFIGURACION DEL PUERTO B.
Es el registro de control para el puerto B. Un "cero" en el bit
correspondiente al pin lo configura como salida, mientras que un "uno" lo hace
como entrada.
88h o EECON1: REGISTRO DE PARA EL CONTROL DE LA MEMORIA
EEPROM DE DATOS.
Este es el registro de control para la memoria de datos y solo destina cinco
bits para ello, los ms bajos; los tres bits superiores permanecen sin implementar.
En la siguiente figura se muestran las funciones de estos bits.



Circuitos Integrados Programables
Juan Antonio Barrios Huzar 31
REGISTRO EECON1
U
bit 7
U
bit 6
U
bit 5
EEIF
bit 4
WRERR
bit 3
WREN
bit 2
WR
bit 1
RD
bit 0
U Unimplemented. No implementados.
EEIF
EEPROM Write Completion Interrup Flag o Bandera de finalizacin de la escritura. Se
coloca en "1" cuando finaliza con xito la escritura de la EEPROM de datos; se debe
colocar en "0" por programa. El bit de habilitacin correspondiente es el EEIE,
localizado en el registro INTCON.
WRERR
Write Error Flag o Bandera de error de escritura. Si se coloca en "1" cuando la
operacin de escritura termina prematuramente, debido a cualquier condicin de
reset.
WREN
Write Enable o habilitacin de escritura. Si se coloca en "0" no permite las
operaciones de escritura; en "1" las habilita.
WR
Write Control o Control de escritura. Al colocarse en "1" inicia un ciclo de escritura.
Este bit slo es puesto a "0" por hardware, una vez la escritura termina.
RD
Read Control o Control de lectura. Al colocarse en "1" se inicia una lectura de la
EEPROM de datos, la cual toma un ciclo de reloj de instrucciones. Este bit slo se
limpia (colocar en "0") por hardware, al finalizar la lectura de la posicin de la
EEPROM.

89h o EECON2: REGISTRO AUXILIAR PARA EL CONTROL DE LA MEMORIA
EEPROM DE DATOS.
Este registro no es implementado fsicamente por el microcontrolador, pero
que es necesario en las operaciones de escritura en la EEPROM de datos; ante
cualquier intento de lectura se tendrn "ceros".
0Ch a 4Fh: REGISTRO DE PROPOSITO GENERAL.
Estas 68 posiciones estn implementadas en la memoria RAM esttica, la
cual conforma el rea de trabajo del usuario; a ellas tambin se accede cuando en
la pagina 1 (Banco 1) se direccionan las posiciones 8Ch a CFh. Esto se ha
diseado as para evitar un excesivo cambio de paginas en el manejo de la RAM
del usuario, agilizando los procesos que se estn llevando a cabo y
descomplicando la labor del programador.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 32

REGISTRO DE TRABAJO W.
Este es el registro de trabajo principal, se comporta de manera similar al
acumulador en los microprocesadores. Este registro participa en casi todo el
programa y por consiguiente en la mayora de las instrucciones.
PILA (STACK).
Estos registros no forman parte de ningn banco de memoria y no permiten
el acceso por parte del usuario. Se usan para guardar el valor del contador de
programa cuando se hace un llamado a una subrutina (CALL ), o cuando se
atiende una interrupcin; luego, cuando el micro regresa a seguir ejecutando su
tarea normal, el contador de programa recupera su valor leyndolo nuevamente
desde la pila. El PIC 16F84 tiene una pila de 8 niveles, esto significa que se
pueden anidar 8 llamados a subrutina sin tener problema alguno.

CARACTERISTICAS ESPECIALES
Algunos elementos que forman parte de los PIC no se encuentran en
microcontroladores de otros fabricantes, o simplemente representan alguna
ventaja o facilidad a la hora de hacer un diseo. A continuacin una corta
descripcin de las ms significativas.
CIRCUITO DE VIGILANCIA (Watchdog Timer)
Su funcin es restablecer el programa cuando ste se ha perdido por fallas
en la programacin o por alguna razn externa. Es muy til cuando se trabaja en
ambientes con mucha interferencia o ruido electromagntico. Esta conformado por
un oscilador RC que se encuentra dentro del microprocesador. Este oscilador
corre de manera independiente al oscilador principal. Cuando se habilita su
funcionamiento, dicho circuito hace que el microcontrolador sufra un reset cada

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 33
determinado tiempo (que se puede programar entre 18 mS y 2 segundos). Este
reset lo puede evitar el usuario mediante una instruccin especial del
microcontrolador (CLRWT: Borra el contenido del watchdog), la cual se debe
ejecutar antes de que termine el periodo nominal de dicho temporizador. De esta
manera si el programa se ha salido de su flujo normal, por algn ruido o
interferencia externa, el sistema se reiniciar (cuando se acabe el tiempo
programado y no se haya borrado el contador) y el programa puede restablecerse
para continuar con su funcionamiento normal.
En las primeras practicas no se utiliza el circuito de vigilancia para facilitar el
trabajo; por eso, en el momento de programar el microcontrolador se debe
seleccionar en los fusibles de configuracin "watchdog timer OFF". Mas adelante
veremos algunos ejemplos que ilustran su funcionamiento y la manera de
utilizarlos
TEMPORIZADOR DE ENCENDIDO (Power-up Timer)
Este proporciona un reset al microcontrolador en el momento de conectar la
fuente de alimentacin, lo que garantiza un arranque correcto del sistema. En el
momento de grabar el microcontrolador se debe habilitar el fusible de
configuracin "Power-up Timer", para ello se debe seleccionar "ON". Su tiempo de
retardo es de 72 milisegundos.
MODO DE BAJO CONSUMO (Sleep)
Esta caracterstica permite que el microcontrolador entre en un estado
pasivo donde consume muy poca potencia. Cuando se entra en este modo el
oscilador principal se detiene, pero el temporizador del circuito de vigilancia
(watchdog) se reinicia y empieza su conteo nuevamente. Se entra en ese estado
por la ejecucin de una instruccin especial (llamada SLEEP) y se sale de l
cuando el microcontrolador sufre un reset por un pulso en el pin MCLR, por que el
watchdog hace que se reinicie el sistema o por que ocurre una interrupcin al
sistema.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 34
INTERRUPCIONES
Este microcontrolador incluye el manejo de interrupciones, lo cual representa
grandes ventajas. El PIC16F84 posee cuatro formas de interrupcin que son:
Interrupcin externa en el pin RB0/INT
Finalizacin del temporizador/contador TMR0
Finalizacin de escritura en la EEPROM de datos
Cambio de estado en los pines RB4 a RB7
El registro 0Bh o INTCON contiene las banderas de las interrupciones INT, cambio
en el puerto B y finalizacin del conteo del TMR0, al igual que el control para
habilitar o deshabilitar cada una de las fuentes de interrupcin, incluida la de
escritura de la memoria EEPROM. Slo la bandera de finalizacin de la escritura
reside en el registro 88h o EECON1.
Si el bit GIE (Global Interrup Enable) se coloca en 0, deshabilita todas las
interrupciones. Cuando una interrupcin es atendida, el bit GIE se coloca en 0
automticamente pare evitar interferencias con otras interrupciones que se
pudieran presentar, la direccin de retorno se coloca en la pila y el PIC se carga
con la direccin 04h. Una vez en la rutina de servicio, la fuente de interrupcin se
puede determinar examinando las banderas de interrupcin. La bandera
respectiva se debe colocar, por software, en cero antes de regresar de la
interrupcin, para evitar que se vuelva a detectar nuevamente la misma
interrupcin. La instruccin RETFIE permite al usuario retornar de la interrupcin,
a la vez que habilita de nuevo las interrupciones, al colocar el bit GIE en uno.
Debe tenerse presente que solamente el contador de programa es puesto en la
pila al atenderse la interrupcin; por lo tanto, es conveniente que el programador
tenga cuidado con el registro de estados y el de trabajo, ya que se pueden
introducir resultados inesperados si dentro de ella se modifican.


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 35
Interrupcin Externa. Acta sobre el pin RB0/INT y se puede configurar para
activarse con el flanco de subida o el de bajada, de acuerdo al bit INTEDG
(Interrup Edge Select Bit, localizado en el registro OPTION). Cuando se presenta
un flanco valido en el pin INT, la bandera INTF (INTCON) se coloca en uno. La
interrupcin se puede deshabilitar colocando el bit de control INTE (INTCON) en
cero. Cuando se atiende la interrupcin, a travs de la rutina de servicio, INTF se
debe colocar en cero antes de regresar al programa principal. La interrupcin
puede reactivar al microcontrolador despus de la instruccin SLEEP, si
previamente el bit INTE fue habilitado.
Interrupcin por finalizacin de la temporizacin. La superacin del conteo
mximo (0FFh) en el TMR0 colocara el bit TOIF (INTCON) en uno. El bit de control
respectivo es TOIE (INTCON).
Interrupcin por cambio en el puerto RB. Un cambio en los pines del puerto B
(RB4 a RB7) colocar en uno el bit RBIF (INTCON). El bit de control respectivo es
RBIE (INTCON).
Interrupcin por finalizacin de escritura. Cuando la escritura de un dato en la
EEPROM finaliza, se coloca en 1 el bit EEIF (EECON1). El bit de control
respectivo es EEIE (INTCON).
MEMORIA DE DATOS DE LA EEPROM
El PIC 16F84 tiene una memoria EEPROM de datos de 64 posiciones (00h
a 3Fh), de 8 bits cada una. Este bloque de memoria no se encuentra mapeado en
ningn banco, el acceso a esas posiciones se consigue a travs de dos registros
de la RAM:
El registro EEADR (posicin 09), que debe contener la direccin de la
posicin de la EEPROM a ser accesada.
El registro EEDATA (posicin 08), que contiene el dato de 8 bits que se va a
escribir o el que se obtuvo de la ultima lectura.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 36

Adicionalmente, existen dos registros de control: el EECON1 (88h), que
posee cinco bits que manejan las operaciones de lectura/escritura y el EECON2
(89h), que aunque no es un registro fsico, es necesario para realizar las
operaciones de escritura.
La lectura toma un ciclo de reloj de instrucciones, mientras que las
escritura, por ser controlada por un temporizador incorporado, tiene un tiempo
nominal de 10 milisegundos, este tiempo puede variar con la temperatura y el
voltaje. Cuando se va a realizar una operacin de escritura, automticamente se
hace primero la operacin de borrado. El numero tpico de ciclos de
borrado/escritura de la EEPROM de datos es de 1.000.000.
FUSIBLES DE CONFIGURACIN
El PIC 16F84 posee cuatro fusibles, cada uno de los cuales es un bit. Estos
fusibles se pueden programas para seleccionar varias configuraciones del
dispositivo: tipo de oscilador, proteccin de cdigo, habilitacin del circuito de
vigilancia y el temporizador al encendido. Los bits se localizan en la posicin de
memoria 2007h, posicin a la cual el usuario slo tiene acceso durante la
programacin del microcontrolador.
Cuando se programa la proteccin del cdigo, el contenido de cada
posicin de la memoria no se puede leer completamente, de tal manera que el
cdigo del programa no se puede reconstruir. Adicionalmente, todas las
posiciones de memoria del programa se protegen contra la reprogramacin.
Una vez protegido el cdigo, el fusible de proteccin solo puede ser borrado
(puesto a 1) si se borra toda la memoria del programa y la de datos.
LAS PULL-UPS INTERNAS
Cada uno de los pines del puerto B tiene un elemento dbil pull-up interno
(250 uA tpico); este elemento es automticamente desconectado cuando el pin se

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 37
configura como salida. Adicionalmente, el bit RBPU (OPTION) controla todos
estos elementos, los cuales estn deshabilitados frente a una condicin de reset.
Estos elementos pull-up son especialmente tiles cuando el microcontrolador va a
colocarse en el modo de bajo consumo, ya que ayudan a no tener las entradas
flotantes, significado una reduccin en el consumo de corriente.

EL CONJUNTO DE INSTRUCCIONES
Estas se clasifican en orientadas a registros, orientadas a bit y operaciones
literales y de control. Cada instruccin es una palabra de 14 bits, dividida en un
cdigo de operacin (el cul especifica la orden a ejecutar) y uno o ms
operandos sobre los que se acta
TABLA DE NEMNICOS DE LA FAMILIA PIC16X84
MNEMNICO DESCRIPCIN CDIGO OP
FLAGS
AFECTADOS
NOTAS
Instrucciones Orientadas a Registros
ADDWF f,d
ANDWF f,d
CLRF f
CLRW
COMF f,d
DECF f,d
DECFSZ f,d
INCF f,d
INCFSZ f,d
IORWF f,d
MOVF f,d
MOVWF f
NOP
RLF f,d
RRF f,d
SUBWF f,d
(W)+(f) (destino)
(W) AND (f) (destino)
00 (f)
00 (W)
Complemento de f [(#f)(des)]
(f)-1 destino
(f)-1dest. y si res. es 0 salta
(f)+1 destino
(f)+1dest. y si res. es 0 salta
(W) OR (f) destino
Mueve f destino
(W) (f)
No operacin
Rota f a la izq a travs del carry destino
Rota f a la dcha a travs del cary destino
(f)(W) (destino)
00 0111 dfff ffff
00 0101 dfff ffff
00 0001 1fff ffff
00000100000011
00 1001 dfff ffff
00 0011 dfff ffff
00 1011 dfff ffff
00 1010 dfff ffff
00 1111 dfff ffff
00 0100 dfff ffff
00 1000 dfff ffff
00 0000 1fff ffff
0000000xx0 0000
00 1101 dfff ffff
00 1100 dfff ffff
00 0010 dfff ffff
C, DC, Z
Z
Z
Z
Z
Z
Ninguno
Z
Ninguno
Z
Z
Ninguno
Ninguno
C
C
C,DC,Z
1,2
1,2
2
1,2
1,2
1,2,3
1,2
1,2,3
1,2
1,2

1,2
1,2
1,2
1,2
1,2

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 38
SWAPF f,d
XORWF f,d
Intercambia los nibbles de f destino
(W) XOR (f) (destino)
00 1110 dfff ffff
00 0110 dfff ffff
Ninguno
Z
Instrucciones orientadas a Bit
BCF f,b
BSF f,b
BTFSC f,b
BTFSS f,b
Pone a 0 el bit b del registro f
Pone a 1 el bit b del registro f
Skip si el bit b del reg. f es 0
Skip si el bit b del reg. f es 1
01 00bb bfff ffff
01 01bb bfff ffff
01 10bb bfff ffff
01 11bb bfff ffff
Ninguno
Ninguno
Ninguno
Ninguno
1,2
1,2
3
3
Instrucciones con literales y de control
ADDLW K
ANDLW K
CALL K
CLRWDT
GOTO K
IORLW K
MOVLW K
RETFIE
RETLW K
RETURN
SLEEP
SUBLW K
XORLW K
(W)+ K (W)
(W) AND K (W)
Llamada a subrutina
Clear del temporizador del WD
Go To direccin
(W) OR K (W)
K (W)
Retorno de una interrupcin
Retorno con un literal en W
Retorno de una subrutina
Modo Standby
K (W) W
(W) XOR K (W)
11 111x kkkk kkkk
111001kkkk kkkk
10 0kkkkkkkkkkk
00 00000100100
10 kkkkkkkkkkk
111000 kkkk kkkk
1100xx kkkk kkkk
00000000001001
1101xx kkkk kkkk
00000000001000
00000001100011
11110x kkkk kkkk
11 1010kkkk kkkk
C,DC,Z
Z

Ninguno
Z
Ninguno
Ninguno
Ninguno
Ninguno
C,DC,Z
Z


Notas.
1. Al modificar un registro de E/S con una operacin sobre l mismo (por
ejemplo MOVF PORTB,1), el valor utilizado es el que se halle presente en
los pines del PORTB. Por ejemplo, si el biestable tiene un "1" para una
patilla configurada como entrada y se pone a nivel bajo desde el exterior, el
dato se volver a escribir como "0".
2. Si se ejecuta esta instruccin sobre el TMR0 y d=1, ser borrado el divisor
de frecuencia (preescaler), si est asignado al TMR0.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 39
3. Si se modifica el Contador de Programa (PC) o una condicin de prueba es
verdadera, la instruccin requiere dos ciclos mquina. El segundo ciclo se
ejecuta como un NOP
ADDLW ADDLW
ADD Literal to W
Operacin (W) + k ----> (W)
Sintaxis [Etiqueta] ADDLW k
Operadores
Cod.Oper. 0001 11df ffff
Palabras 1
Ciclos 1
Cdigo de
Operacin
11 111x kkkk kkkk
Descripcin Suma el contenido del registro W al literal k, y almacena el
resultado en W. Si se produce acerreo el flag C se pone a "1"
Nota.- Esta instruccin no existe en el PIC 16C5X

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X X X

C Se pone a 1 si se produce un Acarreo desde el bit de mayor peso
DC Se pone a 1 si se genera un Acarreo del bit 3 al bit 4.
Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO:
ADDLW 0x15
Si antes de la instruccin:
W = 10h = 0001 0000 b
Al ejecutarse la instruccin

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 40
W = 10 h + 15 h = 25 h
W = 0001 0000 b + 0001 0101 b = 0010 0101 b

ADDWF ADDWF
ADD W to F
Operacin (W) + (f) ----> (destino)
Sintaxis [Etiqueta] ADDWF f,d
Operadores
d [0,1]
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0111 dfff ffff
Descripcin Suma el contenido del registro W al contenido del registro f, y
almacena el resultado en W si d = 0, y en el registro f si d =
1.Si se produce acerreo el flag C se pone a "1"

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X X X

C Se pone a 1 si se produce un Acarreo desde el bit de mayor peso
DC Se pone a 1 si se genera un Acarreo del bit 3 al bit 4.
Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO: ADDWF FSR,0
Si antes de la instruccin. W = 17 h y FSR = C2 h como d=0
Al ejecutarse: W = 17 h+ C2 h = D9 h
FSR = C2 h


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 41
ANDLW ANDLW
AND Literal and W
Operacin (W).AND. (k) ----> (W)
Sintaxis [Etiqueta] ANDLW k
Operadores k
Palabras 1
Ciclos 1
Cdigo de
Operacin
11 1001 kkkk kkkk
Descripcin Efecta la operacin AND lgico entre el contenido del
registro W y el literal k, y almacena el resultado en W.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -
Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO: ANDLW 0x5F
Si antes de la instruccin. W = A3 h
Al ejecutarse: W = 0101 1111 b AND 1010 0011 b = 0000 0011 B = 03 h

ANDWF ANDWF
AND W wind F
Operacin (W) AND (f) ----> (destino)

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 42
Sintaxis [Etiqueta] ANDWF f,d
Operadores 0
d [0,1]
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0101 dfff ffff
Descripcin Efecta la operacin AND lgico entre el contenido del
registro W y el contenido del registro f, y almacena el
resultado en W si d = 0, y en f si d = 1.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -
Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO: ANDWF FSR,1
Si antes de la instruccin. W = 17 h = 0001 0111 b y FSR = C2 h = 1100 0010 h
Al ejecutarse:
W = 17 h = 0001 0111 b
FSR = 0001 0111 b AND 1100 0010 b = 0000 0010 b = 02 h

BCF BCF
Bit Clear F
Operacin 0 --> (f<b>)
Sintaxis [Etiqueta] BCF f,b
Operadores 0

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 43

Palabras 1
Ciclos 1
Cdigo de
Operacin
01 00bb bfff ffff
Descripcin Pone a cero el bit nmero b del registro f

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

EJEMPLO: BCF FLAG_REG, 7
Si antes de la instruccin el registro
FLAG_REG = C7 h = 1100 0111 b
Al ejecutarse la instruccin, el registro queda con el valor:
FLAG_REG = 47b = 0100 0111 b

BSF BSF
Bit Set F
Operacin 1 --> (f<b>)
Sintaxis [Etiqueta] BSF f,b
Operadores

Palabras 1
Ciclos 1
Cdigo de
Operacin
01 11bb bfff ffff
Descripcin Pone a 1 el bit b del registro f

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 44
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

EJEMPLO: BSF FLAG_REG, 7
Si antes de la instruccin el registro tiene el valor.
FLAG_REG = 0A h = 0000 1010 b
Al ejecutarse la instruccin, el registro queda con el valor:
FLAG_REG = 8A h = 1000 1010 b

BTFSC BTFSC
Bit Test, Skip if Clear
Operacin skip if (f<b>) = 0
Sintaxis [Etiqueta] BTFSC f,b
Operadores 0

Palabras 1
Ciclos 1 (2)
Cdigo de
operacin
01 10bb bfff ffff
Descripcin Si el bit nmero b del registro f es cero, la instruccin que
sigue a sta se ignora y se trata como un NOP (skip). En
este caso, y slo en este caso, la instruccin BTFSC precisa
dos ciclos para ejecutarse.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 45
EJEMPLO:
HERE BTFSC FLAG,1
FALSE GOTO PROCESS_CODE
TRUE .
Si antes de la instruccin. PC = direccin HERE
Al ejecutarse:
if FLAG<1> = 0,
PC = direccin TRUE
if FLAG<1> = 1,
PC = direccin FALSE

BTFSS BTFSS
Bit Test, Skip if Set
Operacin skip if (f<b>) = 1
Sintaxis [Etiqueta] BTFSS f,b
Operadores 0

Palabras 1
Ciclos 1 (2)
Cdigo de
Operacin
01 11bb bfff ffff
Descripcin Si el bit nmero b del registro f est a 1, la instruccin que
sigue a sta se ignora y se trata como un NOP (skip). En
este caso, y slo en este caso, la instruccin BTFSS precisa
dos ciclos para ejecutarse.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 46
EJEMPLO:
HERE BTFSS FLAG,1
FALSE GOTO PROCESS_CODE
TRUE .
Si antes de la instruccin. PC = direccin HERE
Al ejecutarse:
if FLAG<1> = 0,
PC = direccin FALSE
if FLAG<1> = 1,
PC = direccin TRUE

CALL CALL
Subrutine Call
Operandos 0 = k = 2047
Sintaxis [Etiqueta] CALL k
Operacin (PC)+1 ---> Top of Stack
k ---> PC <10:0>;
PCLATCH (<4:3>) ---> PC (<12,11>)
Palabras 1
Ciclos 2
Cdigo de
Operacin
10 0kkk kkkk kkkk
Descripcin Salvaguarda la direccin de vuelta en la Pila y despus llama
a la subrutina situada en la direccin cargada en el PC.
El modo de clculo de la direccin efectiva difiere segn la
familia PIC utilizada. Tambin hay que posicionar PA2, PA1 y
PA0 (PIC 16C5X) o el registro PCLATCH (En los dems PIC)
antes de ejecutarse la instruccin.
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 47
EJEMPLO: HERE CALL THERE
Si antes de la instruccin.
PC = direccin HERE
Al ejecutarse:
PC = direccin (THERE)
TOS = direccin (HERE +1)

CLRF CLRF
Clear f
Operacin 00h --> f
1 ---> Z
Sintaxis [Etiqueta] CLRF f
Operadores
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0001 1fff ffff
Descripcin Se borra el contenido del registro f y el flag Z se activa

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - 1 - -

Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO: CLRF REG
Si antes de la instruccin. REG = 5A h
Al ejecutarse: REG = 00 h
flag Z = 1

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 48
CLRW CLRW
Clear W
Operacin 00h -->(W)
1 ---> Z
Sintaxis [Etiqueta] CLRW
Operadores No tiene
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0001 0000 0011
Descripcin El registro de trabajo W se carga con 00h. El flag Z se pone a
1

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - 1 - -
Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO: CLRW
Si antes de la instruccin. W= 5Ah
Al ejecutarse: W = 00
flag Z = 1

CLRWDT CLRWDT
Clear Watchdog Timer
Operacin 00h --> WDT
1 --> T0#
1 --> PD#
Sintaxis [Etiqueta] CLRWDT
Operadores No tiene

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 49
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0000 0110 0100
Descripcin Se borra tanto el registro WDT (Watchdog) como su
preescaler. Los bits T0# y PD# del registro de estado se
ponen a "1".

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - 1 1 - - -

T0# Se pone a 1 cuando se ejecuta la instruccin CLRWDT o SLEEP. Se pone
a 0 si el temporizador Watchdog se desborda
PD# Se pone a 1 cuando se ejecuta la instruccin CLRWDT o SLEEP
EJEMPLO: CLRWDT
Si antes de ejecutarse la instruccin
WDT = ?
Al ejecutarse: WDT = 00 h
Preescaler WDT = 0
bit de estado T0 = 1
bit de estado PD = 1

COMF COMF
Complement f
Operacin (f#) -----> (dest)
Sintaxis [Etiqueta] COMF f,d
Operadores
d [0,1]

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 50
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 1001 dfff ffff
Descripcin Hace el complemento del contenido del registro f bit a bit. El
resultado se almacena en el registro f si d=1 y en el registro
W si d=0, en este caso f no vara.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -

Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO: COMF REG1,0
Si antes de la instruccin. REG1 = 13 h como d= 0
Al ejecutarse: REG1 = 13 h = 0001 0011 b
W = EC h = 1110 1100 b
flag Z = 0

DECF DECF
Decrement f
Operacin (f)-1 --> (dest)
Sintaxis [Etiqueta] DECF f,d
Operadores 0
d [0,1]
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0011 dfff ffff

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 51
Descripcin Se decrementa el contenido del registro f en una unidad. El
resultado se almacena en f si d=1 y en W si d=0, en este
caso f no vara.
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -

Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO: DECF CNT,1
Si antes de la instruccin. CNT = 01 h
Z = 0
Al ejecutarse: CNT = 00 h
bit Z = 1

DECFSZ DECFSZ
Decrement f , Skip if 0
Operacin (f) -1 --> (dest) ; skip if result =0
Sintaxis [Etiqueta] DECFSZ f,d
Operadores 0
d [0.1]
Palabras 1
Ciclos 1 (2)
Cdigo de
Operacin
00 1011 dfff ffff
Descripcin Decrementa el contenido del registro f en una unidad, el
resultado se almacena en f si d=1 y en W si d=0, en este
caso, f no vara. Si el resultado es cero, se ignora la siguiente
instruccin y, en ese caso la instruccin tiene una duracin
de dos ciclos.


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 52
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

EJEMPLO: HERE DECFSZ CNT,1
GOTO LOOP
CONTINUE
.
.
.
Si antes de la instruccin. PC = direccin HERE
Al ejecutarse: CNT = CNT -1
Si CNT = 0 entonces PC = direccin CONTINUE
Si CNT no = 0 entonces PC = direccin HERE + 1

GOTO GOTO
Unconditional Branch
Operacin K --> PC <10:0>
(PCLATH <4:3>) ---> (PC <12:11>)
Sintaxis [Etiqueta] GOTO k
Operadores
Palabras 1
Ciclos 2
Cdigo de
Operacin
10 1kkkk kkkk kkkk
Descripcin Salto incondicional, normalmente se utiliza para llamar a la
subrutina situada en la direccin que se carga en PC.
El modo de clculo de la instruccin carga de bit 0 al 10 de la
constante k en el PC y los bits 3 y 4 del registro PCLATH en
los 11 y 12 del PC


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 53
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

EJEMPLO: GOTO THERE
Al ejecutarse: PC = direccin THERE

INCF INCF
Increment f
Operacin (f) + 1 --> (dest)
Sintaxis [Etiqueta] INCF f,d
Operadores 0
d [0,1]
(f) + 1 ---> (dest)
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 1010 dfff ffff
Descripcin Se incrementa en una unidad el contenido del registro f, si
d=1 el resultado se almacena en f, si d=0 el resultado se
almacena en W, en este caso el resultado de f no vara.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -

Z Se pone a 1 si el resultado de la operacin es cero al haber
desbordamiento
EJEMPLO: INCF CNT,1

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 54
Si antes de la instruccin:
CNT = FF h
flag Z = 0
Al ejecutarse: FF h +1 h = 00 h
CNT = 00
flag Z = 1

INCFSZ INCFSZ
Increment f, SKIP if 0
Operacin (f) +1 --> (dest) , skip if result = 0
Sintaxis [Etiqueta] <INCFSZ f,d
Operadores 0
d [0,1]
Palabras 1
Ciclos 1 (2)
Cdigo de
Operacin
00 1111 Dfff ffff
Descripcin Incrementa el contenido del registro f en una unidad, el
resultado se almacena de nuevo en f si d=1, y en W si d=0,
en este caso, f no vara. Si el resultado es cero, se ignora la
siguiente instruccin y, en ese caso la instruccin tiene una
duracin de dos ciclos.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

EJEMPLO: HERE INCFSZ CNT,1
GOTO LOP
CONTINUE

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 55
Si antes de la instruccin. PC = direccin HERE
Al ejecutarse: CNT = CNT+1
Si CNT = 0
Entonces PC = direccin CONTINUE
Si CNT no = 0
Entonces PC = direccin HERE + 1

IORLW IORLW
Inclusive OR Literal with W
Operacin (W).OR.k ---> (W)
Sintaxis [Etiqueta] IORLW k
Operadores
Palabras 1
Ciclos 1
Cdigo de
Operacin
11 1000 Kkkk kkkk
Descripcin Se realiza la operacin lgica OR entre el registro W y el
literal k. El resultado se almacena en el registro W.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -
Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO: IORLW 0x35
Si antes de la instruccin. W = 9A h
Al ejecutarse: W = 1001 1010 b + 0011 0101 b = 1011 1111 b = BF h



Circuitos Integrados Programables
Juan Antonio Barrios Huzar 56
IORWF IORWF
Inclusive OR W with f
Operacin (W) .OR.(f)--> (dest)
Sintaxis [Etiqueta] IORWF f,d
Operadores 0
d [0,1]
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0100 Dfff ffff
Descripcin Efecta la operacin lgica OR entre el contenido del registro
W y el contenido del registro f, y almacena el resultado en f si
d=1 y en W si d=0.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -

Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO: IORWF RESUL,0
Si antes de la instruccin. RESUL = 13 h = 0001 0011 b
W = 91 h = 1001 0001 b
Al ejecutarse: RESUL= 0001 0011 b OR 1001 0001 b = 1001 0011 b = 93 h

MOVLW MOVLW
Move literal to W
Operacin k --> (W)
Sintaxis [Etiqueta] MOVLW k

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 57
Operadores 0
Palabras 1
Ciclos 1
Cdigo de
Operacin
11 00xx Kkkk kkkk
Descripcin El registro W se carga con el valor de 8 bits del literal k

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -

EJEMPLO: MOVLW 0x5A
Al ejecutarse: W = 5A h

MOVF MOVF
Move f
Operacin (f) --> (dest)
Sintaxis [Etiqueta] MOVF f,d
Operadores
d [0,1]
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 10000 Dfff ffff
Descripcin El contenido del registro f se carga en el registro destino
dependiendo del valor de d. Si d=0 el destino es el registro
W, si d=1 el destino es el propio registro f . Esta instruccin
permite verificar dicho registro ya que el flag Z queda
afectado.


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 58
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -

Z Se pone a 1 si el resultado de la operacin es cero
EJEMPLO: MOVF FSR,0
Al ejecutarse: W = al valor del FSR

MOVWF MOVWF
Move W to f
Operacin (W)--> (f)
Sintaxis [Etiqueta] MOVWF f
Operadores 0
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0000 1fff ffff
Descripcin Mueve el contenido del registro W al registro f

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

EJEMPLO: MOVWF OPTION
Si antes de la instruccin. OPTION = FF h
W = 4F h
Al ejecutarse: OPTION = 4F h
W = 4F h

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 59
NOP NOP
No operation
Operacin no operacin
Sintaxis [Etiqueta] NOP
Operadores No tiene
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0000 0xx0 0000
Descripcin No realiza operacin alguna. En realidad, se consume un
ciclo de instruccin sin hacer nada.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

EJEMPLO: NOP


RETFIE RETFIE
Return from Interrupt
Operacin TOS --> PC
1 --> GIE
Sintaxis [Etiqueta] RETFIE
Operadores No tiene
Palabras 1
Ciclos 2
Cdigo de
Operacin
00 0000 0000 1001

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 60
Descripcin Carga el PC con el valor que se encuentra en la parte alta de
la Pila, asegurando as la vuelta de la interrupcin. Pone a 1
el bit GIE, con el fin de autorizar de nuevo que se tengan en
cuenta las interrupciones.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

EJEMPLO: RETFIE
Al ejecutarse: PC = TOS
GIE = 1

RETLW RETLW
Retur with Literal in W
Operacin k --> (W);
TOS ---> PC
Sintaxis [Etiqueta] RETLW k
Operadores 0 < K < 255
Palabras 1
Ciclos 2
Cdigo de
Operacin
11 01xx Kkkk kkkk
Descripcin Carga el registro W con el literal k, y despus carga el PC
con el valor que se encuentra en la parte superior de la PILA,
efectuando as un retorno de subrutina.
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 61
EJEMPLO: CALL TABLA ;W contiene tabla
. ; el valor offset
. ;W nuevo valor de tabla
TABLA: ADDWF PC ;W = offset
RETLW k1 ; Nueva Tabla
RETLW k2
.
.
.
RETLW kn ;Fin de tabla
Antes de ejecutarse la instruccin W = 07 h
Al ejecutarse la instruccin W = Toma el valor de k7

RETURN RETURN
Return from Subroutine
Operacin TOS ---> PC
Sintaxis [Etiqueta] RETURN
Operadores No tiene
Palabras 1
Ciclos 2
Cdigo de
Operacin
00 0000 0000 1000
Descripcin Carga el PC con el valor que se encuentra en la parte
superior de la PILA, efectuando as un retorno de subrutina

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 62

RLF RLF
Rotate Left f through Carry
Operacin

Sintaxis [Etiqueta] RLF f,d
Operadores 0
d [0,1]
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 1101 Dfff ffff
Descripcin Rotacin de un bit a la izquierda del contenido del registro f,
pasando por el bit de acarreo C. Si d=1 el resultado se
almacena en f, si d=0 el resultado se almacena en W.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - X

EJEMPLO: RLF REG1,0
Si antes de la instruccin. REG1 = 1110 0110 b
flag C = 0
Como d= 0 el resultado queda en W
Al ejecutarse: REG1 = 1110 0110 b
W = 1100 1100 b
flag C = 1





Circuitos Integrados Programables
Juan Antonio Barrios Huzar 63

RRF RRF
Rotate Right f through Carry
Operacin

Sintaxis [Etiqueta] RRF f,d
Operadores 0
d [0,1]
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 1100 dfff ffff
Descripcin Rotacin de un bit a la derecha del contenido del registro f,
pasando por el bit de acarreo C. Si d=1 el resultado se
almacena en f, si d=0 el resultado se almacena en W

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - X

EJEMPLO: RRF REG1,0
Si antes de la instruccin. REG1 = 1110 0110 b
flag C = 1
Como d= 0 el resultado queda en W
Al ejecutarse: REG1 = 1110 0110 b
W = 0111 0011 b
flag C = 0



Circuitos Integrados Programables
Juan Antonio Barrios Huzar 64

SLEEP SLEEP
Sleep
Operacin 00h ---> WDT
0 ---> WDT prescaler
1 ---> TO#
0 --> PD#
Sintaxis [Etiqueta] SLEEP
Operadores No tiene
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0000 0110 0011
Descripcin Pone al circuito en modo Sleep (bajo consumo) con parada del
oscilador. Pone a 0 el flag PD# (Power Down) y el flag TO#
(Timer Out) se pone a 1. Se puede salir de este estado por:
1. Activacin de MCLR para provocar un Reset
2. Desbordamiento del Watchdog si qued operativo en
el modo reposo
3. Generacin de una interrupcin que no sea TMR0 ya
que sta se desactiva con la instruccin SLEEP.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z# DC C
- - - 1 0 - - -

TO Se pone a 1 al ejecutar la instruccin SLEEP o CLRWDT
PD Se pone a 0 al ejecutar la instruccin SLEEP
EJEMPLO: SLEEP




Circuitos Integrados Programables
Juan Antonio Barrios Huzar 65

SUBLW SUBLW
Subtract W from Literal
Operacin k - (W) ---> (W)
Sintaxis [Etiqueta] SUBLW k
Operadores
Palabras 1
Ciclos 1
Cdigo de
Operacin
11 110x Kkkk Kkkk
Descripcin Resta en complemento a dos del contenido del literal k el
contenido del registro W, y almacena el resultado en W.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X X X

Z Se pone a 1 si el resultado de la operacin es cero
DC Se pone a 1 si se genera un acarreo del bit 3 al grupo de 4 bits superior
C Se pone a 1 si se genera un acarreo del bit de mayor peso
EJEMPLO: SUBLW 0x 02
Si antes de la instruccin. W = 01 h
flag C = ?
Al ejecutarse: W = 01
flag C = 1 ; el resultado es positivo
Si antes de la instruccin. W = 02 h
flag C = ?
flag Z = ?

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 66
Al ejecutarse: W = 00 h
flag C = 1 ; el resultado es cero
flag Z = 1
Si antes de la instruccin. W = 03 h
flag C = ?
Al ejecutarse: W = FF h
flag C = 0 ; el resultado es negativo

SUBWF SUBWF
Subtract W from f
Operacin (f) - (W) ---> (dest)
Sintaxis [Etiqueta] SUBW f,d
Operadores 0
d [0,1]
Palabras 1
Ciclos 1
Cdigo de
Operacin
00 0010 Dfff Ffff
Descripcin Resta en complemento a dos el contenido del registro f
menos el contenido del registro W almacena el resultado en
W si d=0 y en f si d=1.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X X X

Z Se pone a 1 si el resultado de la operacin es cero
DC Se pone a 1 si se genera un acarreo del bit 3 al grupo de 4 bits superior
C Se pone a 1 si se genera un acarreo del bit de mayor peso
EJEMPLO: SUBWF REG1,1

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 67
a) Si antes de la instruccin. REG1 = 03 h
W = 02 h
flag C = ?
Al ejecutarse REG1 = 01h
W = 02 h
flag C = 1 ; el resultado es positivo
b) Si antes de la instruccin. REG1 = 02 h
W = 02 h
flag C = ?
Al ejecutarse REG1 = 00h
W = 02 h
flag C = 1 ; el resultado es cero
falz Z = 1 ; el resultado es cero
c) Si antes de la instruccin. REG1 = 01 h
W = 02 h
bit C = ?
Al ejecutarse REG1 = 00h
W = FF h
flag C = 0 ; el resultado es negativo
falz Z = 1 ; el resultado es cero

SWAPF SWAPF
Swap Nibbles in f
Operacin (f<3:0>) ---> (dest <7:4>)
(f<7:4>) ---> (dest <3:0>)
Sintaxis [Etiqueta] SWAPF f,d
Operadores 0
d [0,1]
Palabras 1
Ciclos 1

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 68
Cdigo de
Operacin
00 1110 dfff ffff
Descripcin Los cuatro bits de ms peso del registro f se intercambian
con los 4 bits de menos peso del mismo registro. Si d=0 el
resultado se almacena en W, si d=1 el resultado se
almacena en f.

Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - - - -

EJEMPLO: SWAPF REG1,0
Si antes de la instruccin. REG1 = A5 h = 1010 0101 h
Como d=0 el resultado se almacenar en W
Al ejecutarse la instruccin: REG1 = A5 h = 1010 0101 b
W = 5A h = 0101 1010 b


XORLW XORLW
Exclusive OR Literal With k
Operacin (W).XOR.k ---> (W)
Sintaxis [Etiqueta] XORLW k
Operadores 0
Palabras 1
Ciclos 1
Cdigo de
Operacin
11 1010 kkkk kkkk
Descripcin Realiza la funcin OR-Exclusiva entre el contenido del registro
W y la constante k de 8 bits. El resultado se almacena en W


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 69
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -
Z Se pone a 1 si el resultado de la ltima operacin es cero
EJEMPLO: XORLW 0xAF
Si antes de la instruccin. W = 1011 0101 b = B5 h

h

XORWF XORWF
Exclusive OR With f
Operacin (W).XOR.(f) ---> (des)
Sintaxis [Etiqueta] XORWF f,d
Operadores
d [0,1]
Palabras 1
Ciclos 1
Descripcin Realiza la funcin OR-Exclusiva entre el contenido del
registro W y el contenido del registro f, y almacena el
resultado en f si d=1 y en W si f=0
Registro de STATUS
PA2 PA1 PA0 TO# PD# Z DC C
- - - - - X - -
EJEMPLO: XORWF REG1,1
Si antes de la instruccin. REG1 = AF h = 1010 1111 b
W = B5 h = 1011 0101 b
Como d=1, el resultado se almacena en REG1
Al ejecutarse: REG1 = 1010 1111
W = B5 h

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 70

SIMULADOR / ENSAMBLADOR
El MPLAB es un "Entorno de Desarrollo Integrado" (Integrated
Development Environment, IDE) que corre en "Windows", mediante el cual se
puede desarrollar aplicaciones para los microcontroladores de las familias PIC
16/17. Con el MPLAB usted puede escribir, depurar y optimizar los programas de
sus diseos con PIC 16/17. El MPLAB incluye un editor de texto, un simulador y
un organizador de proyectos. Por otra parte, tambin soporta al emulador
PICMASTER y a otras herramientas de desarrollo de Microchip como el PICSTAR-
Plus.
Con el Mplab Usted puede:
Depurar sus programas fuentes.
Detectar errores automticamente en sus programas fuente para editarlos.
Depurar los programas utilizando puntos de corte (breakpoints) mediante
valores de los registros internos.
Observar el flujo del programa con el simulador MPLAB-SIM seguirlo en
tiempo real utilizando el emulador PICMASTER.
Realizar medidas de tiempo utilizando un cronometro.
Mirar variables en las ventanas de observacin.
Encontrar respuestas rpidas a sus preguntas, utilizando la ayuda en lnea
del MPLAB.
REQUERIMIENTOS MINIMOS DE HARDWARE Y DE SOFTWARE.
PC con procesador 386 o superior.
4 MB de memoria RAM
8 MB libres de disco duro.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 71
Monitor VGA.
Windows 3.11 de Microsoft o una versin posterior.
Puerto serial 1 o 2 con conector RS232 libre

PASOS PARA PROGRAMAR EL PIC
- Iniciar el Programa:
Despus de haber bajado e instalado el software, haga doble click en el
icono correspondiente a MPLB .
- Definir el tipo de microcontrolador a usar (para el simulador):
En el men "Options", seleccione "Development mode...", ahora despliegue
en el men "MAPLAB-SIM Simulator" y seleccione el tipo de procesador a
utilizar (que en nuestro caso es el 16F84), y finalmente oprima "Reset".

- Habilitar las herramientas para el simulador:
En el men "Tools", seleccione "Verify PICMASTER..." y a continuacin siga
las instrucciones correspondientes en los mens emergentes, y ya esta!.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 72
- PASOS PARA REALIZAR UN PROYECTO
Para realizar un proyecto y estar preparados para la simulacin de un
programa deben seguirse los siguientes pasos: Partimos de que el usuario ya
tenga el programa guardado en el disco duro o disquete el cual desea ensamblar y
abierto bajo el MPLAB.
1. En el men "Project", seleccione la opcin "New Project...", en la ventana
emergente de New Project agregue el nombre del proyecto con extensin
.pjt (deber ser el mismo del archivo .asm) y oprima OK. En la siguiente
ventana Edit Project, seleccione el nombre del achivo .hex ubicado en
Project Files y haga click en Node Properties, seleccione las propiedades
requeridas y de clic en OK. D clic en la opcin Add Node y seleccione el
archivo .asm requerido para despus dar un clic en aceptar. D un clic en
OK para salir de la ventana de proyectos.
2. Realizar la construccin de todo el proyecto: En el men "Project",
seleccione "Make Project".
3. Salvar el proyecto, en el men "Project" presione "Save Project".
4. En esta etapa se realiza en forma automtica el ensamble de nuestro
programa fuente y el vaciado de ste en memoria de simulacin. El proceso
de ensamble generar un archivo de errores en caso de que estos existan,
si es as deben corregirse directamente sobre el archivo fuente, hacer las
correcciones necesarias, salvar (guardar el programa) y reconstruir el
proyecto (Ctrl+F10).
"En esta etapa del proceso ya se tiene el entorno listo para la simulacin del
programa o la programacin del PIC.
- PASOS PARA PROGRAMAR UN PIC


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 73
Para programar un PIC partimos de que el usuario ya tenga conectado el
PICSTAR Plus tanto a la corriente como a la PC y el proyecto hecho y abierto o
activo en el programa MPLAB.
1. D un clic en el men Picstar Plus.
2. D un clic en la opcin Enable Programmer para comunicar la PC con el
PICSAR Plus.
3. Si la comunicacin se realiza correctamente, modifique la configuracin de
bits segn se requiera; si la comunicacin no se realiz correctamente,
verifique todas las conexiones y empiece de nuevo.
4. D un clic en Program y espere a que se programe el PIC.
5. D un clic en close.
En ste punto el PIC est programado y listo para integrarse al circuito
deseado.










Circuitos Integrados Programables
Juan Antonio Barrios Huzar 74


























Circuitos Integrados Programables
Juan Antonio Barrios Huzar 75

PRCTICA 1

Nombre Encendido controlado de un led con PIC
Objetivo
El alumno aplicar los elementos mnimos necesarios para
controlar el encendido y el apagado de un led por medio de un
switch. Los elementos que se manejaran son: Directivas,
Acceso a registros de configuracin, Acceso a Puertos,
Retardos, Llamadas a subrutinas, Elaboracin de un proyecto
dentro del entorno del MPLAB, Fusibles de programacin,
Programacin de PIC e Implementacin.
Material Requerido
1 Tarjeta para prototipos (protoboard)
1 Switch N. A.
1 Resistencia de 100 , w
1 Resistencia de 10 K, w
1 Resistencia de 470 . w
1 Capacitor electroltico de 1 F
2 Capacitores cermicos de 22 pF
1 Led
1 Oscilador o Crystal de 4 Mhz.
1 PIC 16F84
Cables para la conexin
Equipo necesario
PC con el software MPLAB integrado ( en nuestro caso con
un puerto serie con entrada RS232 libre para la
comunicacin con el programador de PICs)
Programador de PICs (en nuestro caso utilizamos el
programador PICSTART Plus).
Fuente regulada de 5Vcc.
Desarrollo de la
prctica
1 Analizar en el grupo o por equipos el programa y el circuito
propuestos.
2 Implementar el circuito propuesto en la figura 1

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 76
3 Realizar en el editor de MPLAB o cualquier editor de texto
el programa propuesto con extensin.asm
4 Realizar en el MPLAB un proyecto con las siguientes
caractersticas:
El nombre del proyecto deber ser el mismo del
archivo, solo que con extensin.pjt
Las propiedades del nodo sern INHX8M y radix
decimal.
5 Conectar el programador a su eliminador y a la PC.
6 Verificar que exista comunicacin entre la PC y el
programador.
7 Insertar el PIC en el programador.
8 Programar el PIC con las siguientes caractersticas:
OSC XT
WDT OFF
PWRTE ON
C. P. OFF
9 Cerrar la ventana de programacin de PICs
10 Grabar el proyecto si as lo desea.
11 Cerrar el proyecto.
12 Quitar el PIC del programador e integrarlo al circuito
propuesto.
13 Aplicar voltaje al circuito (5 Vcc.) y oprimir el switch N. A.
para verificar su funcionamiento.
Actividades
Sugeridas
Los alumnos realizarn por equipos o en forma individual un
circuito y el cdigo en ensamblador de Microchip necesarios
para cumplir con el objetivo de la prctica 2.






Circuitos Integrados Programables
Juan Antonio Barrios Huzar 77

Figura 1


CDIGO PARA LA PRCTICA 1

; ESTA PRACTICA CONSISTE EN ENCENDER Y APAGAR UN LED DESPUES DE
;PRESIONAR Y SOLTAR EL SWITCH O PULSADOR
;================================================================
; FUSIBLES DE PROGRAMACION:
; OSC: XT
; WDT: OFF
; PWRTE: ON
; C. P. OFF
;================================================================
LIST P=PIC16F84
#INCLUDE <P16F84.INC>
status equ 0x03 ;Registro del estado Aritmtico de la ALU
Porta equ 0x05 ;Puerto A
Portb equ 0x06 ;Puerto B
trisa equ 0x85 ;Registro de configuracin del Puerto A
trisb equ 0x86 ;Registro de configuracin del Puerto B
CONTA equ 0x0C
#define BANK1 bsf status,5 ;Macro para abreviar el BANCO 1
#define BANK0 bcf status,5 ;Macro para abreviar el BANCO 0
Org 0 ;Posicin 0 de la Memoria de Programa (apuntador)
INICIO BANK1 ;Seleccion del Banco 1
bsf trisb,0 ;Bit 0 de trisb en "1" RB0 = IN
bcf trisa,0 ;El bit 0 del registro trisa es puesto a 0 (0 = Salida) RA0 =
Out
BANK0 ;seleccion del Banco 0
bsf Porta,0 ;Bit 0 del Puerto A en "1" (Lgico), Led = OFF

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 78
ESPERA btfsc Portb,0 ;Lee el interruptor y espera a que sea "0".
(Presionaron el Interruptor?)
goto ESPERA ;no, va a la etiqueta "ESPERA"
call RETARDO ;si, Llama la rutina de RETARDO (Para efectos del
rebote que genera el interruptor)
SOLTAR btfss Portb,0 ;Espera a que se suelte el pulsador. Soltaron
el Pulsador?
goto SOLTAR ;no, va a la Etiqueta "SOLTAR"
bcf Porta,0 ;Bit 0 de Puerto A en "0" (Lgico). Enciende el LED
call RETARDO ;SI, Llama la rutina de RETARDO (Para efectos del
rebote que genera el interruptor)
;************************************************************************************************
;En esta parte del Programa ya el Led est encendido y adems el Switch pulsador
;esta normalmente abierto (Posicin Inicial).
;************************************************************************************************
ESPERA1 btfsc Portb,0 ;Lee el interruptor y espera a que presionen
(esperar que sea "0", para apagar el LED)
goto ESPERA1 ;No lo han presionado, va a la Etiqueta "ESPERA1".
call RETARDO ;Si lo presionaron, Llama la rutina de RETARDO
(Para efectos del rebote que genera el interruptor)
bsf Porta,0 ;Carga a Porta con "1", apaga el LED
SOLTAR1 btfss Portb,0 ;Espera a que se suelte el pulsador.
goto SOLTAR1 ;No lo han soltado, va a la Etiqueta "SOLTAR1"
call RETARDO ;SI, Llama la rutina de RETARDO (Para efectos del
rebote que genera el interruptor)
goto ESPERA ;Finalmente encendieron y apagaron el Led, ahora va
a
;la Etiqueta "ESPERA" para iniciar nuevamente el proceso.
;************************************************************************************************
;ESTA RUTINA GENERA UN TIEMPO PRUDENTE PARA EVITAR QUE LOS ;REBOTES
QUE GENERA EL SWITCH AL SER PRESIONADO CONFUNDAN AL
;MICROCONTROLADOR.Total tiempo de Retardo 772 uS ( Micro Segundos)
;************************************************************************************************
RETARDO clrf CONTA ;CONTA = 0
INCREM incfsz CONTA,1 ;Incrementa a CONTA y salta si = 0? (255 -> 0)
goto INCREM ;Va a la Etiqueta INCREM
return ;Retorna del llamado
end ;Fin del Programa.












Circuitos Integrados Programables
Juan Antonio Barrios Huzar 79
PRCTICA 2

Nombre Encendido controlado de dos leds con PIC
Objetivo
Con base en lo aprendido en la prctica 1 el alumno disear
un circuito y un programa para controlar el encendido y el
apagado de dos leds, cada uno con su propio switch. La seal
para el encendido o apagado de los leds se mandar por los
bits 0 y 1 del puerto A. La seal del switch para apagar o
encender los leds se recibir en los bits 0 y 1 del puerto B.
Material Requerido
1 Tarjeta para prototipos (protoboard)
2 Switch N. A.
1 Resistencia de 100 , w
1 Resistencia de 10 K, w
2 Resistencia de 470 . w
1 Capacitor electroltico de 1 F
2 Capacitores cermicos de 22 pF
2 Led
1 Oscilador o Crystal de 4 Mhz.
1 PIC 16F84
Cables para la conexin
Equipo necesario
PC con el software MPLAB integrado ( en nuestro caso con
un puerto serie con entrada RS232 libre para la
comunicacin con el programador de PICs)
Programador de PICs (en nuestro caso utilizamos el
programador PICSTART Plus).
Fuente regulada de 5Vcc.
Desarrollo de la
prctica
1 Implementar el circuito realizado por los alumnos o en su
caso el propuesto en la figura 2
2 Realizar en el editor de MPLAB o cualquier editor de texto el

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 80
cdigo en ensamblador de Microchip realizado por los
alumnos, o bien, el programa propuesto con extensin .asm
3 Realizar en el MPLAB un proyecto con las siguientes
caractersticas:
El nombre del proyecto deber ser el mismo del
archivo, solo que con extensin .pjt
Las propiedades del nodo sern INHX8M y radix
decimal.
4 Conectar el programador a su eliminador y a la PC.
5 Verificar que exista comunicacin entre la PC y el
programador.
6 Insertar el PIC en el programador.
7 Programar el PIC con las siguientes caractersticas:
OSC XT
WDT OFF
PWRTE ON
C. P. OFF
8 Cerrar la ventana de programacin de PICs
9 Grabar el proyecto si as lo desea.
10 Cerrar el proyecto.
11 Quitar el PIC del programador e integrarlo al circuito
propuesto.
12 Aplicar voltaje al circuito (5 Vcc.) y oprimir los switch N. A.
para verificar su funcionamiento.











Circuitos Integrados Programables
Juan Antonio Barrios Huzar 81
Figura 2


CDIGO PARA LA PRCTICA 2

;ESTA PRACTICA CONSISTE EN ENCENDER Y APAGAR DOS LED DESPUES DE
PRESIONAR Y SOLTAR EL PULSADOR CORRESPONDIENTE A CADA UNO.
;================================================================
; FUSIBLES DE PROGRAMACION:
; OSC: XT
; WDT: OFF
; PWRTE: ON
; C. P. OFF
;================================================================
LIST P=PIC16F84
#INCLUDE <P16F84.INC>
status equ 0x03 ;Registro del estado Aritmtico de la ALU
Porta equ 0x05 ;Puerto A
Portb equ 0x06 ;Puerto B
trisa equ 0x85 ;Registro de configuracin del Puerto A
trisb equ 0x86 ;Registro de configuracin del Puerto B
CONTA equ 0x0C ;Registro auxiliar para el RETARDO
#define BANK1 bsf status,5 ;Macro para abreviar el BANCO 1
#define BANK0 bcf status,5 ;Macro para abreviar el BANCO 0
Org 0 ;Posicin 0 de la Memoria de Programa (apuntador)
INICIO BANK1 ;Seleccion del Banco 1
movlw 0x03 ;w = 0x03
movwf trisb ;El contenido de w es copiado a trisb
clrf trisa ;trisa = 0, Todo el Puerto RA = Salida
BANK0 ;seleccion del Banco 0

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 82
movlw 0x03 ;w = 0x03
movwf Porta ;Porta= w, Bit 0 y 1 del Puerto A en "1" (Lgico), Led1 y Led2
= OFF
ESPERA btfss Portb,0 ;El Sw1 est abierto?
goto SOLTAR1 ;no (Presionaron el Sw1), va a la Etiqueta SOLTAR1
btfss Portb,1 ;Si, el Sw2 est abierto?
goto SOLTAR2 ;no (Presionaron el Sw2), va a la Etiqueta SOLTAR2
goto ESPERA ;si, va a la etiqueta "ESPERA" a esperar a que
presionen algn Sw.
SOLTAR1 call RETARDO ;Llama la rutina de RETARDO (Para efectos
del rebote que genera el interruptor)
WAIT1 btfss Portb,0 ;Espera a que se suelte el Sw1. Soltaron el Pulsador?
goto WAIT1 ;no, va a la Etiqueta "SOLTAR1"
btfss Porta,0 ;El RA0 = 1?
goto OFF1 ;no, est en 0, va a OFF1
bcf Porta,0 ;si, Enciende el LED
call RETARDO ;Llama la rutina de RETARDO (Para efectos del
rebote que genera el interruptor)
goto ESPERA ;Despues de actualizar los estados, regresa
nuevamente a ESPERA
OFF1 bsf Porta,0 ;Apaga el LED
call RETARDO ;Llama la rutina de RETARDO (Para efectos del
rebote que genera el interruptor)
goto ESPERA ;Despues de actualizar los estados, regresa
nuevamente a ESPERA
SOLTAR2 call RETARDO ;Llama la rutina de RETARDO (Para efectos
del rebote que genera el interruptor)
WAIT2 btfss Portb,1 ;Espera a que se suelte el Sw2. Soltaron el Pulsador?
goto WAIT2 ;no, va a la Etiqueta "SOLTAR2"
btfss Porta,1 ;Si, el RA1 = 1?
goto OFF2 ;no, est en 0, va a OFF2
bcf Porta,1 ;si, Enciende el LED
call RETARDO ;Llama la rutina de RETARDO (Para efectos del
rebote que genera el interruptor)
goto ESPERA ;Despues de actualizar los estados, regresa
nuevamente a ESPERA
OFF2 bsf Porta,1 ;Apaga el LED
call RETARDO ;Llama la rutina de RETARDO (Para efectos del
rebote que genera el interruptor)
goto ESPERA ;Despues de actualizar los estados, regresa
nuevamente a ESPERA
;************************************************************************************************
;ESTA RUTINA GENERA UN TIEMPO PRUDENTE PARA EVITAR QUE LOS REBOTES
QUE GENERA EL SWICHT AL SER PRESIONADO CONFUNDAN AL
MICROCONTROLADOR. Total tiempo de Retardo 772 uS ( Micro Segundos)
;************************************************************************************************
RETARDO clrf CONTA ;CONTA = 0
INCREM incfsz CONTA,1 ;Incrementa a CONTA y salta si = 0 (255 -> 0)
goto INCREM ;Va a la Etiqueta INCREM
return ;Retorna del llamado
end ;Fin del Programa.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 83

PRCTICA 3

Nombre Nmeros binarios con leds
Objetivo
Realizar un circuito y el cdigo en ensamblador de Microchip
para que se muestre en 4 leds los nmeros binarios del 0 al 15
dependiendo de la cantidad de pulsaciones que se le den a un
switch n. a. ubicado en RB0/INT; el bit menos significativo
estar en RA0, el siguiente en RA1, el siguiente en RA2, y el
mas significativo en RA3. Los ceros sern representados por
los leds encendidos y los unos por los leds apagados.
Con lo anterior el alumno identificar algunas de las diferentes
instrucciones para manipular el microcontrolador, as como el
acceso a los registros de configuracin de los puertos,
llamadas a subrutina, retardos y acceso al registro de estado
aritmtico de la ALU del PIC.
Material Requerido
1 Tarjeta para prototipos (protoboard)
1 Switch N. A.
1 Resistencia de 100 , w
1 Resistencia de 10 K, w
4 Resistencia de 470 . w
1 Capacitor electroltico de 1 F
2 Capacitores cermicos de 22 pF
4 Led
1 Oscilador o Crystal de 4 Mhz.
1 PIC 16F84
Cables para la conexin
Equipo necesario
PC con el software MPLAB integrado ( en nuestro caso con
un puerto serie con entrada RS232 libre para la

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 84
comunicacin con el programador de PICs)
Programador de PICs (en nuestro caso utilizamos el
programador PICSTART Plus).
Fuente regulada de 5Vcc.
Desarrollo de la
prctica
1 Analizar en el grupo o por equipos el programa y el circuito
propuestos.
2 Implementar el circuito propuesto en la figura 3
3 Realizar en el editor de MPLAB o cualquier editor de texto
el programa propuesto con extensin .asm
4 Realizar en el MPLAB un proyecto con las siguientes
caractersticas:
El nombre del proyecto deber ser el mismo del
archivo, solo que con extensin .pjt
Las propiedades del nodo sern INHX8M y radix
decimal.
5 Conectar el programador a su eliminador y a la PC.
6 Verificar que exista comunicacin entre la PC y el
programador.
7 Insertar el PIC en el programador.
8 Programar el PIC con las siguientes caractersticas:
OSC XT
WDT OFF
PWRTE ON
C. P. OFF
9 Cerrar la ventana de programacin de PICs
10 Grabar el proyecto si as lo desea.
11 Cerrar el proyecto.
12 Quitar el PIC del programador e integrarlo al circuito
propuesto.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 85
13 Aplicar voltaje al circuito (5 Vcc.) y oprimir el switch N. A.
para verificar su funcionamiento
(recuerde que los unos sern representados por los leds
apagados y los ceros por los leds encendidos).
Actividades
Sugeridas
Los alumnos modificarn el cdigo para que los unos se
representen con los leds encendidos y los ceros con leds
apagados.
Modificar el cdigo y el hardware para que la salida de los
nmeros binarios se d en el puerto B en lugar del puerto A.


Figura 3





Circuitos Integrados Programables
Juan Antonio Barrios Huzar 86
CDIGO PARA LA PRCTICA 3

;ESTA PRACTICA CONSISTE EN VISUALIZAR EN CUATRO LEDS LOS ;NUMEROS
EQUIVALENTES EN BINARIO DEPENDIENDO DE LA CANTIDAD DE ;PULSACIONES
DEL SWITCH PULSADOR.
;================================================================
; FUSIBLES DE PROGRAMACION:
; OSC: XT
; WDT: OFF
; PWRTE: ON
; C.P. OFF
;================================================================
LIST P=PIC16F84
#INCLUDE <P16F84.INC>
status equ 0x03 ;Registro del estado Aritmtico de la ALU
Porta equ 0x05 ;Puerto A
Portb equ 0x06 ;Puerto B
trisa equ 0x85 ;Registro de configuracin del Puerto A
trisb equ 0x86 ;Registro de configuracin del Puerto B
CONTA equ 0x0C ;Registro auxiliar para el RETARDO
CONTA2 equ 0x0D ;Registro auxiliar para el RETARDO
#define BANK1 bsf status,5 ;Macro para abreviar el BANCO 1
#define BANK0 bcf status,5 ;Macro para abreviar el BANCO 0
Org 0 ;Posicin 0 de la Memoria de Programa (apuntador)
INICIO BANK1 ;Seleccion del Banco 1
clrf trisa ;trisa = 0, todo el puerto A como salida
bsf trisb,0 ;Bit 0 del puerto B = 1, RB1 = IN
BANK0 ;Seleccion del Banco 0
clrf Porta ;Puerto A = 0
TEST btfsc Portb,0 ;Presionaron?
goto TEST ;No, va a TEST
SOLTAR call RETARDO ;Si, Llama la rutina de RETARDO (Para
efectos del rebote que genera el interruptor)
WAIT btfss Portb,0 ;Soltaron el Interruptor?
goto WAIT ;no, va a la Etiqueta "WAIT"
incf Porta,1 ;Si, Incrementa al Puerto A en 1 y lo guarda en l
mismo.
movlw .16 ;w = 16
xorwf Porta,0 ;exor entre w y Porta
btfss status,2 ;Numero = 16?
goto TEST ;No, va a TEST
clrf Porta ;Si. Limpia el Puerto A
goto TEST ;y va a TEST para iniciar el proceso otra vez.
;************************************************************************************************
;ESTA RUTINA GENERA UN TIEMPO PRUDENTE PARA EVITAR QUE LOS REBOTES
QUE GENERA EL SWICHT AL SER PRESIONADO CONFUNDAN AL
MICROCONTROLADOR. Total tiempo de Retardo 1.55 mS ( Mili Segundos)
;************************************************************************************************
RETARDO movlw .2 ;Carga a w con el decimal 2
movwf CONTA2 ;CONTA2 = w

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 87
RESET clrf CONTA ;CONTA = 0
INCREM incfsz CONTA,1 ;Incrementa a CONTA y salta si = 0? (255 ->
0)
goto INCREM ;Va a la Etiqueta INCREM
decfsz CONTA2,1 ;Decrementa a CONTA2, salta si = 0
goto RESET ;Va a reset
return ;Retorna del llamado
end ;Fin del Programa.






PRCTICA 4

Nombre Secuenciador de luces
Objetivo
Aplicar un circuito Resistivo-Capacitivo (RC) para dar la
entrada de seal de reloj en lugar de un oscilador o cristal de
cuarzo.
Material Requerido
1 Tarjeta para prototipos (protoboard)
1 Switch N. A.
1 Resistencia de 1 K, w
1 Resistencia de 12 K, w
1 Resistencia de 330 . w
1 Capacitores cermicos de 0.001 F.
8 Leds.
1 PIC 16F84.
Cables para la conexin
Equipo necesario
PC con el software MPLAB integrado ( en nuestro caso con
un puerto serie con entrada RS232 libre para la
comunicacin con el programador de PICs)
Programador de PICs (en nuestro caso utilizamos el

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 88
programador PICSTART Plus).
Fuente regulada de 5Vcc.
Desarrollo de la
prctica
1 Analizar en el grupo o por equipos el programa y el circuito
propuestos.
2 Implementar el circuito propuesto en la figura 4
3 Realizar en el editor de MPLAB o cualquier editor de texto
el programa propuesto con extensin .asm
4 Realizar en el MPLAB un proyecto con las siguientes
caractersticas:
El nombre del proyecto deber ser el mismo del
archivo, solo que con extensin .pjt
Las propiedades del nodo sern INHX8M y radix
decimal.
5 Conectar el programador a su eliminador y a la PC.
6 Verificar que exista comunicacin entre la PC y el
programador.
7 Insertar el PIC en el programador.
8 Programar el PIC con las siguientes caractersticas:
OSC RC
WDT OFF
PWRTE ON
C. P. OFF
9 Cerrar la ventana de programacin de PICs
10 Grabar el proyecto si as lo desea.
11 Cerrar el proyecto.
12 Quitar el PIC del programador e integrarlo al circuito
propuesto.
13 Aplicar voltaje al circuito (5 Vcc.)

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 89
14 Verificar su funcionamiento.
Actividades
Sugeridas
Los alumnos realizarn los cambios necesarios al software
para cambiar la velocidad del encendido de los leds.
Los alumnos realizaran los cambios necesarios al hardware
para cambiar la velocidad del circuito.
Encontrar la relacin entre resistencia y capacitor (del
circuito temporizador RC) para la frecuencia de
funcionamiento.

Figura 4


CDIGO PARA LA PRCTICA 4


TRISA EQU 85h
TRISB EQU 86h
PORTA EQU 05h
PORTB EQU 06h
STATUS EQU 03h
cuenta EQU 15h
cuenta2 EQU 16h
LUZ EQU 17h

list p=16f84

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 90
ORG 00h ; vector de reset
goto INICIO
INICIO movlw 00
bsf STATUS,5 ;registro de configuracion
movwf TRISB ; puerto b como salidas
bcf STATUS,5 ;puerto
comienza movlw 01h
movwf LUZ
aqui rlf LUZ,0
movwf PORTB
movwf LUZ
call retardo
btfss LUZ,7
goto aqui
ahi rrf LUZ,0
movwf PORTB
movwf LUZ
call retardo
btfss LUZ,0
goto ahi
goto comienza




retardo movlw 99h ;modificando este dato aumenta o
movwf cuenta ;disminuye la velocidad...
retar1 decfsz cuenta,1
goto retar1
movlw 99h ;o modificando este otro
movwf cuenta2
retard decfsz cuenta2,1
goto retard
return

end
















Circuitos Integrados Programables
Juan Antonio Barrios Huzar 91

PRCTICA 5

Nombre Nmeros Hexadecimales
Objetivo
Utilizar tablas que manden salidas predefinidas por medio de
numeracin hexadecimal para activar dispositivos externos, en
este caso, las salidas predefinidas activaran los segmentos
necesarios para visualizar los dgitos hexadecimales en un
display de 7 segmentos de ctodo comn dependiendo de las
pulsaciones de un switch, iniciando en el cero hasta llegar a la
F, para volver empezar en el cero.
Material Requerido
1 Tarjeta para prototipos (protoboard)
1 Switch N. A.
1 Resistencia de 10 K, w
7 Resistencia de 470 . w
1 Capacitor electroltico de 1 F
2 Capacitores cermicos de 22 pF
1 Display de 7 segmentos de ctodo comn
1 Oscilador o Crystal de 4 Mhz.
1 PIC 16F84
Cables para la conexin
Equipo necesario
PC con el software MPLAB integrado ( en nuestro caso con
un puerto serie con entrada RS232 libre para la
comunicacin con el programador de PICs)
Programador de PICs (en nuestro caso utilizamos el
programador PICSTART Plus).
Fuente regulada de 5Vcc.
Desarrollo de la
prctica
1. Analizar en el grupo o por equipos el programa y el circuito
propuestos.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 92
2. Implementar el circuito propuesto en la figura 5
3. Realizar en el editor de MPLAB o cualquier editor de texto el
programa propuesto con extensin .asm
4. Realizar en el MPLAB un proyecto con las siguientes
caractersticas:
El nombre del proyecto deber ser el mismo del
archivo, solo que con extensin .pjt
Las propiedades del nodo sern INHX8M y radix
decimal.
5. Conectar el programador a su eliminador y a la PC.
6. Verificar que exista comunicacin entre la PC y el
programador.
7. Insertar el PIC en el programador.
8. Programar el PIC con las siguientes caractersticas:
OSC XT
WDT OFF
PWRTE ON
C. P. OFF
9. Cerrar la ventana de programacin de PICs
10. Grabar el proyecto si as lo desea.
11. Cerrar el proyecto.
12. Quitar el PIC del programador e integrarlo al circuito
propuesto.
13. Aplicar voltaje al circuito (5 Vcc.)
14. Oprimir el switch N. A. para verificar su funcionamiento.
Actividades
Sugeridas
Modificar el cdigo y el hardware para poder utilizar un
display de siete segmentos de ctodo comn.






Circuitos Integrados Programables
Juan Antonio Barrios Huzar 93
Figura 5




CDIGO PARA LA PRCTICA 5


;ESTA PRACTICA CONSISTE EN VISUALIZAR EN UN DISPLAY DE SIETE
;SEGMENTOS DE ANODO COMUN LOS NUMEROS HEXADECIMALES
;DEPENDIENDO DE LA CANTIDAD DE PULSACIONES DEL SWICH HACIENDO ;USO
DE LA INTERRUPCION POR EL PUERTO RBO Y ADEMAS SIN EL USO DEL
;DECODIFICADOR A SIETE SEGMENTOS (7447).
;================================================================
; FUSIBLES DE PROGRAMACION:
; OSC: XT
; WDT: OFF
; PWRTE: ON
; CP0: OFF
;================================================================
LIST P=PIC16F84
#INCLUDE <P16F84.INC>
pcl equ 0x02 ;Contador de programa
status equ 0x03 ;Registro del estado Aritmtico de la ALU
Porta equ 0x05 ;Puerto A
Portb equ 0x06 ;Puerto B

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 94
Optionr equ 0x81 ;Registro de Configuracin multiple
trisa equ 0x85 ;Registro de configuracin del Puerto A
trisb equ 0x86 ;Registro de configuracin del Puerto B
Intcon equ 0x0B ;Registro para el control de Interrupciones
CONTA equ 0x0C ;Registro auxiliar para el RETARDO
DIGITO equ 0x0D ;Registro auxiliar que lleva el conteo del digito a
visualizar
#define BANK1 bsf status,5 ;Macro para abreviar el BANCO 1
#define BANK0 bcf status,5 ;Macro para abreviar el BANCO 0
Org 0 ;Posicin 0 de la Memoria de Programa (apuntador)
goto INICIO ;Va a la etiqueta INICIO
;************************************************************************************************
;EN ESTA PARTE DEL PROGRAMA SE ATIENDE LA INTERRUPCION QUE EN
;NUESTRO CASO ES POR BAJO ACTIVO EN EL PIN RB0/INT
;************************************************************************************************
Org 4 ;Vector de Interrupcin, cuando sucede la interrupcin
;el programa se direcciona a Org 4
btfss Intcon,1 ;Fu Interrupcin?
retfie ;no, retorne y habilite interrupciones globales (Gie = 1)
movlw 15 ;si, carga a w = 15
xorwf DIGITO,0 ;exor entre w y DIGITO (Para determinar que el Conteo slo
va hasta F)
btfss status,2 ;DIGITO es 15?
goto UP ;NO, va a UP
clrf DIGITO ;SI, DIGITO = 0
goto VISUAL ;va a VISUAL
UP incf DIGITO,1 ;Incrementa al registro DIGITO
VISUAL call TABLA ;Llama la TABLA
movwf Portb ;el contenido de w lo pasa al Puerto B para visualizar el digito
correspondiente
;************************************************************************************************
;ESTA PARTE ES OPCIONAL, SE DEJA A VOLUNTAD DEL USUARIO Y SE ;COLOCA
POR SEGURIDAD

SOLTAR call RETARDO ;llama la rutina de retardo para evitar rebotes
btfss Portb,0 ;Soltaron el interruptor?
goto SOLTAR ;NO, va a SOLTAR
;************************************************************************************************
bcf Intcon,1 ;SI, borra la bandera de Interrupcin por cambio en el
RB0/INT
retfie ;Retorna y habilita las interrupciones globales (GIE = 1)

;---------------------------------------------------------------------------------------------------------------
;Si el usuario no desea utilizar la instruccin "RETFIE", tambin se puede
;reemplazar por las dos siguientes lineas que equivalen a lo mismo:
; bsf Intcon,7 ;Habilita Interrupciones globales (Gie =1)
; return ;retorna del llamado
;----------------------------------------------------------------------------------------------------------------
;************************************************************************************************
; INICIO DEL PROGRAMA
; CONFIGURACION DE PUERTOS E INICIO DE VARIABLES

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 95
;************************************************************************************************
INICIO BANK1 ;Seleccion del Banco 1
movlw 0x01 ;w = 0x01
movwf trisb ;Bit 0 de trisb en "1" RB0 = IN; RB1-RB7 = 0
clrf trisa ;trisa = 0, Todo el Puerto RA = Salida (Aunque no lo
Utilizamos)
BANK0 ;seleccion del Banco 0
clrf DIGITO ;DIGITO = 0
call TABLA
movwf Portb ;Porta= w, Visualizar el digito 0
;************************************************************************************************
; PROGRAMACION DE LA INTERRUPCION
;************************************************************************************************
BANK1 ;Seleccion del Banco 1
movlw 0x80 ;w = 0x80
movwf Optionr ;Optionr = w
BANK0 ;Seleccion del Banco 0
movlw 0x90 ;w = 0x90
movwf Intcon ;Intcon = w
WAIT sleep ;Dormir (Esta instruccin permite que el microcontrolador
;entre en un estado pasivo donde consume muy poca
potencia.
goto WAIT ;Va a Wait
;************************************************************************************************
; TABLA PARA DISPLAY DE ANODO COMUN
;************************************************************************************************
TABLA movf DIGITO,0 ;Mueve el contenido de DIGITO a w
addwf pcl,1 ;suma a pcl el contenido de w
retlw 0x80 ;Cuando el digito es 0 (Retorno Literal con el valor en w)
retlw 0xF2 ;Cuando el digito es 1 (Retorno Literal con el valor en w)
retlw 0x48 ;Cuando el digito es 2 (Retorno Literal con el valor en w)
retlw 0x60 ;Cuando el digito es 3 (Retorno Literal con el valor en w)
retlw 0x32 ;Cuando el digito es 4 (Retorno Literal con el valor en w)
retlw 0x24 ;Cuando el digito es 5 (Retorno Literal con el valor en w)
retlw 0x04 ;Cuando el digito es 6 (Retorno Literal con el valor en w)
retlw 0xF0 ;Cuando el digito es 7 (Retorno Literal con el valor en w)
retlw 0x00 ;Cuando el digito es 8 (Retorno Literal con el valor en w)
retlw 0x20 ;Cuando el digito es 9 (Retorno Literal con el valor en w)
retlw 0x10 ;Cuando el digito es A (Retorno Literal con el valor en w)
retlw 0x06 ;Cuando el digito es B (Retorno Literal con el valor en w)
retlw 0x8C ;Cuando el digito es C (Retorno Literal con el valor en w)
retlw 0x42 ;Cuando el digito es D (Retorno Literal con el valor en w)
retlw 0x0C ;Cuando el digito es E (Retorno Literal con el valor en w)
retlw 0x1C ;Cuando el digito es F (Retorno Literal con el valor en w)
;************************************************************************************************
;ESTA RUTINA GENERA UN TIEMPO PRUDENTE PARA EVITAR QUE LOS REBOTES
QUE GENERA
;EL SWICHT AL SER PRESIONADO CONFUNDAN AL MICROCONTROLADOR.
;Total tiempo de Retardo 772 uS ( Micro Segundos)
;************************************************************************************************
RETARDO clrf CONTA ;CONTA = 0

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 96
INCREM incfsz CONTA,1 ;Incrementa a CONTA y salta si = 0? (255 ->
0)
goto INCREM ;Va a la Etiqueta INCREM
return ;Retorna del llamado
end ;Fin del Programa.



PRCTICA 6

Nombre Accesando a un LCD desde un teclado de computadora
Objetivos
Compilar varios archivos .asm y . h que sern llamados
desde el programa principal.
Conocer las funciones bsicas de los pins del socket de un
teclado de computadora.
Conocer las funciones bsicas de los pins de un lcd.
Imprimir caracteres en un LCD mandados desde un teclado.
Material Requerido
1 Tarjeta para prototipos (protoboard)
1 Resistencia variable de 10 K
1 Resistencia de 1 K, W
1 Capacitor electroltico de 1 F
2 Capacitores cermicos de 22 pF
1 LCD (2 x 16)
1 Teclado de computadora
1 Oscilador o Crystal de 10 Mhz.
1 PIC 16C84
Cables para la conexin
Equipo necesario
PC con el software MPLAB integrado ( en nuestro caso con
un puerto serie con entrada RS232 libre para la
comunicacin con el programador de PICs)
Programador de PICs (en nuestro caso utilizamos el
programador PICSTART Plus).
Fuente regulada de 5Vcc.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 97
Desarrollo de la
prctica
1. Analizar en el grupo o por equipos los programas y el
circuito propuestos.
2. Implementar el circuito propuesto en la figura 6
3. Realizar en el editor de MPLAB o cualquier editor de texto
los programas propuestos con la extensin indicada (.asm o
.h)
4. Realizar en el MPLAB un proyecto con las siguientes
caractersticas:
El nombre del proyecto deber ser el mismo del
archivo principal, solo que con extensin .pjt
Las propiedades del nodo sern INHX8M y radix
decimal.
5 Conectar el programador a su eliminador y a la PC.
6 Verificar que exista comunicacin entre la PC y el
programador.
7 Insertar el PIC en el programador.
8 Programar el PIC con las siguientes caractersticas:
OSC XT
WDT OFF
PWRTE ON
C. P. OFF
9 Cerrar la ventana de programacin de PICs
10 Grabar el proyecto si as lo desea.
11 Cerrar el proyecto.
12 Quitar el PIC del programador e integrarlo al circuito
propuesto.
13 Aplicar voltaje al circuito (5 Vcc.)
14 Verificar su funcionamiento mandando informacin desde el
teclado.

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 98
Actividades
Sugeridas
Al implementar la prctica, se notar que el carcter que se
oprime desde el teclado se imprime en el LCD 2 veces
(cuando se oprime la tecla y cuando se suelta). La actividad
sugerida es quitar el efecto de rebote para que el carcter
enviado solo se imprima una vez.
Realizar una investigacin sobre el manejo de los LCD.


Figura 6





KEYVIEW.ASM (Programa Principal)

list P=16C84

Clock_Freq equ d'10000000' ;10MHz
#define ODD_PARITY 1

include "P16c84.inc"

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 99
include "lcdint.h"

include "wait.mac"
include "LCDintk.asm"
include "lm032lhi.asm"
include "convertk.asm"
;
;****************************************************************
; Power up routine
; This is the program entry point. I/O line status is
; set for port A here.
;****************************************************************

Powerup
bsf STATUS, RP0
movlw b'00010000'
movwf TRISA ; set all port A except pa4 as output
movlw b'00000001'
movwf TRISB ;set all port B except pb0, to o/p
movlw b'10010111'
movwf OPTION_REG

bcf STATUS,RP0
movlw b'00011111'
movwf PORTA ; all output lines high
clrf PORTB

movlw Qmin
movwf QueueheadFSR
movwf Queuetail
movlw HIGH HI_TABLE
movwf PCLATH
call SETUP_INT
call DISPLAY_RESET
;now just display any char that comes in
; get data from the queue, display on top line of LCD, convert to actual
; ASCII + shift state
endlessloop
MOVF Queuetail, W ;
SUBWF QueueheadFSR, W ;if head - tail = zero, no byte
btfsc STATUS, Z
goto endlessloop

call GETQCHAR
call DO_LOOKUP
call LCDBYTE
goto endlessloop

;First the powerup code
; set reset vector
org 000h ;

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 100
goto Powerup

end


LCDINT.H

Qmin equ 0x23
Qmax equ 0x2F
Queuetail equ 0x0C
QueueheadFSR equ FSR
CHAR equ 0x0D
;LCDflags equ 0x0E
temp_INT EQU 0x0F
W_TEMP EQU 0x10
STATUS_TEMP EQU 0x11
inbyte EQU 0x12
TEMP EQU 0x13
tempone EQU 0x14
temptwo EQU 0x15
tempthree equ 0x16
DATAIN equ 0x17
outbyte equ 0x18
LCDDDADDR equ 0x19

;TOGGLEVALUE equ 0x10
;CHARCMDMASK EQU b'00000001'

;charcmd EQU 0
Paritybit EQU 0


Passlock EQU 0x0E
Lshift EQU 0
Rshift EQU 1
Lctrl EQU 2
Lalt EQU 3
LRsLcLaMASK EQU 0x0F
FirstNo EQU 4
Pass1stMASK EQU 0x1F
SecNo EQU 5
Pass2ndMASK EQU 0x3F
ThirdNo EQU 6
Pass3rdMASK EQU 0x7F
FourthNo EQU 7
PasswordIN EQU 0xFF

KeyUp EQU 0x1A
KeyUp_bit EQU 0

CHARBUF EQU 0x1B ;these buffers share 1B

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 101
txbuf EQU 0x1B


WAIT.MAC

#define Nanosec * D'1'
#define Microsec * D'1000'
#define Millisec * D'1000000'
#define Seconds * D'1000000000'


;**********************************
;* The WAIT macro *
;* *
;* called by Wait <time> *
;**********************************

Wait macro time_ns, lesscycles ;time_ns gives the wait time required, in ns
; radix dec
variable instruct_time_ns = (( 1 Seconds ) / (Clock_Freq / 4 ))
local cycles
variable cycles = ((time_ns) / instruct_time_ns) ;required delay in
;100ths of instructions

if (cycles < (lesscycles) )
messg ERROR - negative delay time with lesscycles, cycles

exitm
else
variable cycles = (cycles - (lesscycles))
endif

if (cycles == 0)
messg "WARNING - delay time less than 1 instructions"

nop
exitm
endif

if (cycles > (255*(256*3 + 6) + 2 + 3))
messg "ERROR : Too long a wait for the WAIT macro at present!!"
exitm
endif

messg Info - calculated number of cycles = #v(cycles)


if (cycles > ((255*3)+5))

movlw ((cycles-5)/(256*3+6))
call longdelay

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 102

ifndef INCLONGDELAY
#define INCLONGDELAY
endif

exitm
endif

if ((cycles > 8 ) && (cycles < (255*3 + 5)))

movlw ((cycles-5)/3)
call shortdelay

ifndef INCSHORTDELAY
#define INCSHORTDELAY
endif

exitm
endif

if (cycles < 8)
while ( cycles > 1 )

goto $+1 ;two cycle nop

cycles -=2
endw
endif

if (cycles > 0)

exitm
endif

messg "ERROR - got to end of DELAY.ASM"

radix hex
endm


LCDINTK.ASM


;****************************************************************************
;* *
;* Interrupt and queue routines - mainly keybus interfacing, *
;* *
;* *
;****************************************************************************
;* This file and the resulting compiled code copyright1993-96 Steve Lawther *
;* Use of any of this code requires Steve Lawther to have a credit *

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 103
;* within the source code. Commercial use of any of this code *
;* requires permission of the author, Steve Lawther *
;* For more details read 'README.TXT' or email 100255.157@compuserve.com *
;****************************************************************************
;
;interfaced pins:-
; INT - kb to pc Clk
INT EQU 0
#define INTpin PORTB, 0
#define DATApin PORTA, 4

; TEMP - temp location for use in interrupts
; W_TEMP - temp store for W
; STATUS_TEMP - temp store for status
;
;***************************************************************************
;

ORG 0004 ;interrupt vector

PER_INT MOVWF W_TEMP ;store w (could be bank 0 or 1)
SWAPF STATUS, W ;
MOVWF STATUS_TEMP ;
;don't know if using bank 0 or 1
; unless explicit here! (not at mo)
BTFSS INTCON, INTF ; INT interrupt?
GOTO INT_ERROR
;
; The interrupt, therefore the CLK signal - triggered only on TRAILING edge
; The low and high of the clk is 40us each = 100 cycles.
; Wait until pin goes low then read each DATA bit, then check if
; parity is correct - if not, dump byte.

bcf STATUS, RP0
clrf inbyte
bcf STATUS, C
movlw 8 ;setup loop count of 8
movwf TEMP
btfss DATApin ;check if it's a start bit
btfsc INTpin ;check if the clock's still there
goto END_OF_INT ;it must have been a glitch or PC
; holding off comms
wforhighbit btfss INTpin
goto wforhighbit
wforlowbit btfsc INTpin
goto wforlowbit
bit1 btfsc DATApin
bsf STATUS, C
rrf inbyte, F
decfsz TEMP, F
goto wforhighbit

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 104

movlw 2 ;setup loop count of 8
movwf TEMP
; now for the parity and stop bits - just dump
wforhighparstp btfss INTpin
goto wforhighparstp
wforlowparstp btfsc INTpin
goto wforlowparstp
decfsz TEMP, F
goto wforhighparstp


MOVF QueueheadFSR, W ;move queuehead out of FSR temporarily
MOVWF TEMP
MOVF Queuetail, W ;set FSR to queuetail
MOVWF FSR
MOVF inbyte, W ;set W to inbyte
MOVWF INDF ;and put it in the queue
movf TEMP, W
movwf QueueheadFSR

INCF Queuetail, W ;get the end of the queue
SUBLW Qmax ;check if at queuemax
INCF Queuetail,W ;(reload value to w - doesn't affect C)
BTFSS STATUS, C ;if so (negative result)
MOVLW Qmin ;set to queuemin
MOVWF Queuetail
SUBWF QueueheadFSR, W ;see if head and tail have met
BTFSC STATUS, Z ;if so (Z set)
CALL IncQhead ;dump oldest byte
;GOTO END_OF_INT ;clear int flag

;the interrupt is not INT, so clear all interrupts and end

INT_ERROR
END_OF_INT
movlw b'00010000'
movwf INTCON
swapf STATUS_TEMP, W
movwf STATUS
swapf W_TEMP, F
swapf W_TEMP, W
retfie ; end of interrupt
;
;****************************************************************************
;INT SETUP will start up the pb0 interrupt

SETUP_INT
movlw b'10010000'
movwf INTCON
bsf STATUS, RP0 ;page 1

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 105
bcf OPTION_REG, INTEDG
bcf STATUS, RP0 ;page 0
return


LM032LHI.ASM

;
; This program interfaces to a standard 2 line by 20 character display
; module. The program assembles for 4-bit data interface. LCD_DATA is the port
; which supplies the data and LCD_CTRL the control lines ( E, RS, R_W ) to the
; display.
; This program only handles the data though the high nibble.
;
; FOR DISPLAYS OTHER THAN 20x2
; Change the following line to match the display line length (Must be an
; even number);

#define LCDLINELEN 20

;****************************************************************************
;* This file and the resulting compiled code copyright1993-96 Steve Lawther *
;* Use of any of this code requires Steve Lawther to have a credit *
;* within the source code. Commercial use of any of this code *
;* requires the permission of the author, Steve Lawther *
;* For more details read 'README.TXT' or email 100255.157@compuserve.com *
;****************************************************************************
include <lm032l.h>
; include "wait.mac"
;
LCD_DATA EQU PORTB
LCD_DATA_TRIS EQU TRISB
LCD_CTRL EQU PORTB
; LCD Display Commands and Control Signal names.
;
#define LCD_E LCD_CTRL,1 ; LCD Enable control line
#define LCD_R_W LCD_CTRL,2 ; LCD Read/Write control line
#define LCD_RS LCD_CTRL,3 ; LCD Register Select control line
;
;
page
;
; Initilize the LCD Display Module
;****************************************************************************
;*
;* DISPLAY RESET
;*
;****************************************************************************

DISPLAY_RESET
;needs to have full routine to initialize corrupted display

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 106
;first setup lcd port - all outputs
;CAN ONLY AFFECT DATA NIBBLE OF PORT! but as now port a, only other line


BSF STATUS, RP0 ; Bank 1
movlw b'00000001'
movwf LCD_DATA_TRIS ;set all except PB0 to output
BCF STATUS, RP0 ; Bank 0
CLRF LCD_DATA ;set all port low
;clrf LCDflags ;set to cmd next etc
;have to wait 15ms here
clrwdt
Wait 15 Millisec, 0
clrwdt
;clear LCD port to all low here!!!!!!!!!!!!!!!
MOVLW b'00110000' ; Command for 8-bit interface high nibble
MOVWF LCD_DATA ; ie 0011xxxx
BSF LCD_E
nop ;incase the clk is >8MHz
;nop ;incase the clk is >16MHz
BCF LCD_E
;have to wait 4.1ms here
Wait 4100 Microsec, 0
BSF LCD_E ;nibble is already setup
nop ;incase the clk is >8MHz
;nop ;incase the clk is >16MHz
BCF LCD_E
;have to wait 100us here
Wait 100 Microsec, 0
BSF LCD_E ;nibble is already setup
nop ;incase the clk is >8MHz
;nop ;incase the clk is >16MHz
BCF LCD_E
;have to wait 100us here
Wait 100 Microsec, 0
MOVLW b'00100000' ; Command for 4-bit interface high nibble
MOVWF LCD_DATA ; ie 0010xxxx
BSF LCD_E
nop ;incase the clk is >8MHz
;nop ;incase the clk is >16MHz
BCF LCD_E
clrwdt
;from here interface is 4 bit and busy can be checked
; 001DL NF**
MOVLW FUNC_SET ;has to be 0010 10XX
CALL SEND_CMD_W
;0000 1DCB
MOVLW DISP_OFF ;0000 1000
CALL SEND_CMD_W

;****************************

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 107
;* *
;* INITIALIZE DISPLAY *
;* *
;****************************
INIT_DISPLAY
MOVLW DISP_ON_C ; Display On, Cursor On
CALL SEND_CMD_W

MOVLW CLR_DISP ; Clear the Display
CALL SEND_CMD_W
;0000 01IS - left shifting display
MOVLW ENTRY_INC ;0000 0110
CALL SEND_CMD_W
;1AAA AAAA
MOVLW b'10001111' ;CURS_RGT
CALL SEND_CMD_W

;movlw '<'
;call SEND_CHAR_W
;movlw 'H'
;call SEND_CHAR_W
;movlw 'i'
;call SEND_CHAR_W
;movlw 'y'
;call SEND_CHAR_W
;movlw 'a'
;call SEND_CHAR_W
movlw (LCDLINELEN - 2)
movwf LCDDDADDR
return

page
;
;
;*******************************************************************
;* The LCD Module Subroutines *
;*******************************************************************
;
;*******************************************************************
;*SendChar - Sends character to LCD *
;*This routine splits the character into the upper and lower *
;*nibbles and sends them to the LCD, upper nibble first. *
;*******************************************************************
;
SEND_CHAR_W
MOVWF CHARBUF ;Character to be sent is in W so put in
;local CHARBUF
SEND_CHAR
CALL BUSY_CHECK ;Wait for LCD to be ready
movf CHARBUF, W
ANDLW 0x0F0 ;Get upper nibble into upper half port

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 108
MOVWF LCD_DATA ;Send data to LCD
;BCF LCD_R_W ;Set LCD to read
BSF LCD_RS ;Set LCD to data mode
call LCDtglclk ;saving space - sod readability thou
;BSF LCD_E ;toggle E for LCD
;nop ;incase the clk is >8MHz
;;nop ;incase the clk is >16MHz
;BCF LCD_E
swapf CHARBUF, w
ANDLW 0x0F0 ;Get lower nibble into upper half port
MOVWF LCD_DATA ;Send data to LCD
BSF LCD_RS ;Set LCD to data mode
LCDtglclk BSF LCD_E ;toggle E for LCD
nop ;incase the clk is >8MHz
;nop ;incase the clk is >16MHz
BCF LCD_E
RETURN

;*******************************************************************
;* SEND_CMD - Sends command to LCD *
;* This routine splits the command into the upper and lower *
;* nibbles and sends them to the LCD, upper nibble first. *
;*******************************************************************

SEND_CMD_W
MOVWF CHARBUF ; Character to be sent is in W so put in
;local CHARBUF
SEND_CMD
CALL BUSY_CHECK ; Wait for LCD to be ready
movf CHARBUF, W
ANDLW 0x0F0 ; Get upper nibble into lower half port
MOVWF LCD_DATA ; Send data to LCD
;BCF LCD_R_W ; Set LCD to read
;BCF LCD_RS ; Set LCD to command mode
call LCDtglclk ;saving space - sod readability thou
;BSF LCD_E ; toggle E for LCD
;nop ;incase the clk is >8MHz
;;nop ;incase the clk is >16MHz
;BCF LCD_E
swapf CHARBUF,w
ANDLW 0x0F0 ; Get lower nibble into lower half port
MOVWF LCD_DATA ; Send data to LCD
goto LCDtglclk ;saving space - sod readability thou
;BSF LCD_E ; toggle E for LCD
;nop ;incase the clk is >8MHz
;;nop ;incase the clk is >16MHz
;BCF LCD_E
;RETURN

;*******************************************************************
;* This routine checks the busy flag, returns when not busy *

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 109
;*******************************************************************
;
BUSY_CHECK
BSF STATUS, RP0 ; Select Register page 1
MOVLW 0x0F1 ; Set high nibble + keep INT for input
MOVWF LCD_DATA_TRIS
BCF STATUS, RP0 ; Select Register page 0
BCF LCD_RS ; Set LCD for Command mode
BSF LCD_R_W ; Setup to read busy flag
BSF LCD_E ; Set E high
nop ;incase the clk is >8MHz
;nop ;incase the clk is >16MHz
movf LCD_DATA, W ; Read upper nibble busy flag, DDRam address
BCF LCD_E ; Set E low
;ANDLW 0x0F0 ; Mask out lower nibble ***chng 1/10/96
andlw 0x80
;MOVWF TEMP
nop
BSF LCD_E ; Toggle E to get lower nibble
nop
nop ;incase the clk is >8MHz
;nop ;incase the clk is >16MHz
;swapF LCD_DATA, W ; Read lower nibble DDRam address
BCF LCD_E
;ANDLW 0x0F ; Mask out upper nibble
;IORWF TEMP, F ; Combine nibbles
xorlw 0x80
btfsc STATUS, Z
;BTFSC TEMP, 7 ; Check busy flag, high = busy
GOTO BUSY_CHECK ; If busy, check again
BCF LCD_R_W
BSF STATUS, RP0 ; Select Register page 1
movlw b'00000001'
movwf LCD_DATA_TRIS ; Set for output
BCF STATUS, RP0 ; Select Register page 0
RETURN

#include "delay.asm"

CONVERTK.ASM

;****************************************************************************
; *
; CONVERT data from keyboard code to LCD data *
; *
;****************************************************************************
;* This file and the resulting compiled code copyright1993-96 Steve Lawther *
;* Use of any of this code requires Steve Lawther to have a credit *
;* within the source code. Commercial use of any of this code *
;* requires the permission of the author, Steve Lawther *
;* For more details read 'README.TXT' or email 100255.157@compuserve.com *

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 110
;****************************************************************************

;***************************************************************************
;
; GETQCHAR - gets a char from the queue, puts it into CHAR and OUTBYTE
;

GETQCHAR movf INDF, W ;put the byte to send into char
movwf CHAR
movwf outbyte

IncQhead INCF QueueheadFSR, W ;set to next byte
SUBLW Qmax ;check if at queuemax
INCF QueueheadFSR, W ;(reload value to w - doesn't affect C)
BTFSS STATUS, C ;if so (negative result)
MOVLW Qmin ;set to queuemin
MOVWF QueueheadFSR ;and store
return

;********************************************************************
;* LCDBYTE - Sends 2 digit hex and char to LCD *
;* This routine splits the character into the upper and lower *
;* hex nibbles, and sends them to the LCD, together with the char *
;* or description *
;********************************************************************

;need to first send DD address to display
;Note that once a byte has been sent to the LCD, time is not a major factor
;as any subequent bytes sent have to wait til LCD not busy (>40us)


LCDBYTE
movlw 0x02
addwf LCDDDADDR, W ;move DD address
movwf LCDDDADDR ;store the address
;andlw b'00111111'
addlw -0x028 ;this is the same as subtract 28
btfss STATUS, C ;if result +ve, correct address now
; in W
movf LCDDDADDR, W ;else reload address
movwf LCDDDADDR ;store the address again incase of
; addresss wrap-around
addlw b'10000000' ;set cmd to addr
call SEND_CMD_W
;LCD cursor now in correct position, now send space
movlw ENTRY_INC_S ;switch on shifting
call SEND_CMD_W
;movlw ' '
;call SEND_CHAR_W
;now calculate the upper and lower hex digits
swapf outbyte, W

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 111
andlw b'00001111'
addlw -10 ;is it A to F hex
btfsc STATUS, C
addlw 0x07 ;gap of seven between 9 and A
addlw 58 ;set to correct ascii including
; the 10 took off before
call SEND_CHAR_W
movf outbyte, W
andlw b'00001111'
addlw -10 ;is it A to F hex
btfsc STATUS, C
addlw 0x27 ;gap of seven between 9 and a (lower case)
addlw 58 ;set to correct ascii including
; the 10 took off before
call SEND_CHAR_W
;movlw ','
;call SEND_CHAR_W
; OK top line done, now to setup for bottom line
movf LCDDDADDR, W
addlw b'11000000' ;set cmd to addr
call SEND_CMD_W
movlw ENTRY_INC ;switch off shifting
call SEND_CMD_W
movf tempone, W ;send the chars to the display
call SEND_CHAR_W
movf temptwo, W
call SEND_CHAR_W
movf tempthree, W
call SEND_CHAR_W
;movlw ','
;call SEND_CHAR_W
return

;***************************************************************************
;
; DO_LOOKUP interpretes the char, putting 3 characters into temps 1,2,3
;


DO_LOOKUP movlw ' ' ;fill first char with spaces
movwf tempone ;don't use wait routine until
movwf tempthree
;chars gone to the display
movf CHAR, W
sublw 0x84
btfss STATUS,C
goto codebyte

movf CHAR, W
call LO_TABLE
iorlw b'00000000' ;just to get a zero flag on w = 0

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 112
btfsc STATUS, Z
return
movwf temptwo ;assume it is an ASCII chr
;movwf tempthree
andlw b'11110000' ; check if it is 8X or 9Xh
xorlw b'10010000' ; check 9Xh first
btfss STATUS, Z
goto NOTKPNUM
;this routine converts KEYPAD NUMBERS
movlw 'K'
movwf tempone
;movlw 'P'
;movwf temptwo
movlw b'01100000' ;9Xh - 6Xh =3Xh = ASCII char
subwf temptwo, F
return
NOTKPNUM xorlw b'00010000' ; then 8Xh
btfss STATUS, Z
goto NOTFKEY
movlw 'F'
movwf tempone
movf temptwo, W
addlw -0x08A
btfss STATUS, C ;skip if number is less than 8A
goto Flessthan10
addlw d'48'
movwf temptwo
;movlw '1'
;movwf temptwo
return

Flessthan10 addlw d'58' ;***changed 3/10/96
movwf temptwo
NOTFKEY ;movlw ' '
;movwf tempthree
return

codebyte movlw 0xAA
subwf CHAR, W
btfsc STATUS, Z
goto SC_AA

movlw 0xE0
subwf CHAR, W
call HI_TABLE
return

;***************************************************************************
;
; The HI scancode convertion table
;

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 113
;org 0x200

HI_TABLE addwf PCL, F

goto SC_E0 ;E0h
goto SC_E1 ;E1h
goto SC_UNDEF ;E2h
goto SC_UNDEF ;E3h
goto SC_UNDEF ;E4h
goto SC_UNDEF ;E5h
goto SC_UNDEF ;E6h
goto SC_UNDEF ;E7h
goto SC_UNDEF ;E8h
goto SC_UNDEF ;E9h
goto SC_UNDEF ;EAh
goto SC_UNDEF ;EBh
goto SC_UNDEF ;ECh
goto SC_ED ;EDh
goto SC_EE ;EEh
goto SC_UNDEF ;EFh
goto SC_F0 ;F0h
goto SC_UNDEF ;F1h
goto SC_F2 ;F2h
goto SC_F3 ;F3h
goto SC_F4 ;F4h
goto SC_F5 ;F5h
goto SC_F6 ;F6h
goto SC_F7 ;F7h
goto SC_F8 ;F8h
goto SC_F9 ;F9h
goto SC_FA ;FAh
goto SC_FB ;FBh
goto SC_FC ;FCh
goto SC_FD ;FDh
HI_TABLE_END goto SC_FE ;FEh
;goto SC_FF ;FFh

if (high (HI_TABLE) != high (HI_TABLE_END) )
messg "ERROR - hi-table flows overpage"
endif
SC_FF movlw 'r'
movwf tempone
movlw 's'
movwf temptwo
movlw 't'
goto SC_finish



;***************************************************************************
;

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 114
; The LO scancode convertion table
;
; The PIC is ideal for these convertions as no pre-processing is required if
; you can survive a table 256 locations big. All scancodes requiring
; extra processing have a GOTO in the table instead of a RETLW
;
CBLOCK 0x81
SC_keyF1, SC_keyF2
SC_keyF3, SC_keyF4
SC_keyF5, SC_keyF6
SC_keyF7, SC_keyF8
SC_keyF9, SC_keyF10
SC_keyF11, SC_keyF12 ; 81h - 8Ch
ENDC
CBLOCK 0x90
SC_KP_0, SC_KP_1
SC_KP_2, SC_KP_3
SC_KP_4, SC_KP_5
SC_KP_6, SC_KP_7
SC_KP_8, SC_KP_9 ; 90h - 99h
ENDC


LO_TABLE addwf PCL, F

goto SC_KB_OV ;00h keyboard overflow
RETLW SC_keyF9 ;01h
goto SC_UNDEF ;02h
RETLW SC_keyF5 ;03h
RETLW SC_keyF3 ;04h
RETLW SC_keyF1 ;05h
RETLW SC_keyF2 ;06h
RETLW SC_keyF12 ;07h (set 3 cmd is F12)
goto SC_ESC ;08h (set 3 cmd)
RETLW SC_keyF10 ;09h
RETLW SC_keyF8 ;0Ah
RETLW SC_keyF6 ;0Bh
RETLW SC_keyF4 ;0Ch
goto SC_TAB ;0Dh
RETLW '`' ;0Eh
RETLW SC_keyF2 ;0Fh (set 3 cmd)

goto SC_UNDEF ;10h
goto SC_LALT ;11h left alt key(set 3 cmd is Lcntrl)
goto SC_LSHIFT ;12h left shift key
retlw '\\' ;13h (set 3 cmd)
goto SC_LCNTRL ;14h left cntrl key(set 3 cmd is capslk)
RETLW 'Q' ;15h
RETLW '1' ;16h
RETLW SC_keyF3 ;17h (set 3 cmd)
goto SC_UNDEF ;18h

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 115
goto SC_LALT ;19h (set 3 cmd)
dt "ZSAW2" ;1Ah - 1Eh
RETLW SC_keyF4 ;1Fh (set 3 cmd)

goto SC_UNDEF ;20h
dt "CXDE43" ;21h - 26h
RETLW SC_keyF5 ;27h (set 3 cmd)
retlw 'F' ;28h
RETLW ' ' ;29h
RETLW 'V' ;2Ah
retlw 'F' ;2Bh
;goto SC_UNDEF ;2Bh
dt "TR5" ;2Ch - 2Eh
RETLW SC_keyF6 ;2Fh (set 3 cmd)

goto SC_UNDEF ;30h
dt "NBHGY6" ;31h - 36h
RETLW SC_keyF7 ;37h (set 3 cmd)
retlw 'J' ;38h
goto SC_RALT ;39h (set 3 cmd)
RETLW 'M' ;3Ah
retlw 'J' ;3Bh
;goto SC_UNDEF ;3Bh
dt "U78" ;3Ch - 3Eh
RETLW SC_keyF8 ;3Fh (set 3 cmd)

goto SC_UNDEF ;40h
dt ",KIO09" ;41h - 46h
RETLW SC_keyF9 ;47h (set 3 cmd)
goto SC_UNDEF ;48h
dt "./L" ;49h - 4Ah
dt ";P-" ;4Ch - 4Eh
RETLW SC_keyF10 ;4Fh (set 3 cmd)

goto SC_UNDEF ;50h
goto SC_UNDEF ;51h
retlw '\'' ;52h
RETLW '\\' ;53h (102key kbs only, set 3 cmd)
dt "[=" ;54h,55h
RETLW SC_keyF11 ;56h (set 3 cmd)
goto SC_PRTSCN ;57h (set 3 cmd)
goto SC_CAPSLK ;58h caps lock(set 3 cmd is Rcntrl)
goto SC_RSHIFT ;59h right shift key
goto SC_ENTER ;5Ah enter key
retlw ']' ;5Bh
RETLW '\\' ;5Ch (101 key kbs only, set 3 cmd)
retlw '#' ;5Dh check correct (101 key kbs = / only)
RETLW SC_keyF12 ;5Eh (set 3 cmd)
goto SC_SCROLL ;5Fh (set 3 cmd)

goto SC_DOWN ;60h (set 3 cmd)

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 116
retlw '\\' ;61h ;goto SC_LEFT (set 3 cmd)
goto SC_PAUSE ;62h (set 3 cmd)
goto SC_UP ;63h (set 3 cmd)
goto SC_DELETE ;64h (set 3 cmd)
goto SC_END ;65h (set 3 cmd)
goto SC_BKSPC ;66h backspace key
goto SC_INSERT ;67h (set 3 cmd)
goto SC_UNDEF ;68h
RETLW SC_KP_1 ;69h keypad 1/end
goto SC_RIGHT ;6Ah (set 3 cmd)
RETLW SC_KP_4 ;6Bh keypad 4/left
RETLW SC_KP_7 ;6Ch keypad 7/home
goto SC_PGDOWN ;6Dh (set 3 cmd)
goto SC_HOME ;6Eh (set 3 cmd)
goto SC_PGUP ;6Fh (set 3 cmd)

RETLW SC_KP_0 ;70h keypad 0/ins
goto SC_KP_PNT ;71h keypad ./del
RETLW SC_KP_2 ;72h keypad 2/down
RETLW SC_KP_5 ;73h keypad 5
RETLW SC_KP_6 ;74h keypad 6/right
RETLW SC_KP_8 ;75h keypad 8/up
goto SC_ESC ;76h escape key (set 3 cmd is NUMLK)
goto SC_NUMLK ;77h numlock key (set 3 cmd is keypad /)
RETLW SC_keyF11 ;78h
goto SC_KP_PLUS ;79h keypad + (set 3 cmd is keypad enter)
RETLW SC_KP_3 ;7Ah keypad 3/pgdn
goto SC_KP_MINUS ;7Bh keypad -
goto SC_KP_MULT ;7Ch keypad * (set 3 cmd is keypad +)
RETLW SC_KP_9 ;7Dh keypad 9/pgup
goto SC_SCROLL ;7Eh scroll lock (set 3 cmd is keypad *)
goto SC_UNDEF ;7Fh

goto SC_UNDEF ;80h
goto SC_UNDEF ;81h
goto SC_UNDEF ;82h
LO_TABLE_END RETLW SC_keyF7 ;83h
;goto SC_KP_MINUS ;84h KEYPAD + (set 3 cmd)

if (high (LO_TABLE) != high (LO_TABLE_END) )
messg "ERROR - lo-table flows overpage"
endif
if (high (HI_TABLE) != high (LO_TABLE_END) )
messg "ERROR - 2 tables in different page"
endif
SC_KP_MINUS movlw '-'
goto SCKPSIGN
SC_KP_PLUS movlw '+'
goto SCKPSIGN
SC_KP_PNT movlw '.'
goto SCKPSIGN

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 117
SC_KP_MULT movlw '*'
SCKPSIGN movwf temptwo
movlw 'K'
movwf tempone
;movlw 'P'
;movwf temptwo
retlw 0


SC_E1 movlw 'P'
movwf tempone
movlw 'U'
goto SC_S


SC_ED movlw 'i'
movwf tempone
movlw 'n'
goto SC_3lowd


SC_EE movlw 'e'
movwf tempone
movlw 'c'
movwf temptwo
movlw 'h'
goto SC_finish


SC_F0 movlw 0x5E
movwf temptwo
retlw 0
goto SC_ALLSAME

SC_F2 movlw 's'
movwf tempone
movlw 'I'
goto SC_3D


SC_F3 movlw 't'
movwf tempone
movlw 'r'
SC_3lowd movwf temptwo
movlw 'd'
goto SC_finish


SC_F4 movlw 'e'
movwf tempone
movlw 'n'

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 118
goto SC_3lowb

SC_F5 movlw 'd'
movwf tempone
movlw 'd'
movwf temptwo
movlw 's'
goto SC_finish


SC_F6 movlw 'd'
movwf tempone
movlw 'e'
movwf temptwo
movlw 'f'
goto SC_finish


SC_F7 movlw 't'
movwf tempone
movlw 'y'
movwf temptwo
movlw 'p'
goto SC_finish

SC_F8 movlw 'a'
goto SC_2lowmb

SC_F9 movlw 'a'
goto SC_2lowmk

SC_FA ;FAh ;can also be from the PC - tmb
movlw 'A'
movwf tempone
movlw 'C'
goto SC_3K

SC_FB movlw 'k'
movwf tempone
movlw 't'
movwf temptwo
movlw 'y'
goto SC_finish


SC_FC movlw 'k'
SC_2lowmb movwf tempone
movlw 'm'
SC_3lowb movwf temptwo
movlw 'b'
goto SC_finish

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 119


SC_FD movlw 'k'
SC_2lowmk movwf tempone
movlw 'm'
SC_3lowk movwf temptwo
movlw 'k'
goto SC_finish


SC_FE movlw 'r'
movwf tempone
movlw 's'
goto SC_3lowd

SC_UNDEF movlw '?'
SC_ALLSAME movwf tempone
movwf temptwo
goto SC_finish


SC_ESC movlw 'E'
movwf tempone
movlw 'S'
movwf temptwo
movlw 'C'
goto SC_finish


SC_CAPSLK movlw 'C'
goto SC_LOCK

SC_NUMLK movlw 'N'
goto SC_LOCK

SC_SCROLL movlw 'S'
SC_LOCK movwf tempone
movlw 'L'
goto SC_3K


SC_PGUP movlw 'U'
goto SC_PAGE

SC_PGDOWN movlw 'D'
SC_PAGE movwf tempthree
movlw 'P'
movwf tempone
movlw 'G'
movwf temptwo
retlw 0

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 120

SC_RIGHT movlw 'R'
movwf tempone
movlw 'G'
goto SC_T

SC_LEFT movlw 'L'
movwf tempone
movlw 'F'
SC_T movwf temptwo
movlw 'T'
SC_finish movwf tempthree
retlw 0

SC_INSERT movlw 'I'
movwf tempone
movlw 'N'
SC_S movwf temptwo
movlw 'S'
goto SC_finish

SC_END movlw 'E'
movwf tempone
movlw 'N'
SC_3D movwf temptwo
movlw 'D'
goto SC_finish


SC_DELETE movlw 'D'
movwf tempone
movlw 'E'
goto SC_3L


SC_PRTSCN movlw 'P'
movwf tempone
movlw 'S'
goto SC_3N


SC_ENTER movlw 'E'
movwf tempone
movlw 'N'
goto SC_T

SC_HOME movlw 'H'
movwf tempone
movlw 'M'
goto SC_3E


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 121

SC_BKSPC movlw 'B'
movwf tempone
movlw 'K'
goto SC_S

SC_UP movlw 'U'
movwf temptwo
SC_3P movlw 'P'
goto SC_finish

SC_DOWN movlw 'D'
movwf tempone
movlw 'W'
SC_3N movwf temptwo
movlw 'N'
goto SC_finish


SC_PAUSE movlw 'P'
movwf tempone
movlw 'S'
SC_3E movwf temptwo
movlw 'E'
goto SC_finish


SC_LALT movlw 'L'
goto SC_ALT

SC_RALT movlw 'R'
SC_ALT movwf tempone
movlw 'A'
SC_3L movwf temptwo
movlw 'L'
goto SC_finish


SC_LSHIFT movlw 'L'
goto SC_SHIFT

SC_RSHIFT movlw 'R'
SC_SHIFT movwf tempone
movlw 'S'
movwf temptwo
movlw 'H'
goto SC_finish


SC_LCNTRL movlw 'L'
goto SC_CNTRL

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 122

SC_RCNTRL movlw 'R'
SC_CNTRL movwf tempone
movlw 'C'
goto SC_3N


SC_TAB movlw 'T'
movwf tempone
movlw 'A'
movwf temptwo
movlw 'B'
goto SC_finish


SC_KB_OV movlw '*'
movwf tempone
movlw 'O'
movwf temptwo
movlw 'V'
goto SC_finish


SC_AA movlw 'O'
SC_3K movwf tempone
movlw 'K'
goto SC_3BLANK

SC_E0 movlw 'E'
movwf tempone
movlw 'X'
SC_3BLANK movwf temptwo
movlw ' '
goto SC_finish

DELAY.ASM

;**********************************
;* The Delay routines *
;* *
;* used by Wait <time> *
;**********************************


ifdef INCLONGDELAY


longdelay movwf tempone
ldloop1 clrf temptwo
ldloop2 decfsz temptwo, F
goto ldloop2

Circuitos Integrados Programables
Juan Antonio Barrios Huzar 123
decfsz tempone, F
goto ldloop1
return

endif

ifdef INCSHORTDELAY

shortdelay movwf tempone
sdloop decfsz tempone, F
goto sdloop
return

endif


LM0321.h

nolist
;******************************************************************************
;
; This is the custom Header File for LM032L LCD
; PROGRAM: LM032l.H
; Revision: 9-10-95
;
;******************************************************************************
;TEMP EQU 0x035 ; Temporary register
;CHAR EQU 0x036 ; Temporary register, Holds value to
send to LCD module.
;
;
; LCD Module commands
;
;CLR_DISP - clears all display, and cursor home to addr 0
CLR_DISP EQU 0x001 ; Clear the Display

;RTN_HOME - cursor home and display unshifted, DDRAM unchanged
RTN_HOME EQU 0X002

;ENTRY_... - sets entry mode, S = display shift on, INC / DEC cursor move dir
ENTRY_DEC EQU 0x004 ;
ENTRY_DEC_S EQU 0x005 ;
ENTRY_INC EQU 0x006 ;
ENTRY_INC_S EQU 0x007 ;

;DISP_... - Display on / off control, C = cursor ON, B = chr pos blink
DISP_OFF EQU 0x008 ; Display off
DISP_ON EQU 0x00C ; Display on
DISP_ON_C EQU 0x00E ; Display on, Cursor on
DISP_ON_BC EQU 0x00F ; Display on, Cursor on, Blink cursor


Circuitos Integrados Programables
Juan Antonio Barrios Huzar 124
;SHIFT_... - Cursor & Display shift, S = Display, C = cursor, L = Left, R = Right
SHIFT_C_L EQU 0x010
SHIFT_C_R EQU 0x014
SHIFT_S_L EQU 0x018
SHIFT_S_R EQU 0x01C

;FUNC_... - Function set, ( 4 bit, 2 lines, 5 x 7 dots)
FUNC_SET EQU 0x028

;
CURS_RGT EQU 0x093
DD_RAM_ADDR EQU 0x080 ; Least Significant 7-bit are for
address
DD_RAM_UL EQU 0x080 ; Upper Left coner of the Display
;

list

You might also like