' ========================================================================= ' ' File....... Manual_DTMF.BS2 ' Purpose.... ' Author..... Jon Williams -- Parallax, Inc. ' E-mail..... jwilliams@parallax.com ' Started.... ' Updated.... 15 MAR 2005 ' ' {$STAMP BS2} ' {$PBASIC 2.5} ' ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- ' ' Generates DTMF tones using FREQOUT, using data from CM8870 tech sheet. ' ' 1209 1336 1477 1633 ' +------+------+------+------+ ' 697 | 1 | 2 | 3 | A | ' +------+------+------+------+ ' 770 | 5 | 6 | 7 | B | ' +------+------+------+------+ ' 852 | 7 | 8 | 9 | C | ' +------+------+------+------+ ' 941 | 0 | . | # | D | ' +------+------+------+------+ ' -----[ Revision History ]------------------------------------------------ ' -----[ I/O Definitions ]------------------------------------------------- ' -----[ Constants ]------------------------------------------------------- #SELECT $STAMP #CASE BS2, BS2E, BS2PE T1200 CON 813 T2400 CON 396 T4800 CON 188 T9600 CON 84 T19K2 CON 32 TMidi CON 12 T38K4 CON 6 #CASE BS2SX, BS2P T1200 CON 2063 T2400 CON 1021 T4800 CON 500 T9600 CON 240 T19K2 CON 110 TMidi CON 60 T38K4 CON 45 #ENDSELECT SevenBit CON $2000 Inverted CON $4000 Open CON $8000 Baud CON T9600 ' -----[ Variables ]------------------------------------------------------- idx VAR Nib char VAR Byte valid VAR Byte offset VAR Nib frHi VAR Word frLo VAR Word ' -----[ EEPROM Data ]----------------------------------------------------- DTMF_Lo DATA Word 697, Word 770, Word 852, Word 941 DTMF_Hi DATA Word 1209, Word 1336, Word 1477, Word 1633 ' -----[ Initialization ]-------------------------------------------------- Reset: DEBUG CLS ' -----[ Program Code ]---------------------------------------------------- Main: FOR idx = 0 TO 15 LOOKUP idx, ["0123456789ABCD.#"], char DEBUG char, " " GOSUB Get_DTMF_Freqs IF (valid <= 15) THEN DEBUG DEC3 frLo, " ", DEC4 frHi ENDIF DEBUG CR NEXT END ' -----[ Subroutines ]----------------------------------------------------- ' Pass digit to dial in 'char' ' -- valid values are: '0' to '9', 'A' - 'D', '.', '#' Get_DTMF_Freqs: valid = $FF LOOKDOWN char, ["0123456789ABCD.#"], valid IF (valid <= 15) THEN LOOKUP valid, [3,0,0,0,1,1,1,2,2,2,0,1,2,3,3,3], offset READ DTMF_Lo + (offset * 2), Word frLo LOOKUP valid, [0,0,1,2,0,1,2,0,1,2,3,3,3,3,1,2], offset READ DTMF_Hi + (offset * 2), Word frHi ENDIF RETURN