Build a DTMF Decoder

Figure 6 - Commodore 64/VIC-20 Sample Code

10 GOSUB 10000: REM INITIALIZE VARIABLES 
20 GOSUB  5000: REM SET FOR COMPUTER TYPE 
30 GOSUB  4000: REM INITIALIZE THE PORT 
100 REM MAIN PROGRAM LOOP 
110 GOSUB 1000: REM GET A DIGIT 
120 GOSUB 2000: REM PRINT DIGIT TO SCREEN, UPDATING LAST DIGIT TIME 
130 GOSUB 3000: REM WAIT FOR THAT TONE TO END 
140 GOTO 100: REM CONTINUE MAIL LOOP 
1000 IF PEEK(DREG) AND 16 THEN GOTO 1020
1010 GOTO 1000: REM LOOP UNTIL VALID BIT GOES HI. 
1020 DTMF=PEEK(DREG) AND 15
1030 RETURN
2000 IF TIME-LAST > 180 THEN PRINT
2010 PRINT OUT$(DTMF);
2020 RETURN
3000 IF PEEK(DREG) AND 16 THEN GOTO 3000
3010 LAST=TIME
3020 RETURN
4000 POKE DIR, 0: REM SET ALL BITS TO INPUT 
4010 RETURN
5000 IF (FRE(0)-(FRE(0)<0)*65536)<5000 THEN GOTO 5040
5010 DIR=56579: REM DATA DIRECTION REGISTER ADDRESS FOR COMMODORE 64 
5020 DREG=56577: REM USER PORT DATA ADDRESS REGISTER FOR COMMODORE 64 
5030 RETURN
5040 DIR=37138: REM USER PORT DATA ADDRESS REGISTER FOR VIC-20 
5050 DREG=37136: REM USER PORT DATA ADDRESS REGISTER FOR VIC-20 
5060 RETURN
10000 DIM OUT$(16): REM DIMESIONS OUTPUT SYMBOL ARRAY 
10010 READ CODE,SYMBOL$
10020 OUT$(CODE)=SYMBOL$
10030 IF CODE <> 15 THEN GOTO 10010
10040 LAST=0: REM TIME LAST TONE ENDED 
10050 DTMF=0: REM DECODED DTMF VALUE 
10060 DREG=0: REM DATA ADDRESS REGISTER 
10070 DIR=0: REM DATA DIRECTION ADDR. REG. 
10080 RETURN
15000 REM DATA FOR EACH POSSIBLE DTMF INPUT AND IT'S CORRESPONDING SYMBOL 
15010 DATA 0,"D",1,"1",2,"2",3,"3",4,"4",5,"5",6,"6",7,"7",8,"8",9,"9",10,"0"
15020 DATA 11,"*",12,"#",13,"A",14,"B",15,"C"

Table 1 - Keys, Frequencies, Decoder Outputs, and Displayed Symbols

Code: dtmf.bas

Return to $2600 Index