Está en la página 1de 51

APUNTES DE

PROGRAMACION PIC
16F877A CON PICBASIC
BASICO I

2009
Trujillo-Perú
Ing. Rene E. Gonzales Vásquez
Contenido
FAMILIA DE MICROCONTROLADORES PIC .............................................................................2
RECONOCIMIENTO DE PUERTOS DEL MICROCONTROLADOR ...............................................7
RESUMEN DE DECLARACIONES BÁSICAS DEL PBP ................................................................16
IDENTIFICADORES .................................................................................................................18
ETIQUETAS DE LINEA (LABELS) ..............................................................................................18
VARIABLES.................................................................................................................................18
ARRAYS (ARREGLOS) ................................................................................................................18
CONSTANTES ............................................................................................................................19
CONSTANTES NUMÉRICAS ......................................................................................................19
SARTA DE CONSTANTES: .........................................................................................................19
PINS: .........................................................................................................................................20
COMENTARIOS .........................................................................................................................20
DECLARACIONES MÚLTIPLES ................................................................................................21
INCLUDE ...................................................................................................................................21
DEFINE .....................................................................................................................................21
OPERADORES MATEMÁTICOS ..................................................................................................22
Operadores de comparación ..................................................................................................23
Operadores lógicos ...............................................................................................................23
ESTRUCTURAS DE CONTROL ...................................................................................................24
FOR – NEXT ..........................................................................................................................24
IF - THEN ..............................................................................................................................25
WHILE - WEND ........................................................................................................................26
SELECT – CASE.....................................................................................................................27
UNTIL - REPEAT .................................................................................................................29
ANTES DE EMPEZAR..................................................................................................................29
REQUERIMIENTO MINIMOS ...................................................................................................30
...................................................................................................................................................30
INTRODUCCIÓN A LOS PERIFERICOS ..............................................................................31
INDICADORES ......................................................................................................................31
LEDS.......................................................................................................................................31
EJEMPLO CON MATRIZ 5X7 ................................................................................................43
EJEMPLO CON LCD ...................................................................................................................47

Ing. Rene E. Gonzales Vasquez


PRESENTACION
Los apuntes realizados están hechos para autoaprendizaje, un recordatorio para cuando se
necesite implementar y no comenzar desde cero nuevamente, también para que sirva a quienes
quieran tener una base referente al microcontrolador PIC 16f877A, y programación en Pic
Basic Pro ( PBP ), aca no se describe el programa PBP ni los métodos de grabar el
microcontrolador, ni la simulación, se espera contar con el tiempo para profundizar este
tema.
Sin embargo, todos los ejemplos están hechos en PBP y está probado su funcionamiento

Se describe los puertos y pines del microcontrolador, así mismo algunos ejemplos en PBP
con las puertas de E/S digitales usando Led, Display, Matrices, LCD.

Así mismo se pueden reemplazar Led, Display, Matrices por Transistores, Opto acopladores,
Relay y otros que solo requieran un nivel alto o bajo, igual activar sistemas de potencia
con Triac, SCR, Mosfet.

Ing. Rene E. Gonzales Vasquez


FAMILIA DE MICROCONTROLADORES PIC

Ing. Rene E. Gonzales Vasquez


Ing. Rene E. Gonzales Vasquez
DECLARACION DE PINES DEL MICROCONTROLADOR 16F877A

PIC 16F877A

Ing. Rene E. Gonzales Vasquez


Ing. Rene E. Gonzales Vasquez
RECONOCIMIENTO DE PUERTOS DEL MICROCONTROLADOR

Ing. Rene E. Gonzales Vasquez


PUERTAS DE E/S

Los microcontroladores PIC 16F877A vienen encapsulados con 40 patas,


disponen de 5 puertas (A,B,C,D,E).

PUERTA A

Solo dispone de 6 líneas (RA0-RA5), son bidireccionales y se configuran a


través del registro TRISA, situado en el Banco 1.
En cada bit del registro TRISA de la Puerta se configura la correspondiente
línea.
Si el bit es 0, la línea está configurada como salida, a su vez, si se pone a 1,
la línea se configura como entrada.

El registro PORTA, es de la Puerta A, que recoge el estado de cada línea de la


Puerta, independientemente de cómo estén configuradas.

Las líneas R0/AN0, R1/AN1 y R2/AN2, además de líneas de E/S digitales,


también pueden actuar como los canales 0, 1 y 2 por los que se puede aplicar
una señal analógica al conversor A/D.

La pata RA3/AN3/Vref+, también puede actuar como entrada de Tensión de


Referencia para los periféricos que la precisan. La pata RA4/TOCKI actúa
además de E/S digital, como entrada de señal de reloj para el Timer 0.

La pata RA5/AN5/SS# tiene multiplexadas tres funciones: E/S digital, canal


4 para el conversor A/D y selección del modo esclavo cuando se trabaja con la
comunicación serie síncrona.

Para seleccionar si las líneas de la Puerta A van a trabajar como E/S


digitales o como canales de entrada para el conversor A/D, hay que escribir
el valor adecuado sobre el registro ADCON1. Si se carga en dicho registro
el valor 011x en sus 4 bits de menos peso, todas las líneas de puertas
funcionan como E/S digitales.
ADCON1 = 7

DIREC- VALOR VALOR EN


CION NOMBRE BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 EN POR EL RESTO
BOR DE RESETS

05h PORTA - - RA5 RA4 RA3 RA2 RA1 RA0 -0x 000 -0u 000
85h TRISA - - Registro de configuración de la Puerta A -11 1111 -11 1111
9Fh ADCON1 ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0 -0- 0000 -0- 0000

x significa desconocido
u significa que no cambia

significa que no está implementado y se lee como 0


Ing. Rene E. Gonzales Vasquez
PUERTA B

Dispone de 8 líneas bidireccionales cuya función se elige mediante la


programación del TRISB. (SALIDAS =0, ENTRADAS=1)

Todas las patas de la puerta B disponen de una resistencia interna de pull-


up al positivo de la alimentación. Esta va conectada cuando el bit RBPU# (es
bit 7 del registro OPTION), tiene valor 0.
TRISB=0
OPTION_REG.7=0

La resistencia de pull-up se conecta automáticamente siempre que la línea


esté configurada como salida.
Cuando se produce un Reset por conexión de la alimentación se desconectan
todas las resistencias de pull-up. (POR – Power on Reset)

Las líneas RB <7-4> pueden programarse para generar una interrupción


cuando una de ellas cambia de estado. Se deben configurar como entradas y el
valor que se introduce por ellas se compara con el anterior para si no
coinciden generar una interrupción, siempre que lo autorice el bit de
permiso situado en el registro INTCON.

La pata RB0/INT también puede programarse como petición de interrupción


externa, el bit de permiso también está ubicado en el INTCON.

Ing. Rene E. Gonzales Vasquez


DIREC- VALOR EN VALOR EN EL
CION NOMBRE BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 POR RESTO
BOR DE RESETS
06h PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu
86h TRISB Registro de configuración de la Puerta B 1111 1111 1111 1111
81h OPTION RBPU# INTEDG TOCS TOSE PSA PS2 PS1 PS0 1111 1111 1111 1111

x significa desconocido
u significa que no cambia
significa que no está implementado y se lee como 0

PUERTA C
Consta de 8 líneas bidireccionales cuyo sentido se configura mediante el
registro TRISC. Todas las patas de esta puerta tienen multiplexadas
diferentes funciones:

RC0/T1OSO/T1CKI : Esta línea puede actuar como E/S digital,


como salida del Timer 1
o como entrada de impulsos para el Timer 1.

RC1/T1OSI/CCP2 : E/S digital,


entrada al oscilador del Timer 1,
entrada del modulo de Captura 2,
Salida del comparador 2,
salida del PWM2.

RC2/CCP1 : E/S digital,


entrada Captura 1,
Salida de comparador uno,
salida del PWM1.

RC3/SCK/SCL : E/S digital,


Señal de reloj modo SPI,
Señal de reloj modo I2C.

RC4/SDI/SDA : E/S digital,


Señal de datos modo SPI,
Señal de datos modo I2C.

RC5/SDO : E/S digital,


Salida de datos en modo SPI.

RC6/TX/CK : E/S digital,


Línea de transmisión en USART,
Señal de reloj síncrona en transmisión serie.

RC7/RX/DT : E/S digital,


Línea de recepción USART,
Línea de datos en transmisión serie síncrona.

Ing. Rene E. Gonzales Vasquez


PUERTA D

Consta de 8 líneas bidireccionales. Solo la tienen los PIC encapsulados con


40 patas (16F877A). Se configura mediante el registro TRISD.
Todas las patas disponen en su entrada de un Trigger Schmitt.

Además de usarse como líneas de E/S digitales normales, implementan una


puerta paralela esclava de 8 líneas (PSP), que sirve para permitir la
comunicación en paralelo con otros elementos del sistema.

Las patas se denominan RD0/PSP0-RD7/PSP7, y para que funcionen como puerto


de comunicación esclava en paralelo, es preciso poner el bit PSP MODE=1.

PUERTA E

Solo la tienen los PIC de 40 pines. Dispone de tres pines multifunción, que
se configuran como entrada o salida, según el valor de los tres bits de menos
peso del registro TRISE

RE0/RD#/AN5 : E/S digital,


Señal de lectura en modo puerta paralela esclava,
Canal 5 de conversor A/D.

RE1/WR#/AN6 : E/S digital,


Señal de escritura en modo PSP,
Canal 6 de conversor A/D.

RE2/CS#/AN7 : E/S digital,


Selección de chip en modo PSP,
Canal 7 de conversor A/D.

Ing. Rene E. Gonzales Vasquez


INTRODUCCION A LA PROGRAMACION
Al plantearse un problema se debe hallar una solución y para lograrlo se
debe utilizar algunas estrategias; principalmente debemos identificar y
definir el problema, definir estrategias para resolverlas, dar una
solución y depurar hasta lograr una solución correcta.

Para solucionar problemas con el Microcontrolador tendremos que usar un


CICLO DE PROGRAMACIÓN, el cual nos permita resolver de forma clara y
ordenada los procesos y acciones que pretendamos implementar.

El ciclo de programación cuenta con diversos pasos que debemos ejecutarlos


de forma correcta pues dependerá de ella la solución correcta buscada,
evitando demoras en la depuración, lo primero será realizar un algoritmo
que consiste en documentar una serie de pasos detallados, inicialmente
vamos a trabajar con dos tipos de algoritmos, el seudocódigo y el diagrama de
flujo, estos dos pasos son fundamentales en el ciclo de programación,
siguiendo con la codificación en un lenguaje de programación en nuestro
caso el PICBASIC, al terminar tendremos que depurar y afinar nuestro
código hasta obtener los resultados esperados, luego para terminar sigue
la documentación que es, entender el funcionamiento del programa por
cualquiera.

El algoritmo en seudocódigo es una secuencia de pasos representados


textualmente y entendible de forma racional. Paso a paso detalla las
instrucciones desde el inicio al final de un proceso

Ejemplo 2.1:
Por el portb.0 de un microcontrolador está conectado un led que deseamos que
encienda y apague 5 veces cada vez que se presione un pulsador conectado al
porta.0
Esquema:

Ing. Rene E. Gonzales Vasquez


Seudocódigo:
Paso 1 Inicializar variables
Paso2 Leer porta.0 si es presionado el switch SW1
Paso 3 Si presiono saltar paso 4 si no presiono saltar paso 2
Paso 4 Saltar a subrutina “encender y apagar” paso 5
Paso 5 Inicializar contador
Paso 6 corriendo rutina
Encender led por el portb.0
Pausar 10 segundos
Apagar led
Pausar 10 segundos
Paso 7 Incrementar contador
Procesar si contador es igual a 5
Proceso contador es menor de 5 saltar paso 6 de lo
Contrario saltar paso 2

El algoritmo con diagramas de flujo, es un método técnico practico


representado gráficamente que representa ideas, información simple con
orden lógico que necesita el programador para la codificación, los
diagramas de flujo van a permitir identificar de forma sencilla todos los
pasos del proceso, realizar mejoras y modificaciones así mismo acelera la
codificación.

Se usa los símbolos estándares ISO 5807, se recomienda dibujar de arriba


hacia bajo de izquierda a derecha, todas las líneas de flujo deben llegar a un
símbolo, una línea de flujo será representada por flechas, una línea de flujo
no debe cruzarse con otra salvo que sea arqueada, procurar cierta simetría,
cada acción debe utilizar el mínimo de palabras, inicializar variables o
permitir que el usuario asigne valores mediante consulta.

Símbolos estandares ISO 5807

INICIO / FIN

PROCESO (paso que debe ser cumplido)

ENTRADA (cualquier medio)

DECISIÓN (el proceso puede tomar


diferentes direcciones
de acuerdo a una condición verdadera o falsa)

Ing. Rene E. Gonzales Vasquez


LINEA DE FLUJO (muestra la dirección del
flujo entre símbolos)

SUBRUTINA (sub proceso indica un proceso o


Rutina definida)

CONECTOR (para mostrar una conexión entre


puntos de un mismo diagrama o diferente
diagrama de flujo

SALIDA (mensajes o resultados)

El diagrama de flujo del ejemplo 2.1 podría quedar de esta forma siguiendo de
forma clara el seudocódigo

inicio Prender apagar

Inicializa
contador
Inicializar C=1
variables

Portb.0 =1
Encender
led
Leer
switch

Pausar 10
segundos
N
Porta.0=1
Portb.0 =
Y 0
Apagar
Subrutina led
prender
apagar
Pausar 10
segundos

Incementar
contador c =
c+1

N
Contador = 5

Regres ar A

Ing. Rene E. Gonzales Vasquez


Programando en Codigo PBP

inicialización variables
C VAR BYTE
SW1 VAR PORTA.0
LED VAR PORTB.0
TRISA = 1
TRISB = 0
LED = 0
BUCLE: IF SW1 = 0 THEN BUCLE
GOSUB PRENDEYAPAGA
GOTO BUCLE

PRENDEYAPAGA: FOR C=1 TO 5


HIGH LED
PAUSE 10000
LOW LED
PAUSE 10000
NEXT
RETURN

Ing. Rene E. Gonzales Vasquez


RESUMEN DE DECLARACIONES BÁSICAS DEL PBP
@ Inserta una línea en código ensamblador
ASM – ENDASM Inserta una sección en código ensamblador
BRANCH Equivalente a un GOTO
BRANCHL Es un BRANCH largo
BUTTON Anti rebote y anti repetición convierte en
entrada un pin
CALL Llama una subrutina de ensamblador
CLEAR Hace cero todas las variables
COUNT Cuenta el número de pulsos en un pin
DATA Define el contenido inicial en un chip EEPROM

DEBUG Señal asincrónica de salida en un pin fijo y


baud
DISABLE Deshabilita el procedimiento de ON
INTERRUPT
DTMFOUT Produce tonos en un pin
EEPROM Define el contenido inicial en un chip EEPROM

ENABLE Habilita el procedimiento de ON INTERRUPT

END Detiene la ejecución e ingresa en modo de baja


potencia
FREQUOT Produce hasta dos frecuencias en un pin
GOSUB Llama a una subrutina BASIC en la etiqueta
especificada
GOTO Continua la ejecución en la etiqueta
especificada
HIGH Hace alto la salida de un pin
HSERIN Entrada serial asíncrona (hardware)
HSEROUT Salida serial asíncrona (hardware)
I2CREAD Lee byte de dispositivo I2C
I2CWRITE Graba byte en dispositivo I2C
INPUT Convierte un pin en entrada

Ing. Rene E. Gonzales Vasquez


LET Asigna el resultado de una expresión a una
variable
LCDOUT Muestra caracteres en LCD
LOOKDOWN Busca un valor en una tabla de constantes
LOOKDOWN2 Busca un valor en una tabla de constantes o
variables
LOOKUP Obtiene un valor constante de una tabla
LOOKUP2 Obtiene un valor constante o variable de una
tabla
LOW Hace bajo la salida de un pin
NAP Apaga el procesador por un corto periodo de
tiempo
ON INTERUPT Ejecuta una subrutina BASIC en una
interrupción
OUTPUT Convierte un pin en salida
PAUSE Demora (resolución 1ms)
PAUSEUS Demora (resolución 1 us)
PEEK Lee un byte del registro
POKE Graba un byte en el registro
POT Lee el potenciómetro en el pin especifico
PULSIN Mide el ancho del pulso en un pin
PULSOUT Genera pulso hacia un pin
PWM Salida modulada en ancho de pulso a un pin
RANDOM Genera número pseudo aleaorio
RCTIME Mide el ancho de un pulso en un pin
READ Lee byte de un chip EEPROM
RESUME Continua la ejecución después de un
interrupción
RETURN Continua en la declaración que sigue al
último GOSUB
REVERSE Invierte el estado de un pin
SERIN Entrada serial asíncrona (tipo BS1)
SERIN2 Entrada serial asíncrona (tipo BS2)
SEROUT salida serial asíncrona (tipo BS1)
SEROUT2 salida serial asíncrona (tipo BS1)
SHIFTIN Entrada serial sincrona
SHIFTOUT Salida serial síncrona
SLEEP Apaga el procesador por un periodo de tiempo
SOUND Genera un tono o ruido blanco en un pin
STOP Detiene la ejecución del programa
SWAP Intercambia los valores de dos variables
TOGGLE Hace salida a un pin y cambia su estado
WRITE Graba byte a un chip EEPROM
XIN Entrada X-10
XOUT Salida X-10

Ing. Rene E. Gonzales Vasquez


IDENTIFICADORES
Un identificador es simplemente un nombre. Usado como ETIQUETAS DE LÍNEA
y nombre de variable, no deben comenzar con un dígito, no distinguen las
letras mayúsculas de las minúsculas.

ETIQUETAS DE LINEA (LABELS)


Referencias para los comandos con comandos GOTO ó GOSUB,
Cualquier línea puede comenzar con una etiqueta de línea que es
simplemente un identificador seguido por dos puntos (:)

Etiqueta:
Serout 0, N2400, [“Hola, Mundo!”, 13, 10]
Goto Etiqueta

VARIABLES
Son creadas usando la palabra VAR. Pueden ser bits , bytes ó word.
El espacio para cada variable es automáticamente almacenado en la memoria
del microcontrolador.

Etiqueta VAR tipo

Tipoñbit, byte ó word.


Ejemplos de creación de variables son:

Barco var byte


Motor var bit
Valvula1 var word

El número de variables disponibles depende de la cantidad de RAM en un


dispositivo en particular y el tipo de las variables y los arrays .
Tomar en cuenta que PBP reserva aproximadamente 24 posiciones RAM para su
propio uso.

ARRAYS (ARREGLOS)
Los arreglos de variables pueden ser creados en una manera similar a las
variables.
Etiqueta VAR tipo (número de elementos)

persona var byte[10]


objeto var bit [8]

La primera ubicación dentro del arreglo es el elemento cero. En el arreglo

Ing. Rene E. Gonzales Vasquez


objeto anterior los elementos están numerados objeto (0) a objeto (7)
conteniendo 8 elementos en total.
Tener en cuenta que los Arreglos tienen posición de memoria y esta es
limitada límitada por el tamaño de memoria del microcontrolador.

Tamaño Numero de máximo de elementos


BIT 128
BYTE 64
WORD 32

CONSTANTES
Las llamadas constantes pueden ser creadas de manera similar a las variables.
Etiqueta CON expresión constante

SO con 3
FI con l0

CONSTANTES NUMÉRICAS
PBP permite definir constantes numéricas en tres bases: decimal, binario y
hexadecimal.

100 valor decimal


%100 ´ valor binario para el decimal 4.
$100 ´ valor hexadecimal para el decimal 256.

La constante ASCII debe ser puesta entre comillas y contener sólo un


carácter (de lo contrario, ellas son una sarta de constantes).

“A” ‘ ASCII valor para el decimal 65


“d” ‘ ASCII valor para el decimal 100

SARTA DE CONSTANTES:
Una sarta contiene uno o más caracteres y es delimitado entre comillas.

HOLA” ‘ String (forma abreviada de “H”, “O”, “L”, “A”)

Las sartas son usualmente tratadas como una lista de valores de caracter
individual.

Ing. Rene E. Gonzales Vasquez


PINS:
Para especificar un pin, es simplemente usar sus nombres PORT y un número
de bit:
PORTB.1= 1 ‘ Coloca PORTB, bit 1 a 1

Para recordar fácilmente y ser usado un pin, renombrar usando el comando


VAR, luego el nombre puede ser reutilizado en cualquier operación:

Led var PORTA.O ‘Renombra PORTA.O como led


High led ‘Coloca led (PORTA: O) en valor alto

referidos por un número, 0-15. Estos números hacen referencia a los pins
que distribuidos sobre diferentes puertos del hardware del
microcontrolador dependiendo del número de pins tiene el microcontrolador

Led var PORTB.3

Cuando arranca un microcontrolador, todos los pins son colocados como


entrada. Para usar un pin como salida, el pin o port debe ser colocado como
salida.
Para colocar un pin o port como salida ó entrada debe dar valores al registro
TRIS . donde 0, hace su pin una salida , y colocandolo en 1 lo hace una entrada
Por ejemplo :

TRISA = %00000000 ´ Coloca todos los pins PORTA como salidas.


TRISA = 0

TRISB = % 11111111 ´ Coloca todos los pins PORTB como entradas.


TRISB = 1

TRISC = % 10101010 los pins pares como salidas y los impares como
entradas.

Cada bit individual puede ser manejado de la misma manera

TRISA.0 = 0 PORTA, pin 0 como salida. El resto de pines


permanecen sin cambio.

COMENTARIOS
Comienza con la palabra clave REM o el apóstrofe (´). los caracteres de esa
línea se ignoran.

Ing. Rene E. Gonzales Vasquez


DECLARACIONES MÚLTIPLES
PBP soporta el uso de (:) para separar comandos ubicados en la misma línea. Los

W2 = W0
W0 = W1
W1 = W2

Es lo mismo que:

W2 = w0 : W0 = W1 : W1 = W2

En los dos casos, el tamaño del código generado es el mismo.

INCLUDE
Se puede agregar archivos fuente BASIC a un programa PBP usando INCLUDE.
Solo en programas que se necesite definir el modo serial u tra.
El código fuente del archivo incluido son insertadas dentro del programa
donde se coloca el INCLUDE.

INCLUDE “modedefs.bas”

DEFINE
Algunos elementos, como el oscilador y las ubicaciones de los pin LCD, son
predefinidas en PBP.
Sin embargo, DEFINE permite a un programador cambiar estas definiciones
si lo desea.
Define puede ser usado para cambiar el valor predefinido del oscilador, los
pins de DEBUG, el baud rate y las ubicaciones del pin LCD además de otras
definiciones, deberá estar en mayúsculas.

DEFINE BUTTON_PAUSE 50 ´ demora en el anti-rebote del botón en ms


DEFINE CHAR_PACING 1000 ´ paso de la salida serial en us
DEFINE DEBUG_REG _PORTL ´ depuracion del pin port
DEFINE DEBUG_BIT 0 ´ depuracion del pin bit
DEFINE DEBUG_BAUD 2400 ´ depuracion del baud rate
DEFINE DEBUG_MODE 1 ´ modo depuracion: 0=CIERTO,1=INVERTIDO
DEFINE DEBUG_PACING 1000 ´ paso de depuracion en us
DEFINE HSER_RCSTA 90 h ´ setear registro receive
DEFINE HSER_TXSTA 20 h ´ setear registro transmit
DEFINE HSER_BAUD 2400 ´ setear baud rate
DEFINE HSER_EVEN 1 ´ usar solo si se desea paridad par
DEFINE HSER_ODD 1 ´ usar solo si se desea paridad impar
DEFINE I2C_INTERNAL 1 ´ usar para EEPROM interno en 16CEXX y
12CEXX

Ing. Rene E. Gonzales Vasquez


DEFINE I2C_SLOW 1 ´ usar para OSC > 8Mhzcon Dispositivos de
velocidad standard
DEFINE LCD_DREG PORTB ´ port de data LCD
DEFINE LCD_DBIT 0 ´ datos LCD comenzando en bit 0 o 4
DEFINE LCD_RSREG PORTB ´ port de selección de registro LCD
DEFINE LCD_RSBIT 4 ´ bit de selección de registro LCD
DEFINE LCD_EREG PORTB ´ port de habilitacion LCD
DEFINE LCD_EBIT 5 ´ bit de habilitacion LCD
DEFINE LCD_BITS 4 ´ tamaño 4 u 8 de bus de LCD
DEFINE LCD_LINES 2 ´ numero de lineas en LCD
DEFINE OSC 4 ´ 4 8 10 12 16 20
DEFINE OSCCAL_1K 1 ´ setea OSCCAL para PIC12C671
DEFINE OSCCAL_2K 1 ´ setea OSCCAL para PIC12C672

OPERADORES MATEMÁTICOS
Operaciones matemáticas en orden jerárquico.
Significa multiplicación y división son efectuados antes que suma y resta,
por ejemplo. Para asegurarse que las operaciones son efectuadas en el orden
que se desea , use paréntesis para agrupar las operaciones.

A=(B+C)*(D-E)

Todas las operaciones matemáticas se realizan sin signo y con una precisión
de 16 bit.

Operador matemático Descripción


+ Suma
- Resta
* Multiplicación
** 16 bits superiores de la
multiplicacion
*/ 16 nits medios de la
multiplicacion
/ División
// Resto (módulo)
<< Desplazamiento izquierdo
>> Desplazamiento derecho
ABS Valor absoluto
COS Coseno
DCD 2m decodificador
DIG Digito
MAX Maximo *
MIN Minimo *
NCD Codificar
REv Invertir bits
SIN Seno
SQR Raiz cuadrada
& Bit inteligente AND

Ing. Rene E. Gonzales Vasquez


÷ Bit inteligente OR
^ Bit inteligente EXCLUSIVE
OR
~ Bit inteligente NOT
&/ Bit inteligente NOT AND
÷/ Bit inteligente NOT OR
^/ Bit inteligente NOT
EXCLUSIVE OR

Operadores de comparación
Se usan en declaraciones IF ... THEN para comparar una expresión con otra
.Los operadores soportados son :

Operador Descripción
= o == Igual
<> o != No igual
< Menor
> Mayor
<= Menor o igual
>= Mayor o igual

If i > 10 then loop

Operadores lógicos
Entregan un resultado CIERTO / FALSO de su operación. Valores 0 son
tratados como falso. Cualquier otro valor es cierto. Se usan junto a
operadores de comparación en una declaración IF ... THEN.

Operador Descripción
AND o && AND lógico
OR o I I OR lógico
XOR o ^ ^ OR exclusivo lógico
NOT AND NAND lógico
NOT OR NOR lógico
NOT XOR NXOR lógico

If (A == rojo) AND ( B > numero) then high led1


Indicar el orden en que quiere que se realicen las operaciones usando
paréntesis

Ing. Rene E. Gonzales Vasquez


ESTRUCTURAS DE CONTROL

FOR – NEXT
Permite ejecutar repeticiones de declaraciones un número de veces, usando
una variable como contador.

FOR i = 1 To 10
Serout 0, N2400, [#i, “ ”]
NEXT i
Serout 0, N2400, [10]

El bucle For – Next cuenta de 1 a 10 y va enviando el valor de la variable i


serialmente

DESDE EL INICIO
HASTA EL FIN

ACCION 1

ACCION 2

FIN

El bucle For – Next cuenta regresivamente de 20 a 10 decreciendo de 2 en 2 y


va enviando el valor de la variable b2 serial mente

FOR b2=20 To 10 STEP -2


Serout 0, N2400, [#b2, “ “]
NEXT b2
Serout 0, N2400, [10]

El bucle For – Next cuenta de 2 en 2 desde 1 a 10 y va enviando el valor de la


variable C5 serial mente

FOR C5=1 To 10 STEP 2


Serout 0, N2400, [#C5, “ “]
NEXT C5
Serout 0, N2400, [10]

Ing. Rene E. Gonzales Vasquez


Ejemplo

Include "modedefs.bas" ' Include modo serial


SO con 0 ' Define pin de salida serial
B0 var byte
B1 var byte
Rutina : For B0 = 3 To 1 Step -1 ' conteo desendente
For B1 = 0 To 10 Step B0 ' conteo a 10
Serout SO, N2400, [#B1," "] ' envia serialmente B1
Next B1 ' repite ciclo
Serout SO,N2400,[13,10] ' fin de envio cuando
Pause 100 ' Delay
Next B0 ' repite la rutina
Goto Rutina

IF - THEN
Efectúa comparaciones, es esencialmente un Goto si la condición es cierta,
el programa ira hacia la etiqueta que sigue al THEN; Si la condición es falsa
el programa va a continuar hacia la próxima línea después del IF – NEXT.
Otra declaración no puede ser puesta después del THEN si no que debe ser una
etiqueta

IF B0 = 10 THEN Visor
PORTB.0=0

IF PORTB.0 = 0 THEN Avanzar


PORTA.1 = 1

Para dos decisiones uno verdadero y otro falso

N
CONDICION

CASO VERDADERO CASO FALSO

Ing. Rene E. Gonzales Vasquez


IF B0=20 THEN
Led=1
Else
Led=0
ENDIF

Para IF doble o doble condicional es cuando queremos que dos valores juntos
se cumplan
IF B0=10 THEN
IF B1=10 THEN
LCDOUT $FE, 1, “ALERTA”
ENDIF
ENDIF

Similar con AND las dos opciones deben cumplirse

IF (B0=10) AND (B1=10) THEN Loop

IF (B0=10) AND (B1=10) THEN


LCDOUT $FE, 1, “ALERTA”
ENDIF

Similar con OR cuando solo una opción debe cumplirse

IF (B0=10) OR (B1=20) THEN Alarma


IF (B0=10) OR (B1=10) THEN
LCDOUT $FE, 1, “ALERTA”
ENDIF

WHILE - WEND
Para ejecutar repeticiones tantas veces sean necesarias siempre y cuando
se evalué una condición y esta sea cierta, cuando deja de ser cierta
continuara con la declaración siguiente a WEND

INSTRUCCIONES

Y CONDICION
CRITERIO
VERDADERO

Ing. Rene E. Gonzales Vasquez


I=10
WHILE I < 10
Serout 0, N2400, [#I, 13, 10]
WEND

A diferencia de FOR este se utiliza cuando no conocemos el número de


iteraciones que necesitamos realizar

SELECT – CASE

Sirve para asignar y clasificar en función de una única variable, pero con
varios posibles resultados

variable

CASE 1 CASE 2 CASE 3 CASE 4

FIN

Led VAR Portb.0


X=0
Inicio:
SELECT CASE X
CASE 1
High led
CASE 2
High led
Pause 50
Low led
Pause 50
CASE 3
Low led
CASE ELSE
GOTO inicio
END SELECT

Ing. Rene E. Gonzales Vasquez


Ejemplo envio de datos serialmente fuente pbp

DEFINE DEBUG_REG PORTC


DEFINE DEBUG_BIT 6
DEFINE DEBUG_BAUD 9600
DEFINE DEBUG_MODE 1
B10 VAR BYTE ' usado para el contador
Loop1:
Pause 250
B10 = B10 + 1 ' Incremento en +1
Select Case B10 ' empieza Case a seleccionar - usa B10
Case 1 ' ejecuta if B10 = 1
Debug "loop1 case 1",10,13 ' envia cadena y nueva linea
Case 2 ' Ejecuta if B10 = 2
Debug "loop1 case 2",10,13
Case 3 ' ejecuta if B10 =4
Debug "loop1 case 4",10,13
Case is >4 ' Ejecuta if B10 > 5
Clear ' Setea B10 a 0
Debug 10,13 ' envia nueva linea
End Select ' se ejecuto
GoTo loop ' Continue con Bucle
End

Ing. Rene E. Gonzales Vasquez


UNTIL - REPEAT

Permiti que se ejecute un grupo de instrucciones hasta que se cumpla una


condición específica. La expresión condicional se coloca después de UNTIL

i=0
REPEAT
PORTB.0[i] = 0
i=i+1
UNTIL i > 7

ANTES DE EMPEZAR
HARDWARE
Primero, asegurar que el pin MCLR está conectado a 5 voltios protegido con
una resistencia de 10 k, es posible que falle si no se pone dicha resistencia

Segundo, asegurar la fuente de alimentación sea bien rectificada y filtrada

Tercero, instalar cristal en buen estado y capacitores con los valores


adecuados (1 Mhz -– 10 Mhz)

Cuarto, asegurarse que inicie digitalmente el Pic, para que su


funcionamiento sea el apropiado, agregar la línea ADCON1 = 7, así apagara
los comparadores.

Quinto, recordar que el pin 4 del PORTA es colector abierto, tiene un


comportamiento inusual cuando se configura como salida, sobre todo cuando
se le coloque en 1, agregar un resistor pull up de 5k o 10k a 5 voltios

Sexto, acordarse que el Pic se coloca como entrada cuando arranca, asegúrese
de configurar adecuadamente el PIC al inicio del programa

Séptimo, no olvidar si utiliza el puerto B como salida tener presente


activar las resistencias pull up con OPTION_REG.7 = 0

SOFTWARE
Una vez visto algunas propiedades del microcontrolador PIC 16f877a, y lo básico en
programación podemos iniciar a programar.

Primero, recordar que en un ciclo de programación se inicia de forma


ordenada con las DIRECTIVAS, DECLARACIONES, DEFINICIONES, SENTENCIAS
Y FUNCIONES, con el fin de entender y que otros entiendan el programa, lo
mismo que ayuda los comentarios.

Segundo, no olvidarse que el microcontrolador PIC 16f877a, cuenta con


fusibles que debemos activar o desactivar según la característica del
programa, insertando la línea con arroba @ seguido por los fusibles
@ DEVICE HS, NOWDT, NOPUT, NOLVP, NOPROTECT, BROWNOUT

Ing. Rene E. Gonzales Vasquez


Tercero, debemos definir la frecuencia del oscilador insertando la línea,
DEFINE OSC 4, o el oscilador que cuenten.

ADVERTENCIA
En estos apuntes no se va considerar colocar los fusibles por ser ejemplos
básicos y demostrativos.
La fuente de alimentación es de 5v dc y debe colocarse el positivo VDD en los
pines 11 y 32, negativo VSS pines 12 y 31, así mismo se puede colocar energía
en un solo pin de ambos (VDD, VSS)

REQUERIMIENTO MINIMOS

Ing. Rene E. Gonzales Vasquez


INTRODUCCIÓN A LOS PERIFERICOS

INDICADORES
LEDS
Led “light emitting diode” diodo emisor de luz

El Led necesita una resistencia en serie como protección a altas corrientes,


pero la corriente y el voltaje varía según el tipo de led.
Para led indicador requiere una corriente de 5ma a 15ma, para los led de alta
intensidad requieren entre 15ma a 30ma.
Para el cálculo de la resistencia en serie usaremos:

R=(V-Vled) / I

Entonces para un led indicador color rojo de Vled = 1.2v, en el pin del pin de
salida es 5v idealmente pero con carga podría bajar a 4.8 v aproximadamente
y una corriente de 20ma, resultara

R=(5v-1.2) / 20ma
R= 180 ohmios

Ing. Rene E. Gonzales Vasquez


Así mismo existen led de dos colores y de tres colores llamados RGB

Ing. Rene E. Gonzales Vasquez


EJEMPLOS CON LED

1.- Se requiere que un led prenda y apague cada medio segundo (Titilea led ), en el pin 0 del
puerto b

LED VAR PORTB.0


TITILEA:
HIGH LED
PAUSE 500
LOW LED
PAUSE 500
GOTO TITILEA
END

2.- se requiere que por el puerto D simule las luces del auto fantástico (leds ida y vuelta)

X VAR BYTE
LEDS VAR PORTD
TRISD = 0
LEDS = 1

PROG:
FOR X = 1 TO 7
LEDS = LEDS << 1
PAUSE 50
PORTD = LEDS
NEXT

FOR X = 1 TO 7
LEDS = LEDS >> 1
PAUSE 50
PORTD = LEDS
NEXT
GOTO PROG
END

Ing. Rene E. Gonzales Vasquez


3.- se requiere implementar un contador binario de 1 por el puerto D del microcontrolador

CUENTA VAR BYTE


TRISD = 0
CUENTA = 0

REPETICION:
PORTD = CUENTA
PAUSE 250
CUENTA=CUENTA + 1
GOTO REPETICION
END

4.- Se requiere implementar un circuito con el microcontrolador para que cuando se


presione un pulsador se muestre en un led, la lectura sera en el puerto B, y la por el
puerto D la señalización con Leds.

Primero diseñamos el circuito:

Ing. Rene E. Gonzales Vasquez


Habilitamos el PORTB tenemos que configurar OPTION_REG

RBPU# INTEDG TOCS TOSE PSA PS2 PS1 PS0

La condición es poner a RBPU=0 entonces OPTION_REG = $7f , activándose las resistencias


pull up de lo contrario oscilaran todos los leds sin control.

Define LOADER_USED 1 ' Gestor de arranque


OPTION_REG = $7f ' Enable PORTB pull-ups
TRISD = 0 ' Seteamos PORTD (LEDs) todos como salida
rutina:
PORTB = 0 ' PORTB lectura de swichts
TRISB = $f0 ' Enable todos los swichts
PORTD = 0 ' todos los leds apagados

' detector si algun swichts es presionado y encender LED

If PORTB.7 = 0 Then ' si 4 to swichts es presionado


PORTD.3 = 1 ' 4 to LED on
Endif
If PORTB.6 = 0 Then ' si 3er swichts es presionado
PORTD.2 = 1 ' 3er LED on
Endif
If PORTB.5 = 0 Then ' si 2do swichts es presionado
PORTD.1 = 1 ' 2do LED on
Endif
If PORTB.4 = 0 Then ' si 1er swichts es presionado
PORTD.0 = 1 ' 1er LED on
Endif
Goto rutina ' repetir rutina
End
5.- Se requiere Controlar de izquierda a derecha el encendido de leds en el puerto D del
microcontrolador con un solo pulsador presionado constantemente en el puerto A

Ing. Rene E. Gonzales Vasquez


CORRIENDO VAR BYTE
ADCON1=7
TRISA = 1
TRISD = 0
INICIO:
CORRIENDO = 1
BUCLE:
PORTD = CORRIENDO
PAUSE 250
IF PORTA.0 = 0 THEN
IF CORRIENDO = 1 THEN CORRIENDO = 128
CORRIENDO = CORRIENDO >>1
GOTO BUCLE
ELSE
IF CORRIENDO = 128 THEN INICIO
CORRIENDO = CORRIENDO << 1
GOTO BUCLE
ENDIF
END

Ing. Rene E. Gonzales Vasquez


EJEMPLO CON DISPLAY
Es un conjunto de led encapsulados, son cátodo común o ánodo común normalmente son
utilizados con decodificadores de BCD como el de 7 segmentos que es el 74 LS 48 y el 74 LS 47.
Existe variedad de display

Ing. Rene E. Gonzales Vasquez


6.- Visualizar de 9 a 0 por el display de 7 segmentos, por el puerto B del microcontrolador

X VAR BYTE
NUM VAR BYTE
OPTION_REG=0
INICIO:
TRISB=%00000000
PORTB=%00000000

BUCLE:
FOR X=9 TO 0 STEP-1
GOSUB CONVERTIR
PORTB = NUM
PAUSE 100
NEXT
HIGH NUM
PAUSE 100
GOTO BUCLE
CONVERTIR:
LOOKUP X,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F], NUM
NUM= NUM ^ $FF
RETURN
END

Ing. Rene E. Gonzales Vasquez


7.- Usar Random para generar números aleatorios de (0 - 9) en el display conectado al
microcontrolador, switch y display usando el mismo puerto b.

VALOR VAR BYTE


ALEATORIO VAR WORD

TRISB= $80
BUCLE:
ALEATORIO = 0
GOSUB CONVERT
PORTB = VALOR
GENERADOR:
RANDOM ALEATORIO
IF PORTB.7 = 1 THEN GENERADOR
GOTO RANGO
RANGO:
ALEATORIO = ALEATORIO & 7
IF ALEATORIO <> 7 THEN OTRO
RANDOM ALEATORIO
GOTO RANGO
OTRO:
GOSUB CONVERT
PORTB = VALOR
PAUSE 100
GOTO GENERADOR

CONVERT:
LOOKUP DADO, [$3F,$06,$5B,$4F,$66,$7D,$07,$7F,$6F], VALOR
VALOR = VALOR ^ $FF
RETURN
END

Ing. Rene E. Gonzales Vasquez


8.- APROVECHANDO QUE EL DISPLAY ESTA CONECTADO EN EL PUERTO B DEL MICROCONTROLADOR
16F877, DISPLAYAR REPETITIVAMENTE USANDO IF THEN.

N VAR BYTE
VALOR VAR BYTE

PORTB=0
TRISB=0

REPETIR:
N=0
DISPLAYAR:
GOSUB CONVERTIR
PORTB=VALOR
N=N+1
PAUSE 500
IF N=10 THEN REPETIR
GOTO DISPLAYAR
CONVERTIR:
LOOKUP N, [ $3F, $06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F], VALOR

RETURN
END

9.- Programar PIC para que visualice por display de 9 a– 0 de forma repetitiva con FOR
NEXT (DECRECE)

N VAR BYTE
VALOR VAR BYTE
PORTB=0
TRISB=0

REPETIR:
FOR X=9 TO 0 STEP -1
GOSUB CONVERTIR
PORTB=N
PAUSE 500
NEXT
DISPLAYAR:
HIGH N
PAUSE 500
LOW N
PAUSE 500
GOTO REPETIR
CONVERTIR:
LOOKUP N, [ $3F, $06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F], VALOR
RETURN
END

Ing. Rene E. Gonzales Vasquez


EJEMPLO CON MODULO DE 4 DISPLAY DE SIETE
SEGMENTOS

10.- Programar microcontrolador para visualizar de 0 a 9 apoyado por el DECODER 74 47 y


cuatro display

En el circuito se observa cuatro display de 7 segmento conectados entre si entre sus


pines, y 4 salidas del 1,2,3,4 que son los pines de control, se usara el CI 74 LS 47
decodificador.

Ing. Rene E. Gonzales Vasquez


Para fines de entendimiento se extenderá el programa por lo que dividiremos el puerto b
en dos partes una para el dato enviado al 74 ls 47 de (0 a 15) y el otro para el control de
encendido de los diferentes display

‘ Declaracion de directivas y declaraciones


DEFINE LOADER_USED 1
ADCON1=7
trisb=0
portb= 0
OPTION_REG = 0

‘ Declaracion de variables
uni var byte
dece var byte
cente var byte
mili var byte
uni=0
dece=0
cente=0
mili= 0
goto ultimo

primero:
for uni=0 to 9 ' contar unidades
gosub unidades ' saltar e imprimir
if uni=9 then segundo ' si uni=9 salta a segundo
next uni ' otra unidad
unidades:
PORTB = 16 + uni ' imprime unidades
PAUSE 100
return ' retorna
segundo:
for dece=1 to 9
for uni=0 to 9
pause 100
gosub decenas ' salta e imprime decenas y unidades
next uni
if dece=9 then tercero
next dece
decenas:
PORTB = 16 + uni ' imprime unidades y decenas
pause 2
PORTB = 32 + dece
pause 2
return
tercero:
for cente = 1 to 9
for dece = 0 to 9
for uni = 0 to 9
pause 100
gosub centenas
next uni
next dece
if cente = 9 then ultimo
next cente
centenas:
PORTB = 16 + uni
PAUSE 3
PORTB = 32 + dece
PAUSE 3
portb = 64 + cente

Ing. Rene E. Gonzales Vasquez


pause 3
return
ultimo:
for mili = 1 to 9
for cente = 0 to 9
for dece = 0 to 9
for uni = 0 to 9
pause 40
gosub millares
next uni
next dece
next cente
if mili = 9 then primero
next mili
millares:
PORTB = 16 + uni
pause 1
PORTB = 32 + dece
pause 1
portb = 64 + cente
pause 1
portb= 128 + mili
pause 1
return
end

EJEMPLO CON MATRIZ 5X7

Ing. Rene E. Gonzales Vasquez


Control de matriz
Este circuito controla una matrix 5 x 7 simulado en la parte superior del display
iniciando de derecha a izquierda están conectados los pines del puerto A del
microcontrolador dejando libre el pin de Porta.4 y pasándolo defrente al porta.5, en la parte
inferior iniciamos de izquierda a derecha portb.0 al pin portb.6,
Como se aprecia en el programa desarrollado, las 5 columnas se envía una secuencia de unos
para que active las 7 lineas de arriba hacia abajo dándole el valor en binario formando una
letra o figura, cabe indicar que cada led se activara enviándole un cero por las líneas.
Las letras y figuras va depender de los valores que ingresen, aca les alcanzo una ayuda de
números y letras para que aceleren el control de esta matrix, asi mismo existe un chip max
7219 el que permite el control serial de dichas matrices .

Ing. Rene E. Gonzales Vasquez


1 1 0 0 1 0 0 1 0
1 0 1 1 0 0 0 0 0 1 0 0
1 0 1 1 0 0 0 0 1 0 0
1 0 1 1 0 0 0 0 1 0
1 0 0 0 0 0 0 1 0
1 0 1 1 0 0 0 1 0
1 0 1 1 0 0 0 1 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 0 0 0 1 1 0 0
1 0 0 1 1 0 0
1 0 0 1 0 0 0 1 0
1 0 0 0 1 0 0 1 0
1 0 0 1 0 0 1 0
1 0 0 1 0 0 1 0
1 0 0 0 1 0 0 1 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 0 0 1 0 0 0 1 0 0
1 0 1 1 0 0
1 0 1 0 0 0 1 0
1 0 1 0 0 1 0 0
1 0 1 0 0 1 0
1 0 0 1 0 0 1 0 0
1 0 0 1 0 0 1 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 0 0 1 1 0 0
1 0 0 1 0 0 1 0 0
1 0 0 1 0 0 1 0 0
1 0 0 1 0 0 1 0 0 0 0
1 0 0 1 0 0 1 0
1 0 0 1 0 0 1 0
1 0 0 1 0 0 1 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 0 0 0 0 1 0 0 1
1 0 1 0 0 1
1 0 1 0 0 1
1 0 0 0 0 1 0 0 1
1 0 1 0 0 0 1
1 0 1 0 1
1 0 0 0 0 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Ing. Rene E. Gonzales Vasquez


11.- Elaborar un programa que me permita el control de la matriz 5 x 7

DEFINE LOADER_USED 1
OPTION_REG = 0
ADCON1=7
TRISA=0
TRISB=0
X VAR BYTE

inicio:
FOR X = 1 TO 20
PORTA=%000001 : PORTB=%10000001 : PAUSE 2
PORTA=%000010 : PORTB=%11100110 : PAUSE 2
PORTA=%000100 : PORTB=%11100110 : PAUSE 2
PORTA=%001000 : PORTB=%10000001 : PAUSE 2
PORTA=%100000 : PORTB=%11111111 : PAUSE 2
NEXT X

FOR X = 1 TO 20
PORTA=%000001 : PORTB=%11001001 : PAUSE 2
PORTA=%000010 : PORTB=%10110110 : PAUSE 2
PORTA=%000100 : PORTB=%10110110 : PAUSE 2
PORTA=%001000 : PORTB=%10000000 : PAUSE 2
PORTA=%100000 : PORTB=%11111111 : PAUSE 2
NEXT X

FOR X = 1 TO 20
PORTA=%000001 : PORTB=%11011101 : PAUSE 2
PORTA=%000010 : PORTB=%10111110 : PAUSE 2
PORTA=%000100 : PORTB=%10111110 : PAUSE 2
PORTA=%001000 : PORTB=%11000001 : PAUSE 2
PORTA=%100000 : PORTB=%11111111 : PAUSE 2
NEXT X

FOR X = 1 TO 20
PORTA=%000001 : PORTB=%11100011 : PAUSE 2
PORTA=%000010 : PORTB=%11011101 : PAUSE 2
PORTA=%000100 : PORTB=%10111110 : PAUSE 2
PORTA=%001000 : PORTB=%10000000 : PAUSE 2
PORTA=%100000 : PORTB=%11111111 : PAUSE 2
NEXT X

FOR X = 1 TO 20
PORTA=%000001 :PORTB=%10110110 : PAUSE 2
PORTA=%000010 :PORTB=%10110110 : PAUSE 2
PORTA=%000100 :PORTB=%10110110 : PAUSE 2
PORTA=%001000 :PORTB=%10000000 : PAUSE 2
PORTA=%100000 :PORTB=%11111111 : PAUSE 2

NEXT
GOTO inicio
END

Ing. Rene E. Gonzales Vasquez


EJEMPLO CON LCD

Dispositivo electrónico de Cristal Líquido que nos permite mostrar información


alfanumérica, estos componentes están gobernados por un controlador e internamente
cuentan con un CGRAM (charácter generator RAM) y que puede almacenar hasta 8 caracteres
o figuras. Cada carácter normalmente consta de 5 columnas y 8 filas con un peso de 8 bytes
cada una haciendo un total de 64 byte que es la capacidad del CGRAM.

Existen en varios formatos de 14 pines, los de 16 pines con retro iluminados, así mismo 2x8,
2x16, 4x20 (filas por columnas). Estos módulos responden a un conjunto de instrucciones o
comandos de control que son enviadas por el microcontrolador

COMANDOS DE CONTROL
Con este ejemplo, vamos a utilizar el puerto D del PIC, configurando los pines de datos
(DREG), los pines de Habilitación (E) y selección de registro (RS)

DEFINE LCD_DREG PORTD ; indica que el bus sera en el puerto D


DEFINE LCD_BITS 4 ; sera de 4 bit
DEFINE LCD_DBIT 4 ;bit de inicio (D4, D5, D6, D7)

DEFINE LCD_RSREG PORTD ;RS se encuentra en PORTD


DEFINE LCD_RSBIT 2 ; RS se encuentra en Portd.2

DEFINE LCD_EREG PORTD ;E se encuentra en el PORTD


DEFINE LCD_EBIT 3 ;E se encuentra en el Portd.3

Ing. Rene E. Gonzales Vasquez


COMANDO OPERACION
$FE, 1 LIMPIA VISOR DEL LCD
$FE, 2 VUELVE AL INICIO
$FE, $0C APAGA CURSOR
$FE, $0F PARPADEO DEL CURSOR
$FE, $10 MUEVE EL CURSOR POSICION IZQUIERDA
$FE, $14 MUEVE CURSOR POSICION DERECHA
$FE, $80 CURSOR AL COMIENZO DE LA PRIMERA LINEA
$FE, $C0 CURSOR AL COMIENZO DE LA SEGUNDA LINEA
$FE, $94 CURSOR AL COMIENZO DE LA TERCERA LINEA
$FE, $D4 CURSOR AL COMIENZO DE LA CUARTA LINEA
$FE, $7 DESPLAZAMIENTO A LA IZQUIERDA

Para enviar número decimal


LCDOUT $FE, 1, DEC DATOS

Para enviar número con dos decimales


LCDOUT $FE, 1, DEC2 DATOS

Para enviar números hexadecimales y binarios (HEX y BIN)

También se puede combinar texto y numero ejemplo


LCDOUT $FE, 1, “X= “, DEC DATOS

También podemos usar # para números decimales


LCDOUT $FE,$C0, “DATO: “, #DATO

12*- VISUALIZAR EN LCD HOLA AMIGO PRIMERA LINEA, USAR PUERTO B PARA EL LCD

DEFINE LCD_DREG PORTB


DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

INICIO:
LCDOUT $FE, 1
LCDOUT $FE, 2
LCDOUT “HOLA AMIGO”
PAUSE 1000

GOTO INICIO

Ing. Rene E. Gonzales Vasquez


13.- VISUALIZAR EN LCD EN LA PRIMERA LINEA ( PRACTICANDO ) SEGUNDA LINEA ( CON EL LCD )
USAR PUERTO B PARA EL LCD

DEFINE LCD_DREG PORTB


DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

LCDOUT $FE, 1 “PRACTICANDO”


LCDOUT $FE, $C0, “CON EL LCD “
END

14.- VISUALIZAR (PRACTICANDO CON LCD), DESPLAZAMIENTO A LA IZQUIERA Y USAR EL PUERTO


B PARA EL LCD

DEFINE LCD_DREG PORTB


DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

X VAR BYTE
DATOS VAR BYTE
LCDOUT $FE, $7
LCDOUT $FE, 1

INICIO:
LCDOUT $FE,$80
FOR X=0 TO 25
LOOKUP X, [“PRACTICANDO CON LCD”], DATOS
LCDOUT, DATOS
PAUSE 200
NEXT
GOTO INICIO

Ing. Rene E. Gonzales Vasquez


15.- LECTURA DE LA CAIDA DE TENSION EN EL POTENCIOMETRO POR EL PUERTO A, UTILIZANDO
AN0, VISUALIZAR CON LCD POR EL PUERTO B, ESTE EJEMPLO ES UN ADELANTO DE APUNTES
BASICO II

DEFINE LCD_DREG PORTB


DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
'DEFINE LCD_BITS 4
'DEFINE LCD_LINES 2
OPTION_REG=0
DEFINE ADC_BIT 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50

RES VAR WORD


VOLTS1 VAR WORD
VOLTS2 VAR WORD

CONV1 CON 19
CONV2 CON 53
TRISA = 1
TRISB = 0
PAUSE 500
ADCON1 = 0
ADCON0 = %11000001
LCDOUT $FE, 1

INICIO:
ADCIN 0, RES
VOLTS1 = RES * CONV1
VOLTS2 = RES * CONV2
VOLTS2 = VOLTS2 / 100
VOLTS1 = VOLTS1 + VOLTS2
LCDOUT $FE, 1, "V=",DEC4 VOLTS1,"v"
LCDOUT $FE, $C0, "VOLTIMETRO"
PAUSE 100
GOTO INICIO
END

Ing. Rene E. Gonzales Vasquez

También podría gustarte