Hola amigos, estoy entrando en el mundo del pic, tengo un proyecto el cual no he podido resolver, consiste en activar por medio de un teclado matricial, un generador de notas musicales con el pic 16f84a; en proyectos pasados he utilizado un teclado matricial para visualizar números binarios en un siete segmentos con el 16f84a; también hemos trabajado con un diseño que nos permite, por medio de una frecuencia un tono musical.
Ahora mi proyecto es combinar los dos proyectos anteriores, pero no se como, asi que solicito una mano.
Este es mi asm para obtener una nota musical
PROGRAMA.
#INCLUDE <P16F84A.INC>
LIST P=16F84A
Tecla EQU 0X0C
BSF STATUS,RP0
MOVLW B'11110000'
MOVWF TRISB
MOVLW B'00010000'
MOVWF TRISA
BCF STATUS,RP0
MOVLW B'00000000'
MOVWF PORTA
INICIO CLRF Tecla
MOVLW B'00001110'
MOVWF PORTB
Cheq_Col MOVF PORTB,W
XORLW B'11111111'
BTFSC STATUS,Z
GOTO INICIO
BTFSS PORTB,4
GOTO antirebotes
INCF Tecla,F
BTFSS PORTB,5
GOTO antirebotes
INCF Tecla,F
BTFSS PORTB,6
GOTO antirebotes
INCF Tecla,F
BTFSS PORTB,7
GOTO antirebotes
INCF Tecla,F
Ult_Tecla
MOVLW .17
SUBWF Tecla,W
BTFSC STATUS,Z
CALL NTeclas
BSF STATUS,C
RLF PORTB,F
BTFSC STATUS,DC
GOTO Cheq_Col
GOTO INICIO
NTeclas CLRF Tecla
RETURN
antirebotes
Espera1 BTFSS PORTB,4
GOTO Espera1
Espera2 BTFSS PORTB,5
GOTO Espera2
Espera3 BTFSS PORTB,6
GOTO Espera3
Espera4 BTFSS PORTB,7
GOTO Espera4
MOVF Tecla,W
CALL Principal
MOVWF PORTA
GOTO Cheq_Col
MOVWF OPTION_REG ; PRESCALER DE 2 ASIGNADO AL TMR0
BCF STATUS,RP0 ; Acceso al Banco 0.
Principal
BSF PORTA,0 ; La salida pasa a nivel alto
CALL Timer0_500us ; durante este tiempo.
BCF PORTA,0 ; La salida pasa a nivel bajo
CALL Timer0_500us ; durante este tiempo.
GOTO Principal
; Subrutina "Timer0_500us" -------------------------------------------------------
; Como el PIC trabaja a una frecuencia de 4 MHz, el TMR0 evoluciona cada microsegundo.
; Para conseguir un retardo de 500 µs con un prescaler de 2 el TMR0 debe contar 250
; impulsos. Efectivamente: 1 µs x 250 x 2 = 500 µs.
TMR0_Carga500us EQU d'256'-d'250'
Timer0_500us
movlw TMR0_Carga500us ; Carga el Timer 0.
movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.
Timer0_Rebosamiento
btfss INTCON,T0IF ; ¿Se ha producido desbordamiento?
goto Timer0_Rebosamiento ; Todavía no. Repite.
return
END
en este asm solo intento sacar una nota musical para poder guiarme, adjunto el hardware en el cual deseo simular mi proyecto; agradezco cual quier aporte, muchas gracias!!!!!!!!