Hola:
Cualquier decodificador DTMF (M8870, MC145436,etc) entregan 4 bits de salida. Generalmente el "0" viene como 1010, porque el 0000 es ausencia de tono dtmf.
Bueno al acoplarlo al PIC, puede hacerse por el PortA o el PortB, como gustes. directamente.
El proceso es el siguiente:
Detectas el PortA con: movf PortA,0
Pruebas el registro Status, para verificar si entro un dato: btfsc Status,2
Si el bit 2 fue 1, quiere decir que no hay dato dtmf y regresas a sensar el PortA
Si el bit 2 fue 0, quiere decir que entro algun dato, inmediatamente lo guardas en alguna localidad de memoria (digito1,2,3 y 4)
Vuelves a sensar el PortA: movf PortA,0
Pruebas ahora el registro Status para verificar que el dtmf actual ya desaparecio: btfss Status,2
Si el bit 2 es 1 entonces ya desaparecio y procedes a detectar el segundo digito dtmf
Si el bit es 0 entonces regresas a sensar el PortA en esta misma etapa.
Continuas con la cantidad de digitos que deseas detectar.
Al terminar, empiezas a comparar los digitos guardados (digi1,2,3,4 etc) con valores establecidos por ti, por ejemplo con accesos de larga distancia, celular, etc.
La comparacion se hace restando el valor de interes con el registro W que ya debe contener digi1 (2,3,4, etc)
movlw b"00000011" por ejemplo el "3"
sublw digi1
el resultado de esta resta repercutira en el registro Status nuevamente en el bit 2.
Realizas los mismos pasos de comparacion....
Al detectar alguna coincidencia de codigos entonces activas un pin del PortB, para que haga un bloqueo de la linea telefonica, por ejemplo que la cuelgue y la descuelgue nuevamente...
Saludos....