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