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.

Entradas relacionadas: