Programación PIC16F877: Contador con LCD y Displays
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 6,68 KB
Configuración Inicial del Programa
Este segmento define el microcontrolador y sus archivos de inclusión.
list p=16f877
#include <p16f877.inc>
Define el modelo del PIC a usar (16f877
) y carga su archivo de definiciones con nombres de registros y bits (TRISx, PORTx, STATUS, etc.).
org 0x00
goto INICIO
- Indica que el programa comienza en la dirección
0x00
(vector de reset). - Redirige a la etiqueta INICIO, donde inicia el programa principal.
Declaración de Variables
Se definen las variables utilizadas en la memoria RAM.
cblock 0x20
UNIDADES
DECENAS
OBJETOS
RET1
RET2
TANDAS
endc
- Define variables en RAM a partir de la dirección
0x20
. - Se utilizan para guardar:
- UNIDADES y DECENAS: para mostrar en displays.
- OBJETOS: cuenta de objetos detectados.
- TANDAS: cantidad de tandas completadas (cada 10 objetos).
- RET1, RET2: variables auxiliares para retardos.
Definición de Pines de LCD
Se asignan alias a los pines de control del LCD.
#define RS PORTB, 4
#define E PORTB, 5
Define alias para controlar el LCD:
- RS: selecciona si es comando o dato.
- E: habilita la escritura en el LCD.
Inicio del Programa
Configuración de puertos y variables iniciales.
INICIO:
bsf STATUS, RP0 ; Cambia a banco 1
clrf TRISA ; RA0–RA3: salidas para UNIDADES
clrf TRISB ; RB0–RB3: salidas para DECENAS
clrf TRISD ; RD: salidas para datos del LCD
movlw b'11111111'
movwf TRISC ; RC: entradas para botones/sensores
bcf STATUS, RP0 ; Vuelve a banco 0
Configura los puertos:
- A y B como salidas (displays).
- C como entrada (botón o sensor).
- D como salida (LCD).
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf UNIDADES
clrf DECENAS
clrf OBJETOS
clrf TANDAS
Limpia todos los puertos y variables.
CALL RETARDO_LCD
MOVLW 0x38 ; 8-bit, 2 líneas
CALL CONTROL_LCD
; ... otros comandos de inicialización del LCD
Inicializa el LCD enviando comandos de configuración y limpiado.
Bucle Principal
Espera la detección de un objeto.
MAIN:
btfsc PORTC, 0 ; Espera que se presione botón (RC0 en bajo)
goto MAIN
call CONTAR
ESP_SOLTAR:
btfss PORTC, 0 ; Espera que se suelte el botón
goto ESP_SOLTAR
goto MAIN
- Bucle que detecta un botón (o sensor) en RC0.
- Llama a CONTAR al detectar flanco descendente.
Contar Objetos y Tandas
Rutina para incrementar los contadores.
CONTAR:
incf OBJETOS, f ; Suma 1 a objetos
movf OBJETOS, w
xorlw 0x0A ; ¿10 objetos?
btfss STATUS, Z
goto CONTAR_BCD
clrf OBJETOS
incf TANDAS, f
- Aumenta el contador de objetos.
- Si llega a 10, lo reinicia y aumenta el número de tandas.
movf TANDAS, w
xorlw 0x0A ; ¿10 tandas?
btfss STATUS, Z
goto CONTAR_BCD
clrf TANDAS
Si se llega a 10 tandas, también se reinicia el contador de tandas.
Actualizar Displays (BCD)
Lógica para mostrar el conteo en formato BCD.
CONTAR_BCD:
incf UNIDADES, f
movf UNIDADES, w
xorlw 0x0A
btfss STATUS, Z
goto CHECK_99
clrf UNIDADES
incf DECENAS, f
CHECK_99:
movf DECENAS, w
xorlw 0x0A
btfss STATUS, Z
goto MOSTRAR
clrf UNIDADES
clrf DECENAS
Lógica BCD para que UNIDADES y DECENAS cuenten de 0 a 99 y luego se reinicien.
Mostrar en Displays y en LCD
Rutina para actualizar las salidas.
MOSTRAR:
movf UNIDADES, w
andlw 0x0F
movwf PORTA
movf DECENAS, w
andlw 0x0F
movwf PORTB
Muestra el número en los displays conectados a PORTA y PORTB.
call MOSTRAR_OBJETOS
call MOSTRAR_TANDA
return
- También actualiza el LCD con los valores actuales.
Retardos
Rutina de retardo simple.
RETARDO_LCD:
movlw d'10'
movwf RET1
movwf RET2
goto R2 ; Suponiendo que R2 es una etiqueta dentro del retardo
Genera un retardo simple para que el LCD procese correctamente las instrucciones.
Manejo del LCD
Rutinas para enviar datos y comandos al LCD.
CONTROL_LCD: bcf RS
CARACTER_LCD: bsf RS
CARGAR_LCD:
movwf PORTD
bsf E
call RETARDO_LCD
bcf E
call RETARDO_LCD
return
Rutinas para enviar comandos o caracteres al LCD (por PORTD).
Mostrar Tandas en LCD
Actualiza la línea de tandas en el LCD.
MOSTRAR_TANDA:
movlw 0x80 ; Línea 1
call CONTROL_LCD
movlw 'T'
call CARACTER_LCD
movlw 'A'
call CARACTER_LCD
movlw 'N'
call CARACTER_LCD
movlw 'D'
call CARACTER_LCD
movlw 'A'
call CARACTER_LCD
movlw ' '
call CARACTER_LCD
movf TANDAS, w
call CONVERTIR_Y_MOSTRAR
Muestra el texto "TANDA "
seguido del número de tandas en la línea 1 del LCD.
Mostrar Objetos en LCD
Actualiza la línea de objetos en el LCD.
MOSTRAR_OBJETOS:
movlw 0xC0 ; Línea 2
call CONTROL_LCD
movlw 'O'
call CARACTER_LCD
movlw 'B'
call CARACTER_LCD
movlw 'J'
call CARACTER_LCD
movlw 'E'
call CARACTER_LCD
movlw 'T'
call CARACTER_LCD
movlw 'O'
call CARACTER_LCD
movlw 'S'
call CARACTER_LCD
movlw ':'
call CARACTER_LCD
movlw ' '
call CARACTER_LCD
movf OBJETOS, w
call CONVERTIR_Y_MOSTRAR
Muestra "OBJETOS: x"
en la segunda línea del LCD.
Convertir a ASCII
Rutina para convertir un número a su representación ASCII.
CONVERTIR_Y_MOSTRAR:
addlw '0' ; Convierte el número a ASCII
call CARACTER_LCD
return
Toma un número entre 0 y 9 y lo convierte a su valor ASCII para mostrarlo correctamente en el LCD.