list p=16F84, r=dec #include __CONFIG _XT_OSC&_WDT_OFF&_CP_OFF WaveABase equ 10h PointerA equ 11h WaveBBase equ 12h PointerB equ 13h NextValue equ 14h SineCount equ 15h SineCountH equ 16h Temp equ 17h EndSine equ .127 RA0 equ 0 RA1 equ 1 TXstat equ 2 RA3 equ 3 RA4 equ 4 wait1 equ 18h wait2 equ 19h org 0 goto init sinelookup addwf PCL,F sineoffset sinerow1 retlw 149 retlw 170 retlw 190 retlw 208 retlw 224 retlw 236 retlw 246 retlw 253 retlw 255 retlw 254 retlw 250 retlw 242 retlw 230 retlw 216 retlw 199 retlw 180 retlw 160 retlw 138 retlw 117 retlw 95 retlw 75 retlw 56 retlw 39 retlw 25 retlw 13 retlw 5 retlw 1 retlw 0 retlw 2 retlw 9 retlw 19 retlw 31 retlw 47 retlw 65 retlw 85 retlw 106 retlw 127 sinerow2 retlw 150 retlw 173 retlw 194 retlw 213 retlw 228 retlw 241 retlw 249 retlw 253 retlw 253 retlw 249 retlw 241 retlw 228 retlw 213 retlw 194 retlw 173 retlw 150 retlw 126 retlw 104 retlw 81 retlw 60 retlw 41 retlw 26 retlw 13 retlw 5 retlw 1 retlw 1 retlw 5 retlw 13 retlw 26 retlw 41 retlw 60 retlw 81 retlw 104 retlw 127 sinerow3 retlw 153 retlw 177 retlw 200 retlw 219 retlw 235 retlw 246 retlw 253 retlw 254 retlw 250 retlw 241 retlw 227 retlw 210 retlw 189 retlw 165 retlw 140 retlw 114 retlw 89 retlw 65 retlw 44 retlw 27 retlw 13 retlw 4 retlw 0 retlw 1 retlw 8 retlw 19 retlw 35 retlw 54 retlw 77 retlw 101 retlw 127 sinerow4 retlw 155 retlw 182 retlw 206 retlw 226 retlw 241 retlw 251 retlw 254 retlw 251 retlw 241 retlw 226 retlw 206 retlw 182 retlw 155 retlw 126 retlw 99 retlw 72 retlw 48 retlw 28 retlw 13 retlw 3 retlw 0 retlw 3 retlw 13 retlw 28 retlw 48 retlw 72 retlw 99 retlw 127 sinecolumna retlw 163 retlw 196 retlw 223 retlw 243 retlw 253 retlw 253 retlw 243 retlw 223 retlw 196 retlw 163 retlw 126 retlw 91 retlw 58 retlw 31 retlw 11 retlw 1 retlw 1 retlw 11 retlw 31 retlw 58 retlw 91 retlw 127 sinecolumnb retlw 166 retlw 202 retlw 230 retlw 248 retlw 254 retlw 248 retlw 230 retlw 202 retlw 166 retlw 126 retlw 88 retlw 52 retlw 24 retlw 6 retlw 0 retlw 6 retlw 24 retlw 52 retlw 88 retlw 127 sinecolumnc retlw 173 retlw 212 retlw 241 retlw 255 retlw 252 retlw 233 retlw 200 retlw 158 retlw 112 retlw 68 retlw 32 retlw 8 retlw 0 retlw 8 retlw 32 retlw 68 retlw 112 retlw 158 retlw 200 retlw 233 retlw 252 retlw 255 retlw 241 retlw 212 retlw 173 retlw 128 retlw 82 retlw 43 retlw 14 retlw 0 retlw 3 retlw 22 retlw 55 retlw 97 retlw 143 retlw 187 retlw 223 retlw 247 retlw 255 retlw 247 retlw 223 retlw 187 retlw 143 retlw 97 retlw 55 retlw 22 retlw 3 retlw 0 retlw 14 retlw 43 retlw 82 retlw 127 sineaddress addwf PCL,F keyoffset k1 retlw sinerow1-sineoffset retlw sinecolumna-sineoffset k2 retlw sinerow1-sineoffset retlw sinecolumnb-sineoffset k3 retlw sinerow1-sineoffset retlw sinecolumnc-sineoffset k4 retlw sinerow2-sineoffset retlw sinecolumna-sineoffset k5 retlw sinerow2-sineoffset retlw sinecolumnb-sineoffset k6 retlw sinerow2-sineoffset retlw sinecolumnc-sineoffset k7 retlw sinerow3-sineoffset retlw sinecolumna-sineoffset k8 retlw sinerow3-sineoffset retlw sinecolumnb-sineoffset k9 retlw sinerow3-sineoffset retlw sinecolumnc-sineoffset k10 retlw sinerow4-sineoffset retlw sinecolumna-sineoffset k11 retlw sinerow4-sineoffset retlw sinecolumnb-sineoffset k12 retlw sinerow4-sineoffset retlw sinecolumnc-sineoffset key1 = k1-keyoffset ;1 key2 = k2-keyoffset ;2 key3 = k3-keyoffset ;3 key4 = k4-keyoffset ;4 key5 = k5-keyoffset ;5 key6 = k6-keyoffset ;6 key7 = k7-keyoffset ;7 key8 = k8-keyoffset ;8 key9 = k9-keyoffset ;9 keystar = k10-keyoffset ;* key0 = k11-keyoffset ;0 key# = k12-keyoffset ;# ;*********************************************** ; Define your DTMF code here ; If you want to modify number of DTMFs ; go after 'dtmfcode' and edit it ; digit1 = key0 digit2 = key1 digit3 = key2 ;*********************************************** ; Send DTMF ; senddtmf movwf Temp call sineaddress movwf WaveABase swapf WaveABase,f movwf PointerA incf Temp,w call sineaddress movwf WaveBBase swapf WaveBBase,f movwf PointerB movlw 08h ;Place time into W for loop counter movwf SineCountH loopsine2cyc goto loopsine loopsine movf PointerA,w call sinelookup movwf NextValue xorlw EndSine swapf WaveABase,w btfsc status,z movwf PointerA incf PointerA,f movf PointerB,w call sinelookup addwf NextValue,f xorlw EndSine swapf WaveBBase,w btfsc status,z movwf PointerB incf PointerB,f rrf NextValue,w movwf PortB goto waste2cyc waste2cyc decfsz SineCount,f goto loopsine2cyc decfsz SineCountH,f goto loopsine retlw 0 ;*************************************************************************** ;Here begin main program ; init clrf porta clrf portb bsf status,rp0 clrf trisb ;PortB - output clrf trisa ;PortA - input bsf trisa,RA0 bsf trisa,RA1 bsf trisa,TXstat bsf trisa,RA3 bsf trisa,RA4 bcf status,rp0 dtmfcode btfsc porta,TXstat ;wait until TX begin goto dtmfcode call wait100ms movlw digit1 call senddtmf call wait60ms movlw digit2 call senddtmf call wait60ms movlw digit3 call senddtmf call wait60ms sleep ;*************************************************************** ;Wait about 100 mS routine ; ; wait100mS movlw 0x80 movwf wait2 kill3a movlw 0xff movwf wait1 kill5a decfsz wait1 goto kill5a btfsc porta,TXstat goto dtmfcode decfsz wait2 goto kill3a return ;*************************************************************** ;Wait 60mS routine ; ; wait60mS movlw 0x4f movwf wait2 kill3b movlw 0xff movwf wait1 kill5b decfsz wait1 goto kill5b btfsc porta,TXstat goto dtmfcode decfsz wait2 goto kill3b return end