TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Gabrielbas en 22 de Marzo de 2021, 22:25:04
-
Hola buenas, tengo una duda que se me presenta en una actividad de una clase, tengo que hacer un programa que use un teclado matricial que al presionar un boton muestre la informacion en dos displays de 7 segmentos, es decir, al presionar una
tecla debe mostrarse en el primer Display y a su vez activarse el Punto de este, indicando cual fue el último Display actualizado, al presionar otra tecla debe mostrarse la información en un segundo Displays así como su punto, en este caso debe apagar el punto
del display anterior. Al presionar otra tecla deba repetir los pasos anteriores. Agradeceria cualquier consejo o ayuda.. aqui adjunto mi codigo con un solo display:
LIST p=16f1787
#INCLUDE "p16f1787.inc"
AUX EQU 0x70
ORG 0
call Config_tec
call Config_tec
CICLO
call Pres_tec
movf WREG, W
btfss STATUS, Z
goto CICLO
call Deco_tec
movwf AUX
incf AUX,F
btfsc STATUS, Z
goto CICLO
call Deco_7seg
BANKSEL PORTD
movwf PORTD
GOTO CICLO
Config_tec
BANKSEL TRISB
movwf TRISB
bcf OPTION_REG,7
BANKSEL WPUB
movlw 0xFF
movwf WPUA
BANKSEL ANSELB
clrf ANSELB
clrfANSELB
return
Config_7seg
BANKSEL TRISD
movlw b'10000000'
movwf TRISF
BANKSEL ANSELD
clrf ANSELD
return
Pres_tec
BANKSEL PORTB
clrf PORTB
btfss PORTB,RB7
retlw 0x0
btfss PORTB,RB6
retlw 0x0
btfss PORTB,RB5
retlw 0x0
btfss PORTB,RB4
retlw 0x0
retlw 0xFF
Deco_tec
BANKSEL PORTB
movlw b'11110111'
movwf PORTB
btfss PORTB,RB7
retlw 0x1
btfss PORTB,RB6
retlw 0x4
btfss PORTB,RB5
retlw 0x7
btfss PORTB,RB4
retlw 0xA
movlw b'11111011'
movwf PORTB
btfss PORTB,RB7
retlw 0x2
btfss PORTB,RB6
retlw 0x5
btfss PORTB,RB5
retlw 0x8
btfss PORTB,RB4
retlw 0x0
movlw b'11111101'
movwf PORTB
btfss PORTB,RB7
retlw 0x3
btfss PORTB,RB6
retlw 0x6
btfss PORTB,RB5
retlw 0x9
btfss PORTB,RB4
retlw 0xB
retlw 0xFF
Deco_7seg
brw
retlw 0x3F
retlw 0x06
retlw 0x5B
retlw 0x4F
retlw 0x66
retlw 0x6D
retlw 0x7C
retlw 0x07
retlw 0x7F
retlw 0x67
retlw 0x63
retlw 0x5C
END
-
No tengo mucha idea de esto, pero dejo mi mensaje para no perder el hilo y ver la respuesta de los demás
-
Creo que te puede ayudar...
-
En que puertos estas conectando los displays? o necesitas multiplexarlo?
En si la parte del cambio la podes hacer de la siguiente forma:
Vas a necesitar un registro para mantener los datos de ambos displays SIN el punto.
Y un registro mas el cual nos va a indicar a cual display le toca. Podemos usar el bit 0 de este registro
- Lees el teclado como SIEMPRE
Al momento de mostrar:
- Pregunto por el registro que me indica cual le toca BTFFS AquienToca,0
-- Si esta en 0 supongamos que el primero hago un GOTO al primero
-- En el primero, busco el numero a escribir en el display en la tabla, y lo muestro
-- Le activo el punto con un BSF del display 1, y desactivo el punto del segundo con un BCF
-- Si estaba en 1 el bit 0 del registro AquienToca,
-- En el segundo, busco el numero a escribir en el display en la tabla, y lo muestro
-- Le activo el punto con un BSF del display 2, y desactivo el punto del display 1 con un BCF
Y eso seria TODO..
Si es necesario multiplexar, mejor encararlo de otra forma.
Y lo ideal seria usar interrupciones con el Timer para que la parte de "mostrar" se encargue solo el Timer. Y en tu programa solo dedicas 2 registros mas para guardar lo que queres mostrar. Que luego la interrupcion sola tomaria los valores y los mostraria.
Es decir necesitas hacer lo mismo que antes, pero en ves de escribir al puerto directo, lo haces en un registro. Luego la interrupcion manejaria los tiempos y la carga a los puertos.
-
Muchas gracias, ya pude resolver el ejercicio, me ayudaron bastante! ((:-))