Sunteți pe pagina 1din 11

PROCESSOR 16F877 INCLUDE <p16f877.

inc> __CONFIG 0x3F71 resp_W EQU 0x75 resp_STATUS EQU 0x76 resp_PCLATH EQU 0x77 resp_CONTADOR EQU 0x78 OCTAVA EQU 0x20 NOTA EQU 0x21 TIPO EQU 0x22 TECLA EQU 0x30 CONTADOR EQU 0x31 ORG 0x0000 GOTO inicio ORG 0x0004 MOVWF resp_W ; ***************************** SWAPF STATUS,W ; * * MOVWF resp_STATUS ; * * CLRF STATUS ; * * MOVF PCLATH,W ; * * MOVWF resp_PCLATH ; * * CLRF PCLATH ; * * MOVF CONTADOR,W ; * Rescate * MOVWF resp_CONTADOR ; * * MOVF 0x70,W ; * * MOVWF 0x7A ; * * MOVF 0x71,W ; * * MOVWF 0x7B ; * * MOVF 0x72,W ; * * MOVWF 0x7C ; ***************************** CALL T30M CLRF TECLA MOVLW 0x01 MOVWF PORTC BTFSC PORTB,4 ; ***************************** GOTO $+3 ; * * BSF TECLA,0 ; * * GOTO fila ; * * BTFSC PORTB,5 ; * * GOTO $+3 ; * * BSF TECLA,1 ; * Revision de columna * GOTO fila ; * * BTFSC PORTB,6 ; * * GOTO $+3 ; * * BSF TECLA,2 ; * * GOTO fila ; * * BSF TECLA,3 ; *****************************

fila: MOVLW 0x86 MOVWF FSR SWAPF INDF,F CLRF PORTB MOVLW 0x81 ; ********************************* MOVWF FSR ; * Resistencias de elevacion * BCF INDF,7 ; ********************************* BTFSC PORTB,0 ; ***************************** GOTO $+3 ; * * BSF TECLA,4 ; * * GOTO tarea ; * * BTFSC PORTB,1 ; * * GOTO $+3 ; * * BSF TECLA,5 ; * Revision de renglon * GOTO tarea ; * * BTFSC PORTB,2 ; * * GOTO $+3 ; * * BSF TECLA,6 ; * * GOTO tarea ; * * BSF TECLA,7 ; ***************************** ; La seccin de "tarea" lleva a cabo la tarea adecuada para cada tecla tarea: MOVLW 0x11 SUBWF TECLA,W BTFSS STATUS,Z GOTO $+4 MOVLW 0x03 MOVWF OCTAVA GOTO fin MOVLW 0x12 SUBWF TECLA,W BTFSS STATUS,Z GOTO $+4 MOVLW 0x02 MOVWF OCTAVA GOTO fin MOVLW 0x14 SUBWF TECLA,W BTFSS STATUS,Z GOTO $+4 MOVLW 0x01 MOVWF OCTAVA GOTO fin MOVLW 0x18 SUBWF TECLA,W BTFSS STATUS,Z

GOTO $+4 CLRW MOVWF OCTAVA GOTO fin MOVLW 0x21 SUBWF TECLA,W BTFSC STATUS,Z CALL LASOST MOVLW 0x22 SUBWF TECLA,W BTFSC STATUS,Z CALL SOL MOVLW 0x24 SUBWF TECLA,W BTFSC STATUS,Z CALL MI MOVLW 0x28 SUBWF TECLA,W BTFSC STATUS,Z CALL DO MOVLW 0x41 SUBWF TECLA,W BTFSC STATUS,Z CALL SI MOVLW 0x42 SUBWF TECLA,W BTFSC STATUS,Z CALL FASOST MOVLW 0x44 SUBWF TECLA,W BTFSC STATUS,Z CALL RESOST MOVLW 0x48 SUBWF TECLA,W BTFSC STATUS,Z CALL DOSOST MOVLW 0x81 SUBWF TECLA,W BTFSC STATUS,Z CALL LA MOVLW 0x82 SUBWF TECLA,W BTFSC STATUS,Z CALL SOLSOST MOVLW 0x84 SUBWF TECLA,W

