list p=16f84 #include p16f84.inc indo equ 00h ;registro de direccionamiento indirecto fsr equ 04h ;registro selector de registros portb equ 06h trisb equ 86h trisa equ 85h status equ 03h ;--------------------------------------------------------------------------------- ;se definen las posiciones de memorias de los registros que contendrán los datos en la tabla dato0 equ 0ch dato1 equ 0dh dato2 equ 0eh dato3 equ 0fh dato4 equ 10h dato5 equ 11h dato6 equ 12h dato7 equ 13h dato8 equ 14h dato9 equ 15h tempo1 equ 16h tempo2 equ 17h tempo3 equ 18h ;------------------------------------------------------------------------------- ;registros de subrutina tono1 tf1 equ 19h tf2 equ 1ah ts1 equ 1bh ts2 equ 1ch ts3 equ 1dh ctperi equ 1eh frecu equ 1fh durac equ 20h canta equ 21h ;-------------------------------------------------------------------------------- ;los datos corresponden a display de 7 segmentos (de leds) ;se cargan los datos en la tabla, atención orden RB7-RB6-RB5-RB4-RB3-RB2-RB1-RB0 tabla ;ATENCION el bit 7 se pone en 1 para el caso de display sea ánodo común- sino debe ser 0 movlw b'10111111'; decimal 0 movwf dato0 movlw b'10000110' ;decimal 1 movwf dato1 movlw b'11011011' ;decimal 2 movwf dato2 movlw b'11001111' ;decimal 3 movwf dato3 movlw b'11100110' ;decimal 4 movwf dato4 movlw b'11101101' ;decimal 5 movwf dato5 movlw b'11111100' ;decimal 6 movwf dato6 movlw b'10000111' ;decimal 7 movwf dato7 movlw b'11111111' ;decimal 8 movwf dato8 movlw b'11100111' ;decimal 9 movwf dato9 ;comienza el programa principal ;-------------------------------------------------------------------------------- ;definición de la función de los puertos bsf status,5 ;se posiciona en banco1 clrf trisb ;define el portb como salida clrf trisa ;define el porta como salida bcf status,5; se posiciona en banco 0 ;-------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------- ;lectura de datos desde la tabla inicio movlw 0x0c movwf fsr ;carga en fsr la dirección del dato0 ciclo movlw d'9' movwf frecu movlw d'6' movwf durac call tono1 comf indo,0 ;complementa el contenido de indo y lo guarda en w ;esto se hace porque el display es de ánodo común ;si fuera de cátodo común hay que desactivar la instrucc anterior ;y activar la siguiente. ;movf indo,0 ;mueve el contenido de indo a w que es el apuntado por fsr o sea dato1 movwf portb ;carga w en portb call retardos incf fsr,1 ;incrementa fsr para direccionar al dato siguiente en la tabla movf fsr,0 xorlw 0x16; prueba si el contenido de fsr coincide con 16h, o sea leyo los datos de la tabla btfss status,2 ;prueba si el bit2 de status es 1 o sea bit Z , la operacion anterior dio cero goto ciclo call cancion1 call cancion1 call cancion1 goto inicio ;---------------------------------------------------------------------- ;termino la parte principal del programa, abajo están las subrutinas ;---------------------------------------------------------------------- ;subrutina retardos retardos clrf tempo1 clrf tempo2 clrf tempo3 retardo1 incf tempo1,1 retardo2 incf tempo2,1 retardo3 incf tempo3,1 btfss tempo3,6 ;para cambiar el tiempo goto retardo3 clrf tempo3 btfss tempo2,6 ;para cambiar el tiempo goto retardo2 clrf tempo2 btfss tempo1,6 ;para cambiar el tiempo goto retardo1 return ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ;subrutina tono1 -antes de llamarla se debe cargar el regist frecu (1 a 80) y el registro durac (de 0 a 255)- ;el valor de frecu 1 (agudos) a 80 (graves) determina la frecuencia. ;el valor de durac (hasta 255) determina la duración. NO es igual para todas las frecuencias tono1 clrf ts1 clrf ts2 clrf ts3 rt1 incf ts1,1 rt2 incf ts2,1 rt3 call periodo incf ts3,1 movf durac,0 xorwf ts3,0 ;lo guardo en w porque no me interesa guardarlo en otro lado btfss status,2 ;junto con la instrucción anterior ve si ts2 es igual a durac- goto rt3 clrf ts3 movf durac,0 xorwf ts2,0 ;lo guardo en w porque no me interesa guardarlo en otro lado btfss status,2 ;junto con la instrucción anterior ve si ts2 es igual a durac- goto rt2 clrf ts2 movf durac,0 xorwf ts1,0 ;lo guardo en w porque no me interesa guardarlo en otro lado btfss status,2 ;junto con la instrucción anterior ve si ts1 es igual a durac- goto rt1 return ;-------------------------------------------- periodo clrf ctperi bajo bcf portb,7 ;semiciclo bajo (cero) de la onda cuadrada. Esta intrucc selec salida sonora. call semiciclo ;determina la duración de este semiciclo incf ctperi,1 movf frecu,0 xorwf ctperi,0 ;lo guardo en w porque no me interesa guardarlo en ctperi btfss status,2 goto bajo clrf ctperi alto bsf portb,7 ;semiciclo alto (uno) de la onda cuadrada. Esta intrucc selec salida sonora. call semiciclo incf ctperi,1 movf frecu,0 xorwf ctperi,0 ;lo guardo en w porque no me interesa guardarlo en ctperi btfss status,2 goto alto return ;--------------------------------------------- ;--------------------------------------------- semiciclo clrf tf1 clrf tf2 retf1 incf tf1,1 retf2 incf tf2,1 btfss tf2,1 ;determina la duración del semiciclo T/2 (controla la frec) goto retf2 clrf tf2 btfss tf1,1 ;determina la duración del semiciclo T/2 (controla la frec) goto retf1 return ;------------------------------------------------------------------------------- ;Se inicia la cancion1 cancion1 movlw d'3' movwf frecu movlw d'10' movwf durac call tono1 movlw d'4' movwf frecu movlw d'9' movwf durac call tono1 movlw d'3' movwf frecu movlw d'10' movwf durac call tono1 movlw d'4' movwf frecu movlw d'9' movwf durac call tono1 movlw d'3' movwf frecu movlw d'10' movwf durac call tono1 movlw d'10' movwf frecu movlw d'4' movwf durac call tono1 call tono1 movlw d'5' movwf frecu movlw d'8' movwf durac call tono1 movlw d'4' movwf frecu movlw d'7' movwf durac call tono1 movlw d'6' movwf frecu movlw d'10' movwf durac call tono1 movlw d'5' movwf frecu movlw d'7' movwf durac call tono1 movlw d'10' movwf frecu movlw d'6' movwf durac call tono1 call tono1 movlw d'7' movwf frecu movlw d'6' movwf durac call tono1 call tono1 movlw d'6' movwf frecu movlw d'5' movwf durac call tono1 movlw d'10' movwf frecu movlw d'4' movwf durac call tono1 call tono1 movlw d'7' movwf frecu movlw d'5' movwf durac call tono1 movlw d'10' movwf frecu movlw d'4' movwf durac call tono1 return ;Fin de cancion1 ;---------------------------------------------------------------------- ;---------------------------------------------- end