list p=16f84 #include p16f84.inc portb equ 06h ;el puerto b esta en la posicion 06h de la ram porta equ 05h ;el puerto a esta en la posicion 05h de la ram trisb equ 86h ;regis de config de puerto b esta en la direcc 86h de la ram trisa equ 85h ;regis de config de puerto a esta en la direcc 85h de la ram status equ 03h ;registro de estado esta en la direcc 03h de la ram ;se definen3 registros personales. tempo1 equ 0ch ;registro tempo1 esta en la direcc 0ch de la ram tempo2 equ 0dh ;registro tempo2 esta en la direcc 0dh de la ram tempo3 equ 0eh ;registro tempo3 esta en la direcc 0eh de la ram ;------------------------------------------------------------------------------- ;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 ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;definicion de la funcion de los puertos bsf status,5 ;se posiciona en banco1 clrf trisb ;define el portb como salida movlw b'00001111' movwf trisa ;define RA0 RA1 RA2 RA3 como entradas RA4 se define como salida bcf status,5; se posiciona en banco 0 ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;parte principal del programa que rastrea el estado de 4 entradas del porta rastreo movlw b'01111111' movwf portb ; apaga todo el display de anodo comun btfss porta,0 ; prueba si es 1 el bit 0 del porta. Si lo es salta call tarea0 movlw b'01111111' movwf portb ; apaga todo el display de anodo comun btfss porta,1 ; prueba si es 1 el bit 1 del porta. Si lo es salta call tarea1 movlw b'00000110' movwf portb ; coloca E en el display de anodo comun movlw b'01111111' movwf portb ; apaga todo el display de anodo comun btfss porta,2 ; prueba si es 1 el bit 2 del porta. Si lo es salta call tarea2 movlw b'01111111' movwf portb ; apaga todo el display de anodo comun btfss porta,3 ; prueba si es 1 el bit 3 del porta. Si lo es salta call tarea3 movlw b'01111111' movwf portb ; apaga todo el display de anodo comun goto rastreo ;----------------------------------------------------------------------------- ;Comienzan las tareas de encender display anodo comun con el nro de tarea ;Son 4 subrutinas tarea0 movlw b'01000000'; decimal 0 movwf portb call dingdong call retardo1 call dingdong1 return tarea1 movlw b'01111001'; decimal 1 movwf portb call dingdong call retardo1 call dingdong1 return tarea2 movlw b'00100100'; decimal 2 movwf portb call dingdong call retardo1 call dingdong1 return tarea3 movlw b'00110000'; decimal 3 movwf portb call dingdong call retardo1 call dingdong1 return ;----------------------------------------------------------------------------- ;Subrutina retardo retardo1 incf tempo1,1 retardo2 incf tempo2,1 retardo3 incf tempo3,1 btfss tempo3,6 goto retardo3 clrf tempo3 btfss tempo2,7 goto retardo2 clrf tempo2 btfss tempo1,6 goto retardo1 clrf tempo1 return ;----------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;subrutina ding dong dingdong movlw d'10' movwf frecu movlw d'6' movwf durac call tono1 movlw d'6' movwf frecu movlw d'6' movwf durac call tono1 return ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ;subrutina ding dong1 dingdong1 movlw d'6' movwf frecu movlw d'6' movwf durac call tono1 movlw d'10' movwf frecu movlw d'6' movwf durac call tono1 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 intruccion 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 intruccion 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 intruccion 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 duracion 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 duracion del semiciclo T/2 (controla la frec) goto retf2 clrf tf2 btfss tf1,1 ;determina la duracion del semiciclo T/2 (controla la frec) goto retf1 return ;------------------------------------------------------------------------------- end