BTFSC STATUS,Z CALL FA MOVLW 0x88 SUBWF TECLA,W BTFSC STATUS,Z CALL RE fin: MOVF OCTAVA,W CALL segoctava MOVWF PORTD MOVF PORTB,W XORLW 0xF0 MOVWF 0x40 INCFSZ 0x40,W GOTO $-4 CALL T30M CALL config_B MOVF PORTB,F BCF INTCON,RBIF ; Bajar bandera de interrupcion MOVF 0x7C,W ; ***************************** MOVWF 0x72 ; * * MOVF 0x7B,W ; * * MOVWF 0x71 ; * * MOVF 0x7A,W ; * * MOVWF 0x70 ; * * MOVF resp_CONTADOR,W ; * Recuperacion * MOVWF CONTADOR ; * * MOVF resp_PCLATH,W ; * * MOVWF PCLATH ; * * SWAPF resp_STATUS,W ; * * MOVWF STATUS ; * * SWAPF resp_W,F ; * * SWAPF resp_W,W ; ***************************** RETFIE inicio: MOVLW 0x02 MOVWF OCTAVA CLRF NOTA CLRF TIPO CLRF 0x50 BSF STATUS,RP0 BCF OPTION_REG,5 BCF OPTION_REG,3 CLRF TRISB MOVLW 0xF8 MOVWF TRISC ; Puerto C, C.0 -> texto, C.1 -> texto, C.2 -> sonido CLRF TRISD ; Puerto D, Displays BCF STATUS,RP0

CLRF PORTB CALL config_B CLRF PORTC CLRF PORTD MOVF PORTB,F ; Instruccion necesaria para bajar bandera de interrupcion BCF INTCON,RBIF BSF INTCON,RBIE BSF INTCON,GIE ; La seccion "principal" lleva a cabo un conteo de 0 a F mediante un display ; y muestra la escala musical activada para el teclado. principal: CLRF CONTADOR CALL SRT_comp MOVF OCTAVA,W CALL segoctava MOVWF PORTD MOVLW 0x01 MOVWF PORTC CALL SRT MOVF 0x50,W CALL sieteseg MOVWF PORTD RLF PORTC,F CALL SRT INCF CONTADOR,F MOVLW 0x64 SUBWF CONTADOR,W BTFSS STATUS,Z GOTO principal+2 INCF 0x50,F MOVLW 0x10 SUBWF 0x50,W BTFSS STATUS,Z GOTO principal CLRF 0x50 GOTO principal segoctava: ADDWF PCL,F RETLW 0X6D ; 2 en display de 7 segmentos RETLW 0X79 ; 3 en display de 7 segmentos RETLW 0X33 ; 4 en display de 7 segmentos RETLW 0X5B ; 5 en display de 7 segmentos segnota: ADDWF PCL,F RETLW 0X77 ; A en display de 7 segmentos RETLW 0X7F ; B en display de 7 segmentos RETLW 0X4E ; C en display de 7 segmentos

RETLW 0X7E ; D en display de 7 segmentos RETLW 0X4F ; E en display de 7 segmentos RETLW 0X47 ; F en display de 7 segmentos RETLW 0X5F ; G en display de 7 segmentos segtipo: ADDWF PCL,F RETLW 0X00 ; Nada en display de 7 segmentos RETLW 0X5B ; S en display de 7 segmentos sieteseg: ADDWF PCL,F RETLW 0X7E ; 0 en display de 7 segmentos RETLW 0X30 ; 1 en display de 7 segmentos RETLW 0X6D ; 2 en display de 7 segmentos RETLW 0X79 ; 3 en display de 7 segmentos RETLW 0X33 ; 4 en display de 7 segmentos RETLW 0X5B ; 5 en display de 7 segmentos RETLW 0X5F ; 6 en display de 7 segmentos RETLW 0X70 ; 7 en display de 7 segmentos RETLW 0X7F ; 8 en display de 7 segmentos RETLW 0X7B ; 9 en display de 7 segmentos RETLW 0X77 ; A en display de 7 segmentos RETLW 0X7F ; B en display de 7 segmentos RETLW 0X4E ; C en display de 7 segmentos RETLW 0X7E ; D en display de 7 segmentos RETLW 0X4F ; E en display de 7 segmentos RETLW 0X47 ; F en display de 7 segmentos ; La subrutina "config_B" se encarga de configurar el puerto B ; de forma adecuada usar el teclado. config_B: MOVLW 0x86 MOVWF FSR MOVLW 0xF0 MOVWF INDF ; Puerto B -> Teclado MOVLW 0x81 ; ********************************* MOVWF FSR ; * Resistencias de elevacion * BCF INDF,7 ; ********************************* CLRF PORTB RETURN T30M: MOVLW 0xA3 MOVWF 0x70 MOVLW 0x1E MOVWF 0x72 T30M_C2: MOVF 0x72,W MOVWF 0x71 T30M_C1: NOP NOP NOP DECFSZ 0x71,1

