Jim, Here is how I do it for a repeater control link w an 16F628.

CHECKIN:' GATHER TOUCH TONE DATA FROM RECEIVER
DVEDGE = 1 'REMEMBER THE LEADING EDGE
POINTER = PORTA & 15 'PULL IN DATA AND STRIP TO 4 BITS

REORDER:' REORDER OUTPUT FROM TONE DECODER
' ACTUAL KEY= D 1 2 3 4 5 6 7 8 9 0 * # A B C
lOOKUP POINTER,[$D,$1,$2,$3,$4,$5,$6,$7,$8,$9,$0,$E,$F,$A,$B,$C],POINTER
IF POINTER = $F THEN EVALKEY 'IF # KEY THEN EVALUATE TONE SEQUENCE
CCOUNT = CCOUNT + 1 'ADD 1 TO THE CODE COUNTER
CCOUNT = CCOUNT MIN 9 'LIMIT TOUCH TONE CHARACTERS
TONES(CCOUNT) = POINTER 'COPY TONE TO ARRAY FOR LATER EVALUATION
GOTO LOOP

EVALKEY:' EVALUATE TONE SEQUENCE
TONE = 0 'CLEAR TONE OUTPUT FLAG
BADCOD = 1 'SET BADCOD FLAG
IF CCOUNT > 6 THEN
FOR SCRATCH1 = 1 TO 4
CODEWRD = CODEWRD << 4 'MAKE ROOM FOR THE NEW CODE
CODEWRD = CODEWRD | TONES(SCRATCH1)
NEXT
IF CODEWRD = UNLOCK THEN 'IF CORRECT UNLOCK CODE THEN EVALUATE REST OF MESSSAGE
CODEWRD = 0 'MAKE ROOM FOR THE NEW CODES
ENDIF