Que tal JOSE YC,
Espero que sigas trabajando con este proyecto de lo contrario habré gastado mi tiempo en vano. Jejeje.
De cualquier manera te comparte el código que he realizado para poder grabar los 16 números de 4 digitos en la memoria EEPROM y mostrarlos en un display de cuatro dígitos de 7 segmentos.
Este poseé 5 interruptores de tipo push conectados con resistencias de pull down:
1)READ (conectado al puerto RA.4)
2)PROGRAM (conectado al puerto RA.3)
3)UP (Conectado el puerto RA.2)
4)DIGIT (conectado al puerto RA.1)
5)ENTER (conetacto al puerto RA0).
El botón de READ tiene la función de mostrar el numero grabado en la EEPROM y cada vez que se presiona te muestra el siguiente número grabado en la EEPROM
El botón de PROGRAM hace que el circuito opere en modo de programación desde la última posición o número que estabas visualizando. Sabrás que este modo está activo porque solo muestra un dígito a la vez, comenzado por los millares de modo que al presionar el botón UP, incrmentas en uno el valor mostrado (0 a 9). Una vez seleccionado el número deseado, presionas el botón DIGIT para moverte al siguiente digito (centanas, decenas y unidades respectivamente). El presionar el botón ENTER ese valor que ya has seleccionado en tus cuatro digitos se guardará en esa posición actual. Si por alguna razón necesitas cancelar la operación, solamente presionas el botón de READ y regresará al modo de lectura y despliegue del numero en la EPPROM.
Saludos y espero que esto te ayudo a aprender mejor el lenguaje Basic del compilador PBP.
'****************************************************************
'* Name : MYNUM.PBP *
'* Author : "elreypic" *
'* Notice : Copyright (c) 2021 *
'* : All Rights Reserved *
'* Date : 2/25/2021 *
'* Version : 1.0 *
'* Notes : Microcontroller: PIC16F84A *
'* : Crystal: 4MHz *
'****************************************************************
define OSC 4 'Define el valor del cristal u oscilador a utilizar (4MHz)
'******************************************************************************
' Predefinición de datos en la EEPROM
'******************************************************************************
DATA @0,$12,$34 'Predefine en la EEPROM el primer valor a desplegar
DATA @2,$56,$78 'Predefine en la EEPROM el segundo valor a desplegar
DATA @4,$90,$12 'Predefine en la EEPROM el tercer valor a desplegar
DATA @6,$34,$56 'Predefine en la EEPROM el cuarto valor a desplegar
DATA @8,$78,$90 'Predefine en la EEPROM el quinto valor a desplegar
DATA @10,$00,$00 'Predefine en la EEPROM el sexto valor a desplegar
DATA @12,$98,$76 'Predefine en la EEPROM el séptimo valor a desplegar
DATA @14,$54,$32 'Predefine en la EEPROM el octavo valor a desplegar
DATA @16,$10,$01 'Predefine en la EEPROM el noveno valor a desplegar
DATA @18,$23,$45 'Predefine en la EEPROM el décimo valor a desplegar
DATA @20,$67,$89 'Predefine en la EEPROM el undécimo valor a desplegar
DATA @22,$01,$23 'Predefine en la EEPROM el duodécimo valor a desplegar
DATA @24,$45,$67 'Predefine en la EEPROM el décimo tercer valor a deplegar
DATA @26,$89,$00 'Predefine en la EEPROM el décimo cuarto valor a desplegar
DATA @28,$11,$11 'Predefine en la EEPROM el décimo quinto valor a desplegar
DATA @30,$22,$22 'Predefine en la EEPROM el décimo sexto valor a desplegar
'****************************************************************************************
' DEFINICION DE PUERTOS Y BITS DE REGISTROS
'****************************************************************************************
READ_SW VAR PORTA.4 'Pulsador para leer y mostrar los datos almacenados en la EEPROM
PROG_SW VAR PORTA.3 'Pulsador para colocar el sistema en modo de programación
UP_SW VAR PORTA.2 'Pulsador para incrementar el valor del número mostrado en el display
DIGI_SW VAR PORTA.1 'Pulsador para cambiar entre los digitos mostrados en el display
ENTER_SW VAR PORTA.0 'Pulsador de ENTER para realizar la grabación del número de 4 dígitos
'********************************************************************
' Definición de variables
'********************************************************************
NUMERO VAR BYTE[4] 'Array para mostrar el valor en el display
BYTE_ALTO VAR BYTE 'Variable que contiene la parte alta del dato leido de la EEPROM
BYTE_BAJO VAR BYTE 'Variable que contiene la parte baja del dato leido de la EEPROM
I VAR BYTE 'Variable auxiliar para el ciclo FOR
EE_ADDRESS VAR BYTE 'Variable que contiene la dirección a leer de la EEPROM
FLAG_READ VAR bit 'Bandera para indicar que se ha presionado el botón de lectura
'****************************************************************************************
' DEFINICION DE CONSTANTES
'****************************************************************************************
MAX_EE_ADDRESS CON 32 'Dirección límite de acceso a la EEPROM
DIGITO CON 16 'Valor inicial del digito a mostrar
'******************************************************************************
' INICIO DE PROGRAMA PRINCIPAL
'******************************************************************************
INI:
TRISA = %11111 'Define el puerto A como entrada
TRISB = %00000000 'Define el Puerto B como salida
EE_ADDRESS = 0 'Inicializa la dirección 0x00 de la EEPROM
FLAG_READ = 0 'Inicializa la bandera del botón de lectura
INICIO:
IF READ_SW = 1 AND FLAG_READ = 0 then 'Se ha presionado el boton de leer la EEPROM?
FLAG_READ = 1 'Levanta la bandera de botón de lectura
EE_ADDRESS = EE_ADDRESS + 2 'Incrementa el valor de la dirección
IF EE_ADDRESS = MAX_EE_ADDRESS then 'Se ha alcanzado la dirección máxima disponible?
EE_ADDRESS = 0 'Sí, entonces regresa a leer la dirección 0x00
ENDIF
endif
CANCEL_PROG:
READ EE_ADDRESS,BYTE_ALTO 'Lee la parte alta del dato en la EEPROM
READ EE_ADDRESS+1,BYTE_BAJO 'Lee la parte baja del dato en la EEPROM
NUMERO[3] = (BYTE_ALTO & $F0)>>4 'Decodifica los millares
NUMERO[2] = BYTE_ALTO & $0F 'Decodifica las centenas
NUMERO[1] = (BYTE_BAJO & $F0)>>4 'Decodifica las decenas
NUMERO[0] = BYTE_BAJO & $0F 'Decodifica las unidades
KEEP_DISP:
GOSUB DISPLAY_NUM 'Llama la subrutina para desplegar el dato en el display
IF READ_SW = 1 AND FLAG_READ = 1 then
GOTO KEEP_DISP 'Si sigue presionado el botón de lectura continua el despliegue
ELSE 'No, entonces:
FLAG_READ = 0 'Baja la bandera del botón de lectura
PAUSE 10 'No, entonces espera 10ms para eliminar rebotes
ENDIF
'**********************************************************
' MODO DE PROGRAMACION
'**********************************************************
if PROG_SW = 0 THEN 'Se ha presionado el botón de modo de programación?
GOTO INICIO 'No, entonces regresa a inicio
ENDIF
I = 3 'Variable para indicar el dígito de los millares
PORTB = (DIGITO*i) + NUMERO[I] 'Muestra el valor del dígito correspondiente del display
while PROG_SW = 1 'Realiza delays de 20ms hasta que el botón de programación
PAUSE 20 'sea liberado
WEND
PAUSE 20 'Realiza delay de 20ms para eliminar rebotes
PROGRAMA_DATO:
If UP_SW = 1 THEN 'Se ha presionado el botón de incrementar en uno el valor mostrado?
numero[i] = numero[i] + 1 'Sí, entonces incrementa el valor en 1 del valor mostrado
if numero[i] > 9 then 'El valor alcanzado es mayor a 9?
numero[i] = 0 'Reinicia el valor en 0
endif
PORTB = (digito*i) + numero[i] 'Muestra el valor del digito correspondiente del display
WHILE UP_SW = 1 'Mientras esté presionado el botón de incrementar el valor en 1
PAUSE 20 'realiza delays de 20ms hasta que se libere
WEND
PAUSE 20 'Una vez que se ha liberado realiza delay de 20ms para eliminar rebotes
endif
IF DIGI_SW = 1 then
I=I-1 'Decrementa la variable del digito a mostrar
If I=255 THEN 'Se ha alcanzado el límite inferior?
I = 3 'Sí, entonces asigna la variable del digito a mostrar en 3 para visualizar los millares
endif
PORTB = (digito*i) + numero[i] 'Muestra el valor del digito correspondiente del display
WHILE DIGI_SW = 1 'Mientras el botón de cambio de digito este presionado, realiza delays de 20ms
PAUSE 20
WEND
PAUSE 20 'Una vez liberado realiza un delay de 20ms para eliminar rebotes
ENDIF
IF ENTER_SW = 1 then 'Se ha presionado el botón de ENTER
BYTE_ALTO = (NUMERO[3]<<4) | Numero[2] 'Prepara el byte alto a grabar en la EEPROM
BYTE_BAJO = (NUMERO[1]<<4) | NUMERO[0] 'Prepara el byte bajo a grabar en la EEPROM
WRITE EE_ADDRESS,BYTE_ALTO 'Graba en la EEPROM la parte alta del valor
WRITE EE_ADDRESS+1,BYTE_BAJO 'Graba en la EEPROM la parte baja del valor
WHILE ENTER_SW = 1 'Mientras esté presiondo el botón del ENTER
PAUSE 20 'realiza delays de 20ms
WEND
PAUSE 20 'Una vez liberado, realiza un delay de 20 ms para eliminar rebotes
GOTO INIcio 'Regresa al inicio para mostrar el valor grabado
ENDIF
IF READ_SW = 1 then 'Se ha presionado el botónde read?
FLAG_READ = 1 'Cancela el modo de programadión
GOTO CANCEL_PROG 'Regresa a leer el dato original de la EEPROM y muestralo en el display
ENDIF
GOTO PROGRAMA_DATO 'Regresa al modo de programación
'********************************************************************
' Inicio de Subrutinas
'********************************************************************
'********************************************************************
' Subrutina para desplegar el valor de 4 dígitos en el display
' Nonmbre de la subrutina: DISPLAY_NUM
' Entradas: UNIDAD, DECENA, CENTENA, MILLAR
' Salidas: Ninguna
'********************************************************************
DISPLAY_NUM:0
for I=0 TO 3 'Realiza un ciclo FOR para mostrar cada uno de los 4 dígitos en el display en forma multiplexada
PORTB = (DIGITO*i)+ NUMERO[I] 'Muestra en el puerto B el valor de un dígito y habilítalo
PAUSE 1 'Manten el dígito encendido por 1ms
NEXT I 'Muestra el siguiente dígito
RETURN 'Termina la subrutina