GOTO T30M_C1 DECFSZ 0x70,1 GOTO T30M_C2 NOP RETURN comp: MOVF 0x71,W MOVWF 0x70 comp_C1: DECFSZ 0x70,1 GOTO comp_C1 NOP NOP NOP RETURN SRT: MOVLW 0x16 MOVWF 0x73 MOVLW 0x25 MOVWF 0x74 CALL tiempo RETURN SRT_comp: MOVLW 0x01 MOVWF 0x73 MOVLW 0x0C MOVWF 0x74 CALL tiempo NOP NOP NOP RETURN tiempo: MOVF 0x73,W ; RPG 0x73 contiene la variable 1 MOVWF 0x70 MOVF 0x74,W ; RPG 0x74 contiene la variable 2 MOVWF 0x72 tiempo_C1: MOVF 0x72,W MOVWF 0x71 tiempo_C2: NOP NOP NOP DECFSZ 0x71,1 GOTO tiempo_C2 DECFSZ 0x70,1 GOTO tiempo_C1 RETURN ; Las subrutinas con el nombre de cada Nota musical, asignan los valores a ; desplegar en los displays, adems del valor que tendr el TMR0 para cada ; frecuencia.

DO: MOVLW 0x02 MOVWF NOTA CLRW MOVWF TIPO MOVLW 0x1F MOVWF 0x72 CALL disp RETURN DOSOST: MOVLW 0x02 MOVWF NOTA MOVLW 0x01 MOVWF TIPO MOVLW 0x2D MOVWF 0x72 CALL disp RETURN RE: MOVLW 0x03 MOVWF NOTA CLRW MOVWF TIPO MOVLW 0x39 MOVWF 0x72 CALL disp RETURN RESOST: MOVLW 0x03 MOVWF NOTA MOVLW 0x01 MOVWF TIPO MOVLW 0x45 MOVWF 0x72 CALL disp RETURN MI: MOVLW 0x04 MOVWF NOTA CLRW MOVWF TIPO MOVLW 0x51 MOVWF 0x72 CALL disp RETURN FA: MOVLW 0x05 MOVWF NOTA CLRW MOVWF TIPO MOVLW 0x5B MOVWF 0x72 CALL disp

RETURN FASOST: MOVLW 0x05 MOVWF NOTA MOVLW 0x01 MOVWF TIPO MOVLW 0x65 MOVWF 0x72 CALL disp RETURN SOL: MOVLW 0x06 MOVWF NOTA CLRW MOVWF TIPO MOVLW 0x6F MOVWF 0x72 CALL disp. RETURN SOLSOST: MOVLW 0x06 MOVWF NOTA MOVLW 0x01 MOVWF TIPO MOVLW 0x77 MOVWF 0x72 CALL disp RETURN LA: CLRW MOVWF NOTA CLRW MOVWF TIPO MOVLW 0x80 MOVWF 0x72 CALL disp RETURN LASOST: CLRW MOVWF NOTA MOVLW 0x01 MOVWF TIPO MOVLW 0x88 MOVWF 0x72 CALL disp RETURN SI: MOVLW 0x01 MOVWF NOTA CLRW MOVWF TIPO MOVLW 0x90

MOVWF 0x72 CALL disp RETURN ; La subrutina "disp" se encargar de asignar el valor al preescaler segn el valor ; que tenga el registro OCTAVA. Adems de desplegar la nota que se est tocando, ; mediante los displays. Tambin saca la seal con la frecuencia adecuada para cada ; nota, mediante el uso del TMR0. disp: MOVLW 0x81 MOVWF FSR MOVLW 0x03 SUBWF OCTAVA,W BTFSS STATUS,Z GOTO $+6 BCF INDF,2 BCF INDF,1 BSF INDF,0 MOVLW 0x08 MOVWF 0x71 MOVLW 0x02 SUBWF OCTAVA,W BTFSS STATUS,Z GOTO $+6 BCF INDF,2 BSF INDF,1 BCF INDF,0 MOVLW 0x1A MOVWF 0x71 MOVLW 0x01 SUBWF OCTAVA,W BTFSS STATUS,Z GOTO $+6 BCF INDF,2 BSF INDF,1 BSF INDF,0 MOVLW 0x40 MOVWF 0x71 CLRW SUBWF OCTAVA,W BTFSS STATUS,Z GOTO $+6 BSF INDF,2 BCF INDF,1 BCF INDF,0

MOVLW 0x8A MOVWF 0x71 repetir: MOVF PORTB,W XORLW 0xF0 ; ***************************************** MOVWF 0x40 ; * Se revisa si ya se solt la tecla * INCFSZ 0x40,W ; ***************************************** GOTO $+2 RETURN CLRF PORTC MOVF NOTA,W CALL segnota MOVWF PORTD BSF PORTC,0 MOVF 0x72,W MOVWF TMR0 BCF INTCON,2 ; Comienza a contar BTFSS INTCON,2 GOTO $-1 CALL comp MOVF TIPO,W CALL segtipo MOVWF PORTD RLF PORTC,F BSF PORTC,2 MOVF 0x72,W MOVWF TMR0 BCF INTCON,2 BTFSS INTCON,2 GOTO $-1 CALL comp NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP GOTO repetir END

S-ar putea să vă placă și