Buenos días a todos en el foro estoy trabajando con un PIC16F874A y quisiera mostrar el resultado en cuatro display de siete segmentos (catodo común) ya navegue por internet y realice intentos propios y no pude la idea es hacerlo mandando el resultado directamente en binario a un puerto porsupuesto que no quiero la solución en bandeja pero si una guía
Desde ya Gracias
Si vas a mandar el "binario" tenes que hacerlo atraves de un decodificador como el CD4511 pero ojo... este decodificador transforma BCD a 7 segmentos.
Por si las dudas la diferencia en binario y BCD:
Suponete el valor 5789 decimal, Necesitarias 2 registros de 8 bits y pasado a hexa es 169Dh (0001 0110 1001 1101) la idea es pasarlo a BCD. es decir que en un registro tengas la unidades de mil, las centenas, las decenas y las unidades.
Quedando y esto es lo que tenes que enviar:
Miles= 5h = 0101
Centenas = 7h = 0111
Decenas = 8h = 1000
Unidades= 9h = 1001
Por ahi algunos usan lo que llaman BCD packed, si te fijas el BCD solo ocupa 4 bits como maximo ( ya que el 9 es el maximo ) y los registros son de 8 bits, por lo que hay algunos codigos que directamente te lo ubican en 2 registros a esos 4 valores:
Miles y Centenas = 57h = 0101 01111
Decenas y Unidades = 89h = 1000 1001
Ya tenes los datos en BCD sea de la forma que sea... ahora para mostrarlos en los displays tenes que multiplexarlos. Podrias poner un timer que cuando active la interrupcion cambie el display a mostrar. La multiplexacion funcionaria asi:
1era interupcion: desactivo el catodo de unidades, Envio mis datos de miles al puerto = 5h , el 4511 se encarga de pasarlo a 7 segmentos y activo el catodo de miles
2da interupcion: desactivo el catodo de miles (apago ese display), Envio mis datos de centenas al puerto = 7h y activo el catodo de las centenas
3ra interupcion: desactivo el catodo de centenas, Envio mis datos de decenas al puerto = 8h y activo el catodo de las decenas
3ra interupcion: desactivo el catodo de decenas, Envio mis datos de unidades al puerto = 9h y activo el catodo de las unidades
Vuelvo a repetir.
La velocidad de prendido y apagado (tiempo de iterrupciones) queda a tu criterio. Mientras mas rapido menos se nota el apagado y encendido de lso displays pero hay un poco menos de brillo.
Entendi otra cosa cuando dijiste binario. Pero al final es lo mismo..
Tomas los datos del ADC (10 bits) -> los pasas a BCD (16bits como minimo, 4 bits por cada numero) y lo que cambia es la forma de mostrarlo ya que necesitas una conversion mas...
Te creas una tabla que haga lo mismo que el 4511 ( hasta podes copiarselo del datasheet ):Código: ASM
BCD7SEG: ; retlw b'gfedcba' para display catodo comun addwf PCL,1 ; Se incrementa el contador del programa.- retlw b'0111111' ; 0 retlw b'0000110' ; 1 retlw b'1011011' ; 2 retlw b'1001111' ; 3 retlw b'1100110' ; 4 retlw b'1101101' ; 5 retlw b'1111101' ; 6 retlw b'0000111' ; 7 retlw b'1111111' ; 8 retlw b'1101111' ; 9 ;Aca seguiria para los valores de 10 a 15, podrias ponerle todos 0 por las dudas
oCódigo: ASM
BCD7SEG: ; retlw b'gfedcba' para display catodo comun addwf PCL,1 ; Se incrementa el contador del programa.- DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F ; Aca tambien harias lo mismo poniendo ceros por las dudas que este mal tu codigo de BCD clrf Contador retlw 0x3F
Fijate que aclare que despues del 9 podrias poner lo que ocuparia cuando entra como variable de 0x0A a 0x0F, aunque si esta bien realizada la conversion a BCD no deberia de superar 9 nunca.
Entonces una ves que tenes tu codigo en BCD, cargas el valor de las unidades/decenas/centenas o miles al registro W, llamas a la funcion, esta salta la cantidad de instrucciones segun lo cargado en W. Y lo que te devuelva en W lo pasas al puerto. Controlando con cada bit 1 de los segmentos del display. ( te queda un bit libre ya que son 7 segmentos )
Y luego es lo mismo que explique para los catodos. Me refiero a la multiplexacion.
En fin lo unico que cambio fue eso, en ves de sacarlos directamente BCD al puerto, lo pasas por un "conversor BCD / 7 segmentos" que creaste en el software y sacas directamente la salida de 7 segmentos.
El codigo fue sacado de aca:
http://www.todopic.com.ar/foros/index.php?topic=24720.msg201401#msg201401
#DEFINE COL1E BSF TRISE,0 ;DEFINO COL1 COMO ENTRADA
#DEFINE COL1S BCF TRISE,0 ;DEFINO COL1 COMO SALIDA BSF TRD1
BCF TRD2
BCF TRD3
BCF TRD4 BSF LED1
AAA BTFSC RECU
GOTO H
GOTO RECUPE
RETURNRECUPERAR
BCF STATUS,IRP ;Pongo a 0 el bit mas significativo del direccionamiento indirecto, por si alguien lo cambio, aunque de reset esta con 0
MOVLW DIGI4 ; Cargo direccion de Digi4
MOVWF FSR
MOVLW 0x04 ; Cargo mi contador
MOVWF REG_TEMPORAL
LOOP
BSF STATUS,RP1
BCF STATUS,RP0
DECF REG_TEMPORAL,W ; Cargo W con Contador - 1, asi la direcciones van desde 0x00 a 0x03
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
BCF STATUS,RP1
BCF STATUS,RP0
MOVWF INDF
DECF FSR,F ;Decremetno la direccion apuntando a Digi3, digi2, digi1
DECFSZ REG_TEMPORAL,F ; Decremento mi contador, cuando llega a 0x00 sale
GOTO LOOP
RETURN Uy... ensamblador... Definitivamente poderoso, pero fácilmente quintuplica la cantidad de líneas que tendrías con cualquier otro lenguaje, sin mencionar que hace el código mucho más difícil y tedioso de leer.
Mi recomendación personal es que migres y aprendas un lenguaje de alto nivel (C, BASIC, etc.) para que sea más sencillo trabajar; para los proyectos comunes no es necesario el dominio de bajo nivel de asm, y muchos compiladores incluso te permiten incluir código asm como subrutina a llamar en caso de necesitarla.
Si tu ADC lee 1000 en decimal = 0x3E8
Con tu programa de BCD deberias tener a la salida 4 registros con los valores: 0x01 , 0x00 , 0x00 , 0x00 (seria lo mas simple si tenes espacio)
O... 2 registros con los valores: 0x10 y 0x00 , que luego tenes que separar y se complica mas el codigo.
Podrias probar tu conversor Binario-> BCD poniendo un valor fijo en los registros de entrada (creo que son ADRES y ADRESA) y probar que efectivamente sale eso. De alli es cargar esos valores a W y hacer un CALL a la tabla.
Lo unico que noto es que la tabla usas los 8 bits, pero para un display deberias tener 7 bits + 1bit que siempre estaria en 0.
Podes observar tambien que el 0 esta mal hecho, segun como tenes definido arriba en el comment los pines :
; GFBADEPC
RETLW B'01111101' ;0
Para el 0 el unico segmento apagado es el G, y como dije antes tenes 8 bits y no 7 ( o 7 + 1 siempre en 0 ).
RETLW B'01111110' ;0
Ahi le puse a 1 el segmento que falta y dejo siempre el ultimo bit a 0, todo eso depende de como tengas hecho tu HW.
Pero bueno veo que usaste esos valores para tu otra parte del codigo y te anduvo bien, si asi te anda seguilo asi.. aunque como dije solo necesitas 7 bits para un display 7 segmentos
PD:
Jugando anoche hice esto:Código: ASM
;Salida: TECPUL = 0x00 a 0x0C , 0x00 indica nada presionado, 0x01 a 0x0C , teclas de 1 al 12 LEE_TECLADO BANCO0 ;PASAO AL BANCO CERO CLRF TECPUL ;LIMPIO LA VARIABLE TECPUL CLRF REG_TEMPORAL,F INCF REG_TEMPORAL,F LOOP_lecura MOVF REG_TEMPORAL,W MOVWF PORTD MOVF PORTE,W BTFSZ STATUS,Z ; Si no detecto nada sumo 3 y vuelvo a cambiar de fila GOTO TECLA_DETECTADA ; Si detecto algo voy a ver que es MOVF TECPUL,W ADDLW 0x03 ; Sumo 3 por cada vez que no detecto nada MOVWF TECPUL ; Guardo el valor temporalmente BCF STATUS,C RLF REG_TEMPORAL,F ; Roto a la otra fila, pongo en 0 el carry para que no exista un 1 de algun otro carry ( que no deberia ya que TECPUL no pasaria de 12 ) BTFSS REG_TEMPORAL,4 ; Si esta en 0 entonces quiere decir que tengo que seguir rotando GOTO LOOP_lectura CLRF TECPUL,F ; Limpio TECPUL, no detecte nada RETURN TECLA_DETECTADA MOVF TECPUL,W BTFSS COL1 GOTO COLUMNA2 ADDLW 0x01 MOVWF TECPUL RETURN COLUMNA2 BTFSS COL2 GOTO COLUMNA3 ADDLW 0x02 MOVWF TECPUL RETURN COLUMNA3 ADDLW 0x03 MOVWF TECPUL RETURN ; Cuando vuelva llamas a la tabla asi devuelve el valor que deberia, a la tabla tendrias que agregarle los demas valores. o puede que tengas que cambiar un poco la tabla/o hacer otra.
yCódigo: ASM
GRABAR BANKSEL PORTA ;Banco 0 BCF INTCON,GIE ;DESHABILITO TODAS LAS INTERUPCIONES BCF STATUS,IRP ;Pongo a 0 el bit mas significativo del direccionamiento indirecto, por si alguien lo cambio, aunque de reset esta con 0 MOVLW DIGI4 ; Cargo direccion de Digi4 MOVWF FSR MOVLW 0x04 ; Cargo mi contador MOVWF REG_TEMPORAL LOOP_GRABAR BANKSEL PORTA ;Banco 0 DECF REG_TEMPORAL,W ;Direccion a escribir, comienza con 0x03 ( 0x04 - 1 ) BSF STATUS,RP1 BCF STATUS,RP0 ;BANCO2 MOVWF EEADR MOVF INDF,W ;MUEVO lo que me apunta FSR, comenzando por Digi4 MOVWF EEDATA BSF STATUS,RP0 ;BANCO3 BCF EECON1,EEPGD BSF EECON1,WREN ;HABILITO ESCRITURA MOVLW H'55' ;REQUERIDO MOVWF EECON2 ;REQUERIDO MOVLW H'AA' ;REQUERIDO MOVWF EECON2 ;REQUERIDO BSF EECON1,WR ;DESHABILITO ESCRITURA VERIF BTFSC EECON1,WR GOTO VERIF DECF FSR,F ;Decremetno la direccion apuntando a Digi3, digi2, digi1 DECFSZ REG_TEMPORAL,F ; Decremento mi contador, cuando llega a 0x00 sale GOTO LOOP_GRABAR ;BSF INTCON,GIE ; Habilito interrupciones por si hace falta, por eso esta comentado BCF EECON1,WREN BCF STATUS,RP1 BCF STATUS,RP0 RETURN
Exactametne, tiene su salida en binario ( BCD ya que no superaria el 9 ), Cada digito tiene registro de salida.
Tu codigo BCD funciona de la siguiente forma...
Ingresas el codigo por ADRES y ADRESA (10 bit diretamente desde el ADC asi como lo tenes)
(Lo simule y ADRES me cuenta como una palabra reservada o un registro, por eso en mi caso le puse ADRESB el nombre por las dudas)
Salida:
LSD : unidades
MSD : decenas
VSD : centenas
HSD : miles
De ahi tenes que cargar cada valor de esos a W.. llamar a la tabla .. ahi el nuevo valor se carga en W nuevamente y ese valor va a al puerto segun el display que sea.
Ejemplo:Código: ASM
MOSTRAR_DISPLAY_UNIDADES MOVF LSD,W ;Cargo mi valor en binario/BCD CALL TABLA ;Lo transformo de BCD a 7 segmentos BCF TRD4,F ; Apago catodo de los miles MOVWF PORTC ; Cambio el puerto C por el nuevo valor BSF TRD1,F ; enciendo el display de las unidades CALL DEMORA ; Puse la demora para que este parecido al tuyo. MOSTRAR_DISPLAY_DECENAS MOVF MSD,W ; Repito lo mismo que arriba nomas que para las decenas y deberia repetirlo para todos los demas. CALL TABLA BCF TRD1,F MOVWF PORTC BSF TRD2,F CALL DEMORA ; etc para los demas. es solo un ejemplo
Exactametne, tiene su salida en binario ( BCD ya que no superaria el 9 ), Cada digito tiene registro de salida.
Tu codigo BCD funciona de la siguiente forma...
Ingresas el codigo por ADRES y ADRESA (10 bit diretamente desde el ADC asi como lo tenes)
(Lo simule y ADRES me cuenta como una palabra reservada o un registro, por eso en mi caso le puse ADRESB el nombre por las dudas)
Salida:
LSD : unidades
MSD : decenas
VSD : centenas
HSD : miles
De ahi tenes que cargar cada valor de esos a W.. llamar a la tabla .. ahi el nuevo valor se carga en W nuevamente y ese valor va a al puerto segun el display que sea.
Ejemplo:Código: ASM
MOSTRAR_DISPLAY_UNIDADES MOVF LSD,W ;Cargo mi valor en binario/BCD CALL TABLA ;Lo transformo de BCD a 7 segmentos BCF TRD4,F ; Apago catodo de los miles MOVWF PORTC ; Cambio el puerto C por el nuevo valor BSF TRD1,F ; enciendo el display de las unidades CALL DEMORA ; Puse la demora para que este parecido al tuyo. MOSTRAR_DISPLAY_DECENAS MOVF MSD,W ; Repito lo mismo que arriba nomas que para las decenas y deberia repetirlo para todos los demas. CALL TABLA BCF TRD1,F MOVWF PORTC BSF TRD2,F CALL DEMORA ; etc para los demas. es solo un ejemplo
Ok lo voy a probar como vos decís y te paso el programa como quedó y vemos si hay algo mal, desde ya gracias por tu ayuda
Yo simule tu BCD al cual le agregue la llamada a la tabla y funciona perfecto...Código: ASM
TABLA ADDWF PCL,F ; GFBADEPC RETLW B'01111101' ;0 RETLW B'00100001' ;1 RETLW B'10111100' ;2 RETLW B'10111001' ;3 RETLW B'11100001' ;4 RETLW B'11011001' ;5 RETLW B'11011101' ;6 RETLW B'00110001' ;7 RETLW B'11111101' ;8 = 0xFD ese binario RETLW B'11110001' ;9 MAIN ; AQUI CONVERSION BCD MOVLW 0x08 MOVWF ADRESB MOVLW 0x00 MOVWF ADRESA CALL STAR ;; LLamada a BCD pero si te fijas arriba solo puse el valor 0x008, dando por resultado LSD = 0x8 y HSD=VSD=MSD=0x0 ; FIN CONVERSION BCD ;MUESTRO, en realidad lo guardo en un registro, fue para poder debuggearlo BANKSEL PORTA MOVF LSD,W ; Muevo el 0x8 a W CALL TABLA ; Llamo a la tabla MOVWF TEMP ; En TEMP me queda guardado el valor 1111 1101 o que es igual a 0xFD GOTO MAIN
Por lo tanto funciona.
Si pero recorda que en tu anterior codigo tenias como 0x00 cuando no se presionaba nada.. Puede que eso te afecte.
Tambien tu teclado tiene 12 teclas ( 4x3 ) mientras que la tabla que esta ahi solo tiene del 0 al 9... si podes poner el codigo mejor. por que no se que modificacioes le hiciste.
Claro tu problema es que luego haces una comprobacion asi:Lo probe no me funcionó el cero no lo muestra no se realmente porqueCódigo: ASM
MOVF TECPUL,W ;MUEVO EL VALOR DE TECPUL A W XORLW .0 ;VERIFICO SI TECPUL ES CERO BTFSC STATUS,Z ;VERIFICO SI Z=0
Entonces para intentar no tocar todo el codigo... simplemente cambia
LEE9 a B'1010' (Esta por que LEE8 tiene el mismo numero )
LEE10 a B'1011'
LEE11 a B'1100'
Y para que la tabla siga funcionando agregale nuevas entradas asi funciona tanto para el codigo BCD, como para el de tu tecladoCódigo: ASM
TABLA ADDWF PCL,F ; GFBADEPC RETLW B'01111101' ;0 RETLW B'00100001' ;1 RETLW B'10111100' ;2 RETLW B'10111001' ;3 RETLW B'11100001' ;4 RETLW B'11011001' ;5 RETLW B'11011101' ;6 RETLW B'00110001' ;7 RETLW B'11111101' ;8 RETLW B'11110001' ;9 ;Lo del teclado RETLW B'11011101' ;10 Caso que entre a LEE9 (Aca tenes que modificar los valores de binario segun corresponda ) RETLW B'00110001' ;11 Caso que entre a LEE10 RETLW B'11111101' ;12 Caso que entre a LEE11
Podes fijarte la primera vez que pasaste el programa ahi estan los valores en binario que usabas.
Debuggealo en el MPLAB... asi vas a ver cual es tu problema.
Debuggealo en el MPLAB... asi vas a ver cual es tu problema.
Ok
Entendi otra cosa cuando dijiste binario. Pero al final es lo mismo..
Tomas los datos del ADC (10 bits) -> los pasas a BCD (16bits como minimo, 4 bits por cada numero) y lo que cambia es la forma de mostrarlo ya que necesitas una conversion mas...
Te creas una tabla que haga lo mismo que el 4511 ( hasta podes copiarselo del datasheet ):Código: ASM
BCD7SEG: ; retlw b'gfedcba' para display catodo comun addwf PCL,1 ; Se incrementa el contador del programa.- retlw b'0111111' ; 0 retlw b'0000110' ; 1 retlw b'1011011' ; 2 retlw b'1001111' ; 3 retlw b'1100110' ; 4 retlw b'1101101' ; 5 retlw b'1111101' ; 6 retlw b'0000111' ; 7 retlw b'1111111' ; 8 retlw b'1101111' ; 9 ;Aca seguiria para los valores de 10 a 15, podrias ponerle todos 0 por las dudas
END
Realice unos cambios saque la operacion xor y ahora la tabla funciona perfecto pero voy a tener que cambiar la forma de leer el teclado y mostrarlo porque los tiempos para ingresar los números no me dan te paso el codigo.
;*****************************************************************************************************************************
;ESTE PROGRAMA MANEJA UN TECLADO DE 4 FILAS Y TRES COLUMNAS MATRICIAL POR EL CUAL SE INGRESA UN VALOR Y LO MUESTRA EN CUATRO
;DISPLAYS DE 7 SEGMENTOS, TAMBIÉN MEDIANTE UN PULSADOR GRABA EL VALOR MOSTRADO EN LOS DISPLAY EN MEMORIA EPROM Y CON OTRO
;PULSADOR RECUPERA DICHO VALOR, LA PARTE DEL CONVERSOR A/D EN ESTE PROGRAMA NO FUNCIONA SOLAMENTE FIGURAN LAS SUBRUTINAS
;*****************************************************************************************************************************
LIST P= 16F874A
INCLUDE "P16F874A.INC"
;*****************************************************VARIABLES****************************************************************
REG1 EQU H'20' ;VARIABLE PARA SUBRUTINA DE RETARDO
REG2 EQU H'21' ;VARIABLE PARA SUBRUTINA DE RETARDO
DIGI1 EQU H'22' ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 1
DIGI2 EQU H'23' ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 2
DIGI3 EQU H'24' ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 3
DIGI4 EQU H'25' ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 4
TECPUL EQU H'26' ;VARIABLE PARA ALMACENAR EL VALOR DE LA TECLA PULSADA
REG3 EQU H'27' ;VARIABLE PARA SUBRUTINA DE RETARDO1
REG4 EQU H'28' ;VARIABLE PARA SUBRUTINA DE RETARDO1
REG5 EQU H'29' ;VARIABLE PARA SUBRUTINA DE RETARDO CONVERSOR A/D
LSD EQU H'2A' ;VARIABLE PARA SUBRUTINA BINBCD
MSD EQU H'2B' ;VARIABLE PARA SUBRUTINA BINBCD
VSD EQU H'2C' ;VARIABLE PARA SUBRUTINA BINBCD
HSD EQU H'2D' ;VARIABLE PARA SUBRUTINA BINBCD
ADRESA EQU H'2E' ;VALOR ALTO DE LA CONVERSION=ADRESH
ADRES EQU H'2F' ;VALOR BAJO DE LA CONVERSION=ADRESL
TECLA1 EQU H'30'
TECLA2 EQU H'31'
TECLA3 EQU H'32'
TECLA4 EQU H'33'
;*****************************************************CONSTANTES***************************************************************
VALOR1 EQU .74 ;VALORES PARA EL RETARDO
VALOR2 EQU .2 ;VALORES PARA EL RETARDO
VALOR3 EQU .200 ;VALORES PARA EL RETARDO1
VALOR4 EQU .20 ;VALORES PARA EL RETARDO1
;*****************************************************DEFINICIONES*************************************************************
#DEFINE BANCO0 BCF STATUS,RP0
#DEFINE BANCO1 BSF STATUS,RP0
;***************************************************OTRAS DEFINICIONES********************************************************
#DEFINE TRD1 PORTD,7 ;DEFINO LA SALIDA DE TRD1
#DEFINE TRD2 PORTD,6 ;DEFINO LA SALIDA DE TRD2
#DEFINE TRD3 PORTD,5 ;DEFINO LA SALIDA DE TRD3
#DEFINE TRD4 PORTD,4 ;DEFINO LA SALIDA DE TRD4
#DEFINE LED1 PORTB,5 ;DEFINO LED PRUEBA
#DEFINE GRABO PORTB,7 ;DEFINO PULSADOR CONVERSOR ANALOGICO DIGITAL
#DEFINE LED2 PORTB,4 ;DEFINO LED PRUEBA
#DEFINE RECU PORTB,6 ;DEFINO PULSADOR GRABAR
#DEFINE COL1 PORTE,0 ;DEFINO COLUMNA TECLADO
#DEFINE COL2 PORTE,1 ;DEFINO COLUMNA TECLADO
#DEFINE COL3 PORTE,2 ;DEFINO COLUMNA TECLADO
#DEFINE FIL1 PORTD,0 ;DEFINO TECLADO FILAS
#DEFINE FIL2 PORTD,1 ;DEFINO TECLADO FILAS
#DEFINE FIL3 PORTD,2 ;DEFINO TECLADO FILAS
#DEFINE FIL4 PORTD,3 ;DEFINO TECLADO FILAS
#DEFINE COL1E BSF TRISE,0 ;DEFINO COL1 COMO ENTRADA
#DEFINE COL1S BCF TRISE,0 ;DEFINO COL1 COMO SALIDA
#DEFINE COL2E BSF TRISE,1 ;DEFINO COL2 COMO ENTRADA
#DEFINE COL2S BCF TRISE,1 ;DEFINO COL2 COMO SALIDA
#DEFINE COL3E BSF TRISE,2 ;DEFINO COL3 COMO ENTRADA
#DEFINE COL3S BCF TRISE,2 ;DEFINO COL3 COMO SALIDA
;********************************************************PROGRAMA*************************************************************
ORG H'0000'
GOTO INICIO ;IR AL INICIO DEL PROGRAMA
ORG H'0005' ;ATENCION A LAS INTERUPCIONES
RETFIE
;*********************************SUBRUTINA TABLA CONVERSION BCD A 7 SEGMENTOS*************************************************
TABLA
ADDWF PCL,F
; GFBADEPC
RETLW B'01111101' ;0
RETLW B'00100001' ;1
RETLW B'10111100' ;2
RETLW B'10111001' ;3
RETLW B'11100001' ;4
RETLW B'11011001' ;5
RETLW B'11011101' ;6
RETLW B'00110001' ;7
RETLW B'11111101' ;8
RETLW B'11110001' ;9
;************************************************INICIALIZACION****************************************************************
INIPIC BANCO1
MOVLW B'10110100'
MOVWF ADCON1 ;CONFIGURO A0, A1 Y A3 COMO ENTRADAS ANALOGICAS
MOVLW B'001011'
MOVWF TRISA ;CONFIGURO EL PUERTO A
MOVLW B'11000000'
MOVWF TRISB ;CONFIGURO EL PUERTO B COMO SALIDA (B7 Y B6 ENTRADAS)
MOVLW B'00000000'
MOVWF TRISC ;CONFIGURO EL PUERTO C COMO SALIDA
MOVLW B'00000000'
MOVWF TRISD ;CONFIGURO EL PUERTO D COMO SALIDA
MOVLW B'000'
MOVWF TRISE ;CONFIGURO EL PUERTO E COMO SALIDA
MOVLW B'00000000'
MOVWF INTCON ;DESHABILITO LAS INTERRUPCIONES
BANCO0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
RETURN
;**************************************************PROGRAMA PRINCIPAL**********************************************************
INICIO CALL INIPIC ;LLAMO A LA RUTINA DE INICIALIZACION
CALL TECLADO ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO
HHH CALL MUESTRO
GOTO HHH
;*********************************************SUBRUTINA DE RETARDO*************************************************************
RETARDO MOVLW VALOR1
MOVWF REG1
MOVLW VALOR2
MOVWF REG2
LOOP DECFSZ REG1,F
GOTO LOOP
DECFSZ REG2,F
GOTO LOOP
RETURN
;*********************************************SUBRUTINA DE RETARDO1*************************************************************
RETARDO1 MOVLW VALOR3
MOVWF REG3
MOVLW VALOR4
MOVWF REG4
LOOP1 DECFSZ REG1,F
GOTO LOOP1
DECFSZ REG2,F
GOTO LOOP
RETURN
;***********************************************SUBRUTINA DE MUESTREO*********************************************************
MUESTRO
H MOVF DIGI1,W ;MUEVO EL VALOR DE DIGI1 A W
CALL TABLA
MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO
BSF TRD1
BCF TRD2
BCF TRD3
BCF TRD4
CALL RETARDO
MOVF DIGI2,W ;MUEVO EL VALOR DE DIGI2 A W
CALL TABLA
MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO
BCF TRD1
BSF TRD2
BCF TRD3
BCF TRD4
CALL RETARDO
MOVF DIGI3,W ;MUEVO EL VALOR DE DIGI3 A W
CALL TABLA
MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO
BCF TRD1
BCF TRD2
BSF TRD3
BCF TRD4
CALL RETARDO
MOVF DIGI4,W ;MUEVO EL VALOR DE DIGI4 A W
CALL TABLA
MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO
BCF TRD1
BCF TRD2
BCF TRD3
BSF TRD4
CALL RETARDO
BTFSC GRABO
GOTO AAA
CALL GD1
BSF LED1
AAA BTFSC RECU
GOTO H
GOTO RECUPE
RETURN
;*********************************************RECUPERACION DE VALORES***********************************************************
RECUPE
CLRF DIGI1
CLRF DIGI2
CLRF DIGI3
CLRF DIGI4
CALL RECUP1
CALL RECUP2
CALL RECUP3
CALL RECUP4
CALL MUESTRO1
;***********************************************SUBRUTINA DE MUESTREO VALOR RECUPERADO*********************************************
MUESTRO1
X2
MOVF DIGI1,W ;MUEVO EL VALOR DE DIGI1 A W
CALL TABLA
MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO
BSF TRD1
BCF TRD2
BCF TRD3
BCF TRD4
CALL RETARDO
MOVF DIGI2,W ;MUEVO EL VALOR DE DIGI2 A W
CALL TABLA
MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO
BCF TRD1
BSF TRD2
BCF TRD3
BCF TRD4
CALL RETARDO
MOVF DIGI3,W ;MUEVO EL VALOR DE DIGI3 A W
CALL TABLA
MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO
BCF TRD1
BCF TRD2
BSF TRD3
BCF TRD4
CALL RETARDO
MOVF DIGI4,W ;MUEVO EL VALOR DE DIGI4 A W
CALL TABLA
MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO
BCF TRD1
BCF TRD2
BCF TRD3
BSF TRD4
CALL RETARDO
GOTO X2
RETURN
;******************************************SUBRUTINA DE LECTURA DE TECLADO *****************************************************
LEETEC BANCO1 ;PASO AL BANCO CERO PARA CONFIGURAR
COL1E ;CONFIGURO COL1 COMO ENTRADA
COL2E ;CONFIGURO COL2 COMO ENTRADA
COL3E ;CONFIGURO COL3 COMO ENTRADA
BANCO0 ;PASAO AL BANCO CERO
CLRF TECPUL ;LIMPIO LA VARIABLE TECPUL
BSF FIL1 ;PONGO A 1 FIL1
BCF FIL2 ;PONGO A 0 FIL2
BCF FIL3 ;PONGO A 0 FIL3
BCF FIL4 ;PONGO A 0 FIL4
CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL1 ;COL1=0?
GOTO LEE1 ;NO ES 0 VOY A LEE1
MOVLW B'0001' ;Nº 1 A W FILA 1 COLUMNA1
MOVWF TECPUL ;MUEVO Nº1 A TECPUL
LEE1 CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL2 ;COL2=0?
GOTO LEE2 ;NO ES 0 VOY A LEE2
MOVLW B'0010' ;Nº 2 A W FILA1 COLUMNA2
MOVWF TECPUL ;MUEVO Nº2 A TECPUL
LEE2 CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL3 ;COL3=0?
GOTO LEE3 ;NO ES CERO VOY A LEE3
MOVLW B'0011' ;Nº 3 A W FILA1 COLUMNA 3
MOVWF TECPUL ;MUEVO Nº 3 A TECPUL
LEE3 BCF FIL1
BSF FIL2
CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL1 ;COL1=0?
GOTO LEE4 ;NO ES 0 VOY A LEE4
MOVLW B'0100' ;Nº 4 A W FILA2 COLUMNA1
MOVWF TECPUL ;MUEVO Nº 4 A TECPUL
LEE4 CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL2 ;COL2=0?
GOTO LEE5 ;NO ES 0 VOY A LEE5
MOVLW B'0101' ;Nº 5 A W FILA2 COLUMNA2
MOVWF TECPUL ;MUEVO Nº 5 A TECPUL
LEE5 CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL3 ;COL3=0?
GOTO LEE6 ;NO ES 0 VOY A LEE6
MOVLW B'0110' ;Nº 6 A W FILA2 COLUMNA3
MOVWF TECPUL ;MUEVO Nº 6 A TECPUL
LEE6 BCF FIL2
BSF FIL3
CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL1 ;COL1=0?
GOTO LEE7 ;NO ES 0 VOY A LEE7
MOVLW B'0111' ;Nº 7 A W FILA3 COLUMNA1
MOVWF TECPUL ;MUEVO Nº 7 A TECPUL
LEE7 CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL2 ;COL2=0?
GOTO LEE8 ;NO ES 0 VOY A LEE8
MOVLW B'1000' ;Nº 8 A W FILA3 COLUMNA2
MOVWF TECPUL ;MUEVO Nº 8 A TECPUL
LEE8 CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL3 ;COL3=0?
GOTO LEE9 ;NO ES 0 VOY A LEE9
MOVLW B'1001' ;Nº 9 A W FILA3 COLUMNA3
MOVWF TECPUL ;MUEVO Nº 9 A TECPUL
LEE9 BCF FIL3
BSF FIL4
CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL1 ;COL2=0?
GOTO LEE10 ;NO ES 0 VOY A LEE10
MOVLW B'1000' ;LETRA P A W FILA4 COLUMNA1
MOVWF TECPUL ;MUEVO P A TECPUL
LEE10 CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL2 ;COL2=0?
GOTO LEE11 ;NO ES 0 VOY A LEE11
MOVLW B'0000' ;Nº 0 A W FILA4 COLUMNA2
MOVWF TECPUL ;Nº 0 A TECPUL
LEE11 CALL RETARDO
CALL RETARDO
CALL RETARDO
CALL RETARDO
BTFSC COL3 ;COL3=0?
GOTO LEE12 ;NO ES 0 VOY A LEE12
MOVLW B'1000' ;LETRA H A W FILA4 COLUMNA3
MOVWF TECPUL ;LETRA H A TECPUL
LEE12 BCF FIL4
BANCO1
COL1S
COL2S
COL3S
BANCO0
RETURN
;*********************************************SUBRUTINA LECTURA DE TECLADO*********************************************************
TECLADO
CALL RETARDO1
CALL RETARDO1
CALL RETARDO1
CALL RETARDO1
CLRF TECPUL ;BORRO TECPUL
CALL LEETEC ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO
MOVF TECPUL,W ;PASO EL VALOR DE TECPUL A W
MOVWF DIGI1 ;PASO W A DIGI1
CALL RETARDO1
CALL RETARDO1
CALL RETARDO1
CALL RETARDO1
CLRF TECPUL ;BORRO TECPUL
CALL LEETEC ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO
MOVF TECPUL,W
MOVWF DIGI2
CALL RETARDO1
CALL RETARDO1
CALL RETARDO1
CALL RETARDO1
CLRF TECPUL ;BORRO TECPUL
CALL LEETEC ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO
MOVF TECPUL,W ;MUEVO EL VALOR DE TECPUL A W
MOVWF DIGI3
CALL RETARDO1
CALL RETARDO1
CALL RETARDO1
CALL RETARDO1
CLRF TECPUL ;BORRO TECPUL
CALL LEETEC ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO
MOVF TECPUL,W ;MUEVO EL VALOR DE TECPUL A W
MOVWF DIGI4
RETURN
;*********************************************SUBRUTINA GRABACION DIGITO 1 (GD1)***********************************************
GD1 BSF STATUS,RP1
BCF STATUS,RP0 ;BANCO2
MOVLW 0X00 ;MUEVO A W LA DIRECCION DE MEMORI A GRABAR
MOVWF EEADR ;MUEVO LA DIRECION 0X01 A EEADR
MOVF DIGI1,W ;MUEVO DIGI1 A W
MOVWF EEDATA ;DIGI1 A EEDATA
BSF STATUS,RP0 ;BANCO3
BCF EECON1,EEPGD
BSF EECON1,WREN ;HABILITO ESCRITURA
BCF INTCON,GIE ;DESHABILITO TODAS LAS INTERUPCIONES
MOVLW H'55' ;REQUERIDO
MOVWF EECON2 ;REQUERIDO
MOVLW H'AA' ;REQUERIDO
MOVWF EECON2 ;REQUERIDO
BSF EECON1,WR ;DESHABILITO ESCRITURA
VERIF1 BTFSC EECON1,WR
GOTO VERIF1
BCF EECON1,WREN
BCF STATUS,RP1
BCF STATUS,RP0
;*********************************************SUBRUTINA GRABACION DIGITO 2 (GD2)***********************************************
BSF STATUS,RP1
BCF STATUS,RP0
MOVLW 0X01
MOVWF EEADR
MOVF DIGI2,W
MOVWF EEDATA
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,WREN
BCF INTCON,GIE
MOVLW H'55'
MOVWF EECON2
MOVLW H'AA'
MOVWF EECON2
BSF EECON1,WR
VERIF2 BTFSC EECON1,WR
GOTO VERIF2
BCF EECON1,WREN
BCF STATUS,RP1
BCF STATUS,RP0
;*********************************************SUBRUTINA GRABACION DIGITO 3 (GD3)***********************************************
BSF STATUS,RP1
BCF STATUS,RP0
MOVLW 0X02
MOVWF EEADR
MOVF DIGI3,W
MOVWF EEDATA
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,WREN
BCF INTCON,GIE
MOVLW H'55'
MOVWF EECON2
MOVLW H'AA'
MOVWF EECON2
BSF EECON1,WR
VERIF3 BTFSC EECON1,WR
GOTO VERIF3
BCF EECON1,WREN
BCF STATUS,RP1
BCF STATUS,RP0
;*********************************************SUBRUTINA GRABACION DIGITO 4 (GD4)***********************************************
BSF STATUS,RP1
BCF STATUS,RP0
MOVLW 0X03
MOVWF EEADR
MOVF DIGI4,W
MOVWF EEDATA
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,WREN
BCF INTCON,GIE
MOVLW H'55'
MOVWF EECON2
MOVLW H'AA'
MOVWF EECON2
BSF EECON1,WR
VERIF4 BTFSC EECON1,WR
GOTO VERIF4
BCF EECON1,WREN
BCF STATUS,RP1
BCF STATUS,RP0
RETURN
;*********************************************SUBRUTINA RECUPERACION DIGITO1 (RECUP1)******************************************
RECUP1 BSF STATUS,RP1
BCF STATUS,RP0
MOVLW 0X00
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
BCF STATUS,RP1
BCF STATUS,RP0
MOVWF DIGI1
RETURN
;*********************************************SUBRUTINA RECUPERACION DIGITO2 (RECUP2)******************************************
RECUP2 BSF STATUS,RP1
BCF STATUS,RP0
MOVLW 0X01
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
BCF STATUS,RP1
BCF STATUS,RP0
MOVWF DIGI2
RETURN
;*********************************************SUBRUTINA RECUPERACION DIGITO3 (RECUP3)******************************************
RECUP3 BSF STATUS,RP1
BCF STATUS,RP0
MOVLW 0X02
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
BCF STATUS,RP1
BCF STATUS,RP0
MOVWF DIGI3
RETURN
;*********************************************SUBRUTINA RECUPERACION DIGITO4 (RECUP4)******************************************
RECUP4 BSF STATUS,RP1
BCF STATUS,RP0
MOVLW 0X03
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
BCF STATUS,RP1
BCF STATUS,RP0
MOVWF DIGI4
RETURN
;*****************************************SUBRUTINA BIN A BCD 10 BIT***********************************************************
STAR CLRF HSD
CLRF VSD
CALL BINBCD
OUT BTFSC ADRESA,0
CALL PRIM
BTFSC ADRESA,1
CALL SEGU
RETURN
BINBCD MOVF ADRES,W
CLRF MSD
MOVWF LSD
GTENTH MOVLW 0X0A
SUBWF LSD,W
BTFSS STATUS,C
GOTO OVER
MOVWF LSD
INCF MSD,F
GOTO GTENTH
OVER
TENTH MOVLW 0X0A
SUBWF MSD,W
BTFSS STATUS,C
RETLW 0
MOVWF MSD
INCF VSD,F
GOTO TENTH
PRIM MOVF LSD,W
ADDLW 0X06
MOVWF LSD
CALL ADJDEC
MOVF MSD,W
ADDLW 0X05
MOVWF MSD
CALL ADJDEC
MOVF VSD,W
ADDLW 0X02
MOVWF VSD
RETURN
SEGU MOVF LSD,W
ADDLW 0X02
MOVWF LSD
CALL ADJDEC
MOVF MSD,W
ADDLW 0X01
MOVWF MSD
CALL ADJDEC
MOVF VSD,W
ADDLW 0X05
MOVWF VSD
CALL ADJDEC
RETURN
ADJDEC MOVLW 0X0A
SUBWF LSD,0
BTFSS STATUS,C
GOTO DEC
MOVLW 0X06
ADDWF LSD,1
MOVLW 0X0F
ANDWF LSD,1
INCF MSD,1
DEC MOVLW 0X0A
SUBWF MSD,0
BTFSS STATUS,C
GOTO CEN
MOVLW 0X06
ADDWF MSD,1
MOVLW 0X0F
ANDWF MSD,1
INCF VSD,1
CEN MOVLW 0X0A
SUBWF VSD,0
BTFSS STATUS,C
GOTO MIL
MOVLW 0X06
ADDWF VSD,1
MOVLW 0X0F
ANDWF VSD,1
INCF HSD,1
MIL RETURN
;*************************************SUBRUTINA LECTURA ENTRADA ANALOGICA A0***************************************************
MEDIR MOVLW B'10000001'
MOVWF ADCON0 ;SELECCIONO RA0
MOVLW .75 ;RETARDO NECESARIO ANTES DE LA CONVERSION
MOVWF REG5
MEDIR1 NOP
DECFSZ REG5,F
GOTO MEDIR1
BSF ADCON0,GO ;COMIENZA LA CONVERSION
NOP
MEDIR2 BTFSC ADCON0,GO ;¿ES EL FIN DE LA CONVERSION?
GOTO MEDIR2
MOVF ADRESH,W
MOVWF ADRESA
BANCO1
MOVF ADRESL,W
BANCO0
MOVWF ADRES
RETURN
END
Luego lo veo al codigo, realmente no hacia falta cambiar nada.
Con respecto al foro, por que sino se crean mensajes muy largos:
No cites mis respuestas a no ser que sea algo puntual, ejemplo una frase que quieras responder, abajo tenes el boton de responder y no crae una "cita" o quote.
Para poner el codigo cuando estas escribiendo hay un botoncito con el numeral # si haces click ahi dice algo asi (code)(/code) pero con corchetes [ y ], pones tu condigo entre medio de esos 2 code.. (code) Aca tu codigo (/code). Esto para la proxima ves que necesites poner el codigo.
Estoy trabajando para mejorarlo
EDIT ya lo vi:
Bueno parece que no me estas leyendo bien lo que pongo. Te dije que para cambiar lo minimo del programa deberias de agregar 3 lineas y modificar 4 valores en binario, y ya con eso funcionaba. No entiendo por que te complicaste tanto borrando bastante parte del codigo ( A pesar que es super extenso sin sentido alguno como ya dije ). El tener 2 codigos de muestreo hace que uno no llame a la tabla y ahi podia haber estado tu error. Es algo sin sentido repetir 2 veces el mismo codigo.Código: ASM
;***************************************************************************************************************************** ;ESTE PROGRAMA MANEJA UN TECLADO DE 4 FILAS Y TRES COLUMNAS MATRICIAL POR EL CUAL SE INGRESA UN VALOR Y LO MUESTRA EN CUATRO ;DISPLAYS DE 7 SEGMENTOS, TAMBIÉN MEDIANTE UN PULSADOR GRABA EL VALOR MOSTRADO EN LOS DISPLAY EN MEMORIA EPROM Y CON OTRO ;PULSADOR RECUPERA DICHO VALOR, LA PARTE DEL CONVERSOR A/D EN ESTE PROGRAMA NO FUNCIONA SOLAMENTE FIGURAN LAS SUBRUTINAS ;***************************************************************************************************************************** LIST P= 16F874A INCLUDE "P16F874A.INC" ;*****************************************************VARIABLES**************************************************************** REG1 EQU H'20' ;VARIABLE PARA SUBRUTINA DE RETARDO REG2 EQU H'21' ;VARIABLE PARA SUBRUTINA DE RETARDO DIGI1 EQU H'22' ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 1 DIGI2 EQU H'23' ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 2 DIGI3 EQU H'24' ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 3 DIGI4 EQU H'25' ;VARIABLE PARA ALMACENAR EL VALOR DE DIGITO 4 TECPUL EQU H'26' ;VARIABLE PARA ALMACENAR EL VALOR DE LA TECLA PULSADA REG3 EQU H'27' ;VARIABLE PARA SUBRUTINA DE RETARDO1 REG4 EQU H'28' ;VARIABLE PARA SUBRUTINA DE RETARDO1 REG5 EQU H'29' ;VARIABLE PARA SUBRUTINA DE RETARDO CONVERSOR A/D LSD EQU H'2A' ;VARIABLE PARA SUBRUTINA BINBCD MSD EQU H'2B' ;VARIABLE PARA SUBRUTINA BINBCD VSD EQU H'2C' ;VARIABLE PARA SUBRUTINA BINBCD HSD EQU H'2D' ;VARIABLE PARA SUBRUTINA BINBCD ADRESA EQU H'2E' ;VALOR ALTO DE LA CONVERSION=ADRESH ADRES EQU H'2F' ;VALOR BAJO DE LA CONVERSION=ADRESL ;*****************************************************CONSTANTES*************************************************************** VALOR1 EQU .74 ;VALORES PARA EL RETARDO VALOR2 EQU .2 ;VALORES PARA EL RETARDO VALOR3 EQU .150 ;VALORES PARA EL RETARDO1 VALOR4 EQU .4 ;VALORES PARA EL RETARDO1 ;*****************************************************DEFINICIONES************************************************************* #DEFINE BANCO0 BCF STATUS,RP0 #DEFINE BANCO1 BSF STATUS,RP0 ;***************************************************OTRAS DEFINICIONES******************************************************** #DEFINE TRD1 PORTD,7 ;DEFINO LA SALIDA DE TRD1 #DEFINE TRD2 PORTD,6 ;DEFINO LA SALIDA DE TRD2 #DEFINE TRD3 PORTD,5 ;DEFINO LA SALIDA DE TRD3 #DEFINE TRD4 PORTD,4 ;DEFINO LA SALIDA DE TRD4 #DEFINE LED1 PORTB,5 ;DEFINO LED PRUEBA #DEFINE GRABO PORTB,7 ;DEFINO PULSADOR CONVERSOR ANALOGICO DIGITAL #DEFINE LED2 PORTB,4 ;DEFINO LED PRUEBA #DEFINE RECU PORTB,6 ;DEFINO PULSADOR GRABAR #DEFINE COL1 PORTE,0 ;DEFINO COLUMNA TECLADO #DEFINE COL2 PORTE,1 ;DEFINO COLUMNA TECLADO #DEFINE COL3 PORTE,2 ;DEFINO COLUMNA TECLADO #DEFINE FIL1 PORTD,0 ;DEFINO TECLADO FILAS #DEFINE FIL2 PORTD,1 ;DEFINO TECLADO FILAS #DEFINE FIL3 PORTD,2 ;DEFINO TECLADO FILAS #DEFINE FIL4 PORTD,3 ;DEFINO TECLADO FILAS #DEFINE COL1E BSF TRISE,0 ;DEFINO COL1 COMO ENTRADA #DEFINE COL1S BCF TRISE,0 ;DEFINO COL1 COMO SALIDA #DEFINE COL2E BSF TRISE,1 ;DEFINO COL2 COMO ENTRADA #DEFINE COL2S BCF TRISE,1 ;DEFINO COL2 COMO SALIDA #DEFINE COL3E BSF TRISE,2 ;DEFINO COL3 COMO ENTRADA #DEFINE COL3S BCF TRISE,2 ;DEFINO COL3 COMO SALIDA ;********************************************************PROGRAMA************************************************************* ORG H'0000' GOTO INICIO ;IR AL INICIO DEL PROGRAMA ORG H'0005' ;ATENCION A LAS INTERUPCIONES RETFIE ;*********************************SUBRUTINA TABLA CONVERSION BCD A 7 SEGMENTOS************************************************* TABLA ADDWF PCL,F ; GFBADEPC RETLW B'01111101' ;0 RETLW B'00100001' ;1 RETLW B'10111100' ;2 RETLW B'10111001' ;3 RETLW B'11100001' ;4 RETLW B'11011001' ;5 RETLW B'11011101' ;6 RETLW B'00110001' ;7 RETLW B'11111101' ;8 RETLW B'11110001' ;9 ;Lo del teclado RETLW B'11110100' ;10 Caso que entre a LEE9 (Aca tenes que modificar los valores de binario segun corresponda ) RETLW B'01111101' ;11 Caso que entre a LEE10 RETLW B'11100101' ;12 Caso que entre a LEE11 ;************************************************INICIALIZACION**************************************************************** INIPIC BANCO1 MOVLW B'10110100' MOVWF ADCON1 ;CONFIGURO A0, A1 Y A3 COMO ENTRADAS ANALOGICAS MOVLW B'001011' MOVWF TRISA ;CONFIGURO EL PUERTO A MOVLW B'11000000' MOVWF TRISB ;CONFIGURO EL PUERTO B COMO SALIDA (B7 Y B6 ENTRADAS) MOVLW B'00000000' MOVWF TRISC ;CONFIGURO EL PUERTO C COMO SALIDA MOVLW B'00000000' MOVWF TRISD ;CONFIGURO EL PUERTO D COMO SALIDA MOVLW B'000' MOVWF TRISE ;CONFIGURO EL PUERTO E COMO SALIDA MOVLW B'00000000' MOVWF INTCON ;DESHABILITO LAS INTERRUPCIONES BANCO0 CLRF PORTA CLRF PORTB CLRF PORTC CLRF PORTD CLRF PORTE RETURN ;**************************************************PROGRAMA PRINCIPAL********************************************************** INICIO CALL INIPIC ;LLAMO A LA RUTINA DE INICIALIZACION CALL DISPLAY1 ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY1 CALL DISPLAY2 ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY2 CALL DISPLAY3 ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY3 CALL DISPLAY4 ;LLAMO A LA SUBRUTINA DE LECTURA DE DISPLAY4 HHH CALL MUESTRO GOTO HHH ;*********************************************SUBRUTINA DE RETARDO************************************************************* RETARDO MOVLW VALOR1 MOVWF REG1 MOVLW VALOR2 MOVWF REG2 LOOP DECFSZ REG1,F GOTO LOOP DECFSZ REG2,F GOTO LOOP RETURN ;*********************************************SUBRUTINA DE RETARDO1************************************************************* RETARDO1 MOVLW VALOR3 MOVWF REG3 MOVLW VALOR4 MOVWF REG4 LOOP1 DECFSZ REG1,F GOTO LOOP1 DECFSZ REG2,F GOTO LOOP RETURN ;***********************************************SUBRUTINA DE MUESTREO********************************************************* MUESTRO H MOVF DIGI1,W ;MUEVO EL VALOR DE DIGI1 A W CALL TABLA MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO BSF TRD1 BCF TRD2 BCF TRD3 BCF TRD4 CALL RETARDO MOVF DIGI2,W ;MUEVO EL VALOR DE DIGI2 A W CALL TABLA MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO BCF TRD1 BSF TRD2 BCF TRD3 BCF TRD4 CALL RETARDO MOVF DIGI3,W ;MUEVO EL VALOR DE DIGI3 A W CALL TABLA MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO BCF TRD1 BCF TRD2 BSF TRD3 BCF TRD4 CALL RETARDO MOVF DIGI4,W ;MUEVO EL VALOR DE DIGI4 A W CALL TABLA MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO BCF TRD1 BCF TRD2 BCF TRD3 BSF TRD4 CALL RETARDO BTFSC GRABO GOTO AAA CALL GD1 BSF LED1 AAA BTFSC RECU GOTO H GOTO RECUPE RETURN ;*********************************************RECUPERACION DE VALORES*********************************************************** RECUPE CLRF DIGI1 CLRF DIGI2 CLRF DIGI3 CLRF DIGI4 CALL RECUP1 CALL RECUP2 CALL RECUP3 CALL RECUP4 CALL MUESTRO1 ;***********************************************SUBRUTINA DE MUESTREO VALOR RECUPERADO********************************************* MUESTRO1 X2 MOVF DIGI1,W ;MUEVO EL VALOR DE DIGI1 A W CALL TABLA MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO BSF TRD1 BCF TRD2 BCF TRD3 BCF TRD4 CALL RETARDO MOVF DIGI2,W ;MUEVO EL VALOR DE DIGI2 A W CALL TABLA MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO BCF TRD1 BSF TRD2 BCF TRD3 BCF TRD4 CALL RETARDO MOVF DIGI3,W ;MUEVO EL VALOR DE DIGI3 A W CALL TABLA MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO BCF TRD1 BCF TRD2 BSF TRD3 BCF TRD4 CALL RETARDO MOVF DIGI4,W ;MUEVO EL VALOR DE DIGI4 A W CALL TABLA MOVWF PORTC ;MUEVO W AL PORT D PARA VISUALIZARLO BCF TRD1 BCF TRD2 BCF TRD3 BSF TRD4 CALL RETARDO GOTO X2 RETURN ;******************************************SUBRUTINA DE LECTURA DE TECLADO ***************************************************** LEETEC BANCO1 ;PASO AL BANCO CERO PARA CONFIGURAR COL1E ;CONFIGURO COL1 COMO ENTRADA COL2E ;CONFIGURO COL2 COMO ENTRADA COL3E ;CONFIGURO COL3 COMO ENTRADA BANCO0 ;PASAO AL BANCO CERO CLRF TECPUL ;LIMPIO LA VARIABLE TECPUL BSF FIL1 ;PONGO A 1 FIL1 BCF FIL2 ;PONGO A 0 FIL2 BCF FIL3 ;PONGO A 0 FIL3 BCF FIL4 ;PONGO A 0 FIL4 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL1 ;COL1=0? GOTO LEE1 ;NO ES 0 VOY A LEE1 MOVLW B'0001' ;Nº 1 A W FILA 1 COLUMNA1 MOVWF TECPUL ;MUEVO Nº1 A TECPUL LEE1 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL2 ;COL2=0? GOTO LEE2 ;NO ES 0 VOY A LEE2 MOVLW B'0010' ;Nº 2 A W FILA1 COLUMNA2 MOVWF TECPUL ;MUEVO Nº2 A TECPUL LEE2 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL3 ;COL3=0? GOTO LEE3 ;NO ES CERO VOY A LEE3 MOVLW B'0011' ;Nº 3 A W FILA1 COLUMNA 3 MOVWF TECPUL ;MUEVO Nº 3 A TECPUL LEE3 BCF FIL1 BSF FIL2 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL1 ;COL1=0? GOTO LEE4 ;NO ES 0 VOY A LEE4 MOVLW B'0100' ;Nº 4 A W FILA2 COLUMNA1 MOVWF TECPUL ;MUEVO Nº 4 A TECPUL LEE4 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL2 ;COL2=0? GOTO LEE5 ;NO ES 0 VOY A LEE5 MOVLW B'0101' ;Nº 5 A W FILA2 COLUMNA2 MOVWF TECPUL ;MUEVO Nº 5 A TECPUL LEE5 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL3 ;COL3=0? GOTO LEE6 ;NO ES 0 VOY A LEE6 MOVLW B'0110' ;Nº 6 A W FILA2 COLUMNA3 MOVWF TECPUL ;MUEVO Nº 6 A TECPUL LEE6 BCF FIL2 BSF FIL3 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL1 ;COL1=0? GOTO LEE7 ;NO ES 0 VOY A LEE7 MOVLW B'0111' ;Nº 7 A W FILA3 COLUMNA1 MOVWF TECPUL ;MUEVO Nº 7 A TECPUL LEE7 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL2 ;COL2=0? GOTO LEE8 ;NO ES 0 VOY A LEE8 MOVLW B'1000' ;Nº 8 A W FILA3 COLUMNA2 MOVWF TECPUL ;MUEVO Nº 8 A TECPUL LEE8 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL3 ;COL3=0? GOTO LEE9 ;NO ES 0 VOY A LEE9 MOVLW B'1001' ;Nº 9 A W FILA3 COLUMNA3 MOVWF TECPUL ;MUEVO Nº 9 A TECPUL LEE9 BCF FIL3 BSF FIL4 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL1 ;COL2=0? GOTO LEE10 ;NO ES 0 VOY A LEE10 MOVLW B'1010' ;LETRA P A W FILA4 COLUMNA1 MOVWF TECPUL ;MUEVO P A TECPUL LEE10 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL2 ;COL2=0? GOTO LEE11 ;NO ES 0 VOY A LEE11 MOVLW B'1011' ;Nº 0 A W FILA4 COLUMNA2 MOVWF TECPUL ;Nº 0 A TECPUL LEE11 CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO CALL RETARDO BTFSC COL3 ;COL3=0? GOTO LEE12 ;NO ES 0 VOY A LEE12 MOVLW B'1100' ;LETRA H A W FILA4 COLUMNA3 MOVWF TECPUL ;LETRA H A TECPUL LEE12 BCF FIL4 BANCO1 COL1S COL2S COL3S BANCO0 RETURN ;*********************************************SUBRUTINA PARA DISPLAY 1********************************************************* DISPLAY1 CALL RETARDO1 CLRF TECPUL ;BORRO TECPUL CALL LEETEC ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO MOVF TECPUL,W ;MUEVO EL VALOR DE TECPUL A W XORLW .0 ;VERIFICO SI TECPUL ES CERO BTFSC STATUS,Z ;VERIFICO SI Z=0 GOTO DISPLAY1 ;SI NO ES CERO VUELVO A DISPLAY1 MOVF TECPUL,W ;PASO EL VALOR DE TECPUL A W MOVWF DIGI1 ;PASO W A DIGI1 RETURN ;*********************************************SUBRUTINA PARA DISPLAY 2********************************************************* DISPLAY2 CALL RETARDO1 CLRF TECPUL ;BORRO TECPUL CALL LEETEC ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO MOVF TECPUL,W ;MUEVO EL VALOR DE TECPUL A W XORLW .0 ;VERIFICO SI TECPUL ES CERO BTFSC STATUS,Z ;VERIFICO SI Z=0 GOTO DISPLAY2 ;SI NO ES CERO VUELVO A DISPLAY1 MOVF TECPUL,W ;PASO EL VALOR DE TECPUL A W MOVWF DIGI2 ;PASO W A DIGI2 RETURN ;*********************************************SUBRUTINA PARA DISPLAY 3********************************************************* DISPLAY3 CALL RETARDO1 CLRF TECPUL ;BORRO TECPUL CALL LEETEC ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO MOVF TECPUL,W ;MUEVO EL VALOR DE TECPUL A W XORLW .0 ;VERIFICO SI TECPUL ES CERO BTFSC STATUS,Z ;VERIFICO SI Z=0 GOTO DISPLAY3 ;SI NO ES CERO VUELVO A DISPLAY1 MOVF TECPUL,W ;PASO EL VALOR DE TECPUL A W MOVWF DIGI3 ;PASO W A DIGI3 RETURN ;*********************************************SUBRUTINA PARA DISPLAY 4********************************************************* DISPLAY4 CALL RETARDO1 CLRF TECPUL ;BORRO TECPUL CALL LEETEC ;LLAMO A LA SUBRUTINA DE LECTURA DE TECLADO MOVF TECPUL,W ;MUEVO EL VALOR DE TECPUL A W XORLW .0 ;VERIFICO SI TECPUL ES CERO BTFSC STATUS,Z ;VERIFICO SI Z=0 GOTO DISPLAY4 ;SI NO ES CERO VUELVO A DISPLAY1 MOVF TECPUL,W ;PASO EL VALOR DE TECPUL A W MOVWF DIGI4 ;PASO W A DIGI4 RETURN ;*********************************************SUBRUTINA GRABACION DIGITO 1 (GD1)*********************************************** GD1 BSF STATUS,RP1 BCF STATUS,RP0 ;BANCO2 MOVLW 0X00 ;MUEVO A W LA DIRECCION DE MEMORI A GRABAR MOVWF EEADR ;MUEVO LA DIRECION 0X01 A EEADR MOVF DIGI1,W ;MUEVO DIGI1 A W MOVWF EEDATA ;DIGI1 A EEDATA BSF STATUS,RP0 ;BANCO3 BCF EECON1,EEPGD BSF EECON1,WREN ;HABILITO ESCRITURA BCF INTCON,GIE ;DESHABILITO TODAS LAS INTERUPCIONES MOVLW H'55' ;REQUERIDO MOVWF EECON2 ;REQUERIDO MOVLW H'AA' ;REQUERIDO MOVWF EECON2 ;REQUERIDO BSF EECON1,WR ;DESHABILITO ESCRITURA VERIF1 BTFSC EECON1,WR GOTO VERIF1 BCF EECON1,WREN BCF STATUS,RP1 BCF STATUS,RP0 ;*********************************************SUBRUTINA GRABACION DIGITO 2 (GD2)*********************************************** BSF STATUS,RP1 BCF STATUS,RP0 MOVLW 0X01 MOVWF EEADR MOVF DIGI2,W MOVWF EEDATA BSF STATUS,RP0 BCF EECON1,EEPGD BSF EECON1,WREN BCF INTCON,GIE MOVLW H'55' MOVWF EECON2 MOVLW H'AA' MOVWF EECON2 BSF EECON1,WR VERIF2 BTFSC EECON1,WR GOTO VERIF2 BCF EECON1,WREN BCF STATUS,RP1 BCF STATUS,RP0 ;*********************************************SUBRUTINA GRABACION DIGITO 3 (GD3)*********************************************** BSF STATUS,RP1 BCF STATUS,RP0 MOVLW 0X02 MOVWF EEADR MOVF DIGI3,W MOVWF EEDATA BSF STATUS,RP0 BCF EECON1,EEPGD BSF EECON1,WREN BCF INTCON,GIE MOVLW H'55' MOVWF EECON2 MOVLW H'AA' MOVWF EECON2 BSF EECON1,WR VERIF3 BTFSC EECON1,WR GOTO VERIF3 BCF EECON1,WREN BCF STATUS,RP1 BCF STATUS,RP0 ;*********************************************SUBRUTINA GRABACION DIGITO 4 (GD4)*********************************************** BSF STATUS,RP1 BCF STATUS,RP0 MOVLW 0X03 MOVWF EEADR MOVF DIGI4,W MOVWF EEDATA BSF STATUS,RP0 BCF EECON1,EEPGD BSF EECON1,WREN BCF INTCON,GIE MOVLW H'55' MOVWF EECON2 MOVLW H'AA' MOVWF EECON2 BSF EECON1,WR VERIF4 BTFSC EECON1,WR GOTO VERIF4 BCF EECON1,WREN BCF STATUS,RP1 BCF STATUS,RP0 RETURN ;*********************************************SUBRUTINA RECUPERACION DIGITO1 (RECUP1)****************************************** RECUP1 BSF STATUS,RP1 BCF STATUS,RP0 MOVLW 0X00 MOVWF EEADR BSF STATUS,RP0 BCF EECON1,EEPGD BSF EECON1,RD BCF STATUS,RP0 MOVF EEDATA,W BCF STATUS,RP1 BCF STATUS,RP0 MOVWF DIGI1 RETURN ;*********************************************SUBRUTINA RECUPERACION DIGITO2 (RECUP2)****************************************** RECUP2 BSF STATUS,RP1 BCF STATUS,RP0 MOVLW 0X01 MOVWF EEADR BSF STATUS,RP0 BCF EECON1,EEPGD BSF EECON1,RD BCF STATUS,RP0 MOVF EEDATA,W BCF STATUS,RP1 BCF STATUS,RP0 MOVWF DIGI2 RETURN ;*********************************************SUBRUTINA RECUPERACION DIGITO3 (RECUP3)****************************************** RECUP3 BSF STATUS,RP1 BCF STATUS,RP0 MOVLW 0X02 MOVWF EEADR BSF STATUS,RP0 BCF EECON1,EEPGD BSF EECON1,RD BCF STATUS,RP0 MOVF EEDATA,W BCF STATUS,RP1 BCF STATUS,RP0 MOVWF DIGI3 RETURN ;*********************************************SUBRUTINA RECUPERACION DIGITO4 (RECUP4)****************************************** RECUP4 BSF STATUS,RP1 BCF STATUS,RP0 MOVLW 0X03 MOVWF EEADR BSF STATUS,RP0 BCF EECON1,EEPGD BSF EECON1,RD BCF STATUS,RP0 MOVF EEDATA,W BCF STATUS,RP1 BCF STATUS,RP0 MOVWF DIGI4 RETURN ;*****************************************SUBRUTINA BIN A BCD 10 BIT*********************************************************** STAR CLRF HSD CLRF VSD CALL BINBCD OUT BTFSC ADRESA,0 CALL PRIM BTFSC ADRESA,1 CALL SEGU RETURN BINBCD MOVF ADRES,W CLRF MSD MOVWF LSD GTENTH MOVLW 0X0A SUBWF LSD,W BTFSS STATUS,C GOTO OVER MOVWF LSD INCF MSD,F GOTO GTENTH OVER TENTH MOVLW 0X0A SUBWF MSD,W BTFSS STATUS,C RETLW 0 MOVWF MSD INCF VSD,F GOTO TENTH PRIM MOVF LSD,W ADDLW 0X06 MOVWF LSD CALL ADJDEC MOVF MSD,W ADDLW 0X05 MOVWF MSD CALL ADJDEC MOVF VSD,W ADDLW 0X02 MOVWF VSD RETURN SEGU MOVF LSD,W ADDLW 0X02 MOVWF LSD CALL ADJDEC MOVF MSD,W ADDLW 0X01 MOVWF MSD CALL ADJDEC MOVF VSD,W ADDLW 0X05 MOVWF VSD CALL ADJDEC RETURN ADJDEC MOVLW 0X0A SUBWF LSD,0 BTFSS STATUS,C GOTO DEC MOVLW 0X06 ADDWF LSD,1 MOVLW 0X0F ANDWF LSD,1 INCF MSD,1 DEC MOVLW 0X0A SUBWF MSD,0 BTFSS STATUS,C GOTO CEN MOVLW 0X06 ADDWF MSD,1 MOVLW 0X0F ANDWF MSD,1 INCF VSD,1 CEN MOVLW 0X0A SUBWF VSD,0 BTFSS STATUS,C GOTO MIL MOVLW 0X06 ADDWF VSD,1 MOVLW 0X0F ANDWF VSD,1 INCF HSD,1 MIL RETURN ;*************************************SUBRUTINA LECTURA ENTRADA ANALOGICA A0*************************************************** MEDIR MOVLW B'10000001' MOVWF ADCON0 ;SELECCIONO RA0 MOVLW .75 ;RETARDO NECESARIO ANTES DE LA CONVERSION MOVWF REG5 MEDIR1 NOP DECFSZ REG5,F GOTO MEDIR1 BSF ADCON0,GO ;COMIENZA LA CONVERSION NOP MEDIR2 BTFSC ADCON0,GO ;¿ES EL FIN DE LA CONVERSION? GOTO MEDIR2 MOVF ADRESH,W MOVWF ADRESA BANCO1 MOVF ADRESL,W BANCO0 MOVWF ADRES RETURN END
Con respecto al programa te vuelvo a repetir estas haciendo algo de 5000 lineas cuando con 500 lo haces. Se vuelve mas legible y simple.
Actualmente creo que estoy mas que seguro que ya no recordas que hace exactamente cada parte de tu codigo. Ni como se maneja, ni que variables de entrada tiene y cuales variables salen de cada subrutina.
Lo peor aun es que noto un error que nombre en unos de mis primeras respuestas, lo cual lo hace aun mas ilogico que todo esto funcione.
De todas formas intente usar tu programa por que asi te entendes vos. Vos veras como mejorarlo en su debido tiempo.
PD: Para las teclas que estan al lado del 0 , directamente le puse que produzcan la misma salida que tenia tu PRIMER programa display. Si deseas cambiarlo, solo cambias los valores de la tabla. PERO NO DEL 8, sino del 10 y 12!!!! ( el 11 corresponde al boton "0" )