Professional Documents
Culture Documents
Introducción
Cuando deseamos hacer un contador simple de 0-9 podemos usar flip-flops o circuitos integrados
especiales para contadores, pero de cualquier manera tenemos que usar cierto número de
elementos los cuales pueden ir creciendo dependiendo de lo que vamos a usar. Pero cuando
usamos PICs todo se resuelve de manera más sencillo en el caso del Hardware los elementos son
minimos y por lo tanto el gasto es menor comparado si lo hicieramos con flip-flops y lo bueno es que
el PIC lo podemos reprogramar a nuestro antojo.
Descripción
En este pequeño proyecto utilizaremos un Display de 7 Segmentos para desplegar los números de 1
a 9 de manera que haremos un contador. Algo que tenemos que tener en cuenta es que
dependiendo si usamos un display anódo común o cátodo común el programa del PIC puede
cambiar. En este caso lo veremos con un display de cátodo común, lo que nos dice que para que
algún segmento encienda el pin tiene que recibir un 1 lógico. Por lo tanto para saber que es lo que
deseamos ver en el display necesitamos que el puerto B del PIC (RB0-RB7) tengan 1 lógicos ó 0
lógicos tal y como se ve en la siguiente tabla.
Funcionamiento
'INICIANDO
TRISB = 0 'el PORTB como salida
inicio:
contador = 0 'inicializamos el contador a 0
programa:
gosub NUMERO 'se ve el numero elegido en
PORTB
PORTB = muestra 'PORTB toma el valor de
muestra
contador = contador + 1 'se incrementa contador con 1
pause 1000 'espera 1 segundo
if contador = 10 then inicio 'compara, si llega al #9
reinicia a #0
goto programa
NUMERO:
lookup contador, [63,6,91,79,102,109,125,7,127,111], muestra
'asigna valor
return
inicio:
contador = 0 'inicializamos el contador a 0
programa:
gosub NUMERO 'se ve el numero elegido
en PORTB
.
.
.
.
NUMERO:
lookup contador, [63,6,91,79,102,109,125,7,127,111], muestra
'asigna valor
return
END 'fin del
programa
con gosub numero nos direcciona a una subrutina (llamada NUMERO)que contiene el comando
lookup; el cual puede ser usado para obtener valores de una tabla de constantes de 8 bits, en este
caso usaremos contador y si contador es igual a cero, muestra toma el valor de la primera
constante ( que seria 63 y así sucesivamente hasta que tome todas las constantes disponibles)
luego regresá y toma la siguiente linea,
luego el valor que tomó muestra es colocado en PORTB y será el valor que se visualizará en el
DISPLAY, luego contador tendrá el valor que tenia anteriormente más uno, habra una pausa de 1
segundo para que podamos ver el resultado en el display y si contador es igual a 10 reinicia el
programa de lo contrario repetira la secuencia.
En la siguiente tabla se muestra las constantes que se usarón en el comando LOOKUP, usamos
decimales, aunque tambien se pueden colocar hexadecimales.
DIAGRAMA explicado
DIAGRAMA
Primero con Los teclado, Te dire que hay varios modelos aqui te dejo las posibles soluciones con
algunos de estos:
Rutina KB_Port:
La siguiente librería configura las salidas y Configura los puertos B del PIC para ser
entradas para usar el teclado escanea las teclas usados con el teclado.
y si es pulsada alguna retorna el valor de tecla
en modo hexadecimal para ser mostrado KB_Scan:
directamente en un display LCD. Las variables y
subrutinas utilizadas son: Escanea todas las teclas y devuelve la tecla
pulsada en formato Hexadecimal.
Tecla
Código:
KB_Port ;Inicializa la puerta B para las entradas del
;teclado. Programa RB0-3 como salidas y RB4-7
;entradas con las resistencias de polarización
;habilitadas----------------------------------
BSF STATUS,RP0 ;Selecciona Pagina 1 (Banco)
MOVLW 0F0h ;PB4-7 como entradas
MOVWF TRISB ;y PB0-3 como salidas
BSF OPCION,RBPU ;Habilita R de polarización en
entradas
BCF STATUS,RP0 ;Vuelve a la pagina 0 (Banco)
RETURN ;Retorna.
Ahora para saber que tecla esta siendo pulsada necesitamos escanear el teclado, y esto se
consigue mediante la siguiente rutina que consiste en ir poniendo una a una las líneas RB0 a RB3
(conectadas a las filas del teclado) a nivel bajo ya que estas salidas tienen conectada la resistencia
de polarización a Vcc y por lo tanto están siempre a nivel lógico alto. Cada vez que una fila se
pone a nivel bajo se hacen 4 comprobaciones para ver si una de las cuatro columnas se a puesto a
nivel bajo y así saber la tecla pulsada.
Código:
KB_Scan ;Escanea el teclado
CLRF Tecla ;Borra Tecla y
INCF Tecla,f ;prepara Tecla para
primer código.
MOVLW 0Eh ;Saca 0 a la primera fila
MOVWF PORTB ;de la Puerta B
NOP ;Nada para
estabilización de señal.
Cheq_Col BTFSS PORTB,4 ;Primera columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada,
incrementa tecla.
BTFSS PORTB,5 ;Segunda columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada,
incrementa tecla.
BTFSS PORTB,6 ;Tercera columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada,
incrementa tecla.
BTFSS PORTB,7 ;Cuarta columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada,
incrementa Tecla.
Ultima_Tecla ;comprueba si se a
escaneado todo el teclado
La parte de código de Espera se puede ser eliminada sin ningún problema si no queremos que el
pic tenga que esperar a que soltemos la tecla para continuar con su ejecución normal.
Ideas y mejoras: Para disminuir el número de conexión a usar para detectar la tecla que se esta
pulsando, podemos modificar un teclado matricial tal y como se expone en la siguiente figura:
Solo usaremos las salidas correspondientes a las filas del teclado y de RB0 a RB4 serán
configurables como salida o entrada mientras que RB4 solo será entrada. Para saber la tecla que
se esta pulsando tendremos que configurar una línea como salida y ponerla a nivel alto y las
demás como entrada y comprobar el valor de las entradas para saber que columna se a pulsado.
Los diodos utilizados son del típico modelo 1N4148. hay que tener especial cuidado en no
programar mas de una puerta como salida ya que podría destruirse algún diodo debido a una
circulación excesiva de corriente en los mismos. Esto es debido a que el circuito no tiene
resistencias de limitación para protegerlos en estos casos, pero es totalmente viable el uso de
ellas, así que si queremos usar las puertas para controlar el teclado y también para alguna otra
cosa podemos poner unas resistencias de 2k2 en serie con las puertas RB0 a RB4.
lcd 2X16
Descripción: La pantalla de cristal liquido o LCD (Liquid Crystal Display) es un dispositivo
µControlado de visualización grafico para la presentación de caracteres, símbolos o incluso dibujos
(en algunos modelos), es este caso
dispone de 2 filas de 16 caracteres cada una y cada carácter dispone de una matriz de 5x7 puntos
(pixels), aunque los hay de otro número de filas y caracteres. Este dispositivo esta gobernado
internamente por un microcontrolador Hitachi 44780 y regula todos los parámetros de
presentación, este modelo es el mas comúnmente usado y esta información se basará en el
manejo de este u otro LCD compatible.
Caracteristicas principales:
-Pantalla de caracteres ASCII, además de los caracteres Kanji y Griegos.
-Desplazamiento de los caracteres hacia la izquierda o la derecha.
-Proporciona la dirección de la posición absoluta o relativa del caracter.
-Memoria de 40 caracteres por línea de pantalla.
-Movimiento del cursor y cambio de su aspecto.
-Permite que el usuario pueda programar 8 caracteres.
-Conexión a un procesador usando un interfaz de 4 u 8 bits
Funcionamiento: Para comunicarse con la pantalla LCD podemos hacerlo por medio de sus
patitas de entrada de dos maneras posibles, con bus de 4 bits o con bus de 8 bits, este ultimo es
el que explicare y la rutina también será para este. En la siguiente figura vemos las dos maneras
posibles de conexionar el LCD con un pic16F84
http://foro.elhacker.net/electronica/contador_con_pic16f84-t68594.0.html#ixzz1NhgCO2Cf