; Filename: DTMF_GEN.SRC ; Author: Stephen Holland ; Applications Engineer ; Scenix Semiconductor Inc. ; Revision: 1.0 ; Date: July 05, 1998 ; Part: SX28AC rev. 2.5 ; Freq: 50Mhz ; Compiled using Parallax SX-Key software v0.8 ; ; *This virtual peripheral relies on external RC filters to generate complete ; DTMF tones. ; ; ; The DTMF number string to be dialed is defined by the label _dialnum. ; Each key can be defined as an 8-bit hex value where the upper and ; lower nibbles repesent the keypad bitwise row and column ($RRRRCCCC). ; ; example: _dialnum dw $11,$21,$82,$42,$14,$12,$41,$42,$42,$42,$42,0 ; represents the number 14083278888. ; ; Keypad ; ; 1209 1336 1477 1633 ; ________________________________ ; | | | | | ; 697 | $11 | $12 | $14 | $18 | ; | (1) | (2) | (3) | (A) | ; ________________________________ ; | | | | | ; 770 | $21 | $22 | $24 | $28 | ; | (4) | (5) | (6) | (B) | ; ________________________________ ; | | | | | ; 852 | $41 | $42 | $44 | $48 | ; | (7) | (8) | (9) | (C) | ; ________________________________ ; | | | | | ; 941 | $81 | $82 | $84 | $88 | ; | (*) | (0) | (#) | (D) | ; ________________________________ ; ;************************************************************* ; Device ;************************************************************* device pins28,pages4,banks8,oschs device turbo,stackx,optionx id 'DTMF_GEN' reset reset_entry ;************************************************************* ; Equates ;************************************************************* pwm0_pin = rb.4 pwm1_pin = rb.5 ;************************************************************* ; Variables ;************************************************************* org 8 temp ds 1 string ds 1 ;************************************************************* ; Bank 0 variables ;************************************************************* org 10h timers = $ ;timer timer_accl ds 1 timer_acch ds 1 timer_flag ds 1 ;************************************************************* ; Bank 1 variables ;************************************************************* org 30h pwm = $ pwm_duty_1 ds 1 pwm_duty_1_buf ds 1 pwm_duty_2 ds 1 pwm_duty_2_buf ds 1 pwm_period_1 ds 1 pwm_period_1_buf ds 1 pwm_period_2 ds 1 pwm_period_2_buf ds 1 counter_low ds 1 counter_high ds 1 row ds 1 col ds 1 ;************************************************************* ; Interrupt routine - virtual peripherals ;************************************************************* org 0 interrupt ;3 it takes 3 cycles to get an interrupt bank timers ;1 ;timer stc ;1 set carry add timer_accl,#1 ;2 add timer_accl+carry(=1) sc jmp :timer_out add timer_acch,#0 snc ;1 setb timer_flag.0 ;1 :timer_out ;=7 ;************************************************************* ; D/A Conversions ;************************************************************* da_conv bank pwm ;1 dec pwm_duty_1 ;1 decrement port_duty movb pwm0_pin,/pwm_duty_1.7 ;4 move complement of most significant bit to output dec pwm_duty_2 ;1 decrement port_duty movb pwm1_pin,/pwm_duty_2.7 ;4 move complement of most significant bit to output decsz pwm_period_1 ;1 jmp interrupt_out ;3 mov pwm_duty_1,#5 ;2 mov pwm_duty_2,#5 ;2 mov pwm_period_1,#9 ;2 make_dtmf get_row jb row.0,make697 ;4/6 jb row.1,make770 ;4/6 jb row.2,make852 ;4/6 jb row.3,make941 ;4/6 make697 csae counter_low,#end697 ;1 take new table value jmp :continue ;1 mov counter_low,#sine697 ;1 reload table-counter :continue mov w,counter_low ;1 mov m,#6 ;1 set page iread ;1 get table_data mov m,#$F ;1 mov pwm_duty_1,w ;1 inc counter_low ;1 jmp get_col make770 csae counter_low,#end770 ;1 take new table value jmp :continue ;1 mov counter_low,#sine770 ;1 reload table-counter :continue mov w,counter_low ;1 mov m,#6 ;1 set page iread ;1 get table_data mov m,#$F ;1 mov pwm_duty_1,w ;1 inc counter_low ;1 jmp get_col make852 csae counter_low,#end852 ;1 take new table value jmp :continue ;1 mov counter_low,#sine852 ;1 reload table-counter :continue mov w,counter_low ;1 mov m,#6 ;1 set page iread ;1 get table_data mov m,#$F ;1 mov pwm_duty_1,w ;1 inc counter_low ;1 jmp get_col make941 csae counter_low,#end941 ;1 take new table value jmp :continue ;1 mov counter_low,#sine941 ;1 reload table-counter :continue mov w,counter_low ;1 mov m,#6 ;1 set page iread ;1 get table_data mov m,#$F ;1 mov pwm_duty_1,w ;1 inc counter_low ;1 get_col jb col.0,make1209 ;4/6 jb col.1,make1336 ;4/6 jb col.2,make1477 ;4/6 jb col.3,make1633 ;4/6 make1209 csae counter_high,#end1200 ;1 take new table value jmp :continue ;1 mov counter_high,#sine1200 ;1 reload table-counter :continue mov w,counter_high ;1 mov m,#6 ;1 set page iread ;1 get table_data mov m,#$F ;1 mov pwm_duty_2,w ;1 = 21 inc counter_high ;1 jmp da_out make1336 csae counter_high,#end1336 ;1 take new table value jmp :continue ;1 mov counter_high,#sine1336 ;1 reload table-counter :continue mov w,counter_high ;1 mov m,#6 ;1 set page iread ;1 get table_data mov m,#$F ;1 mov pwm_duty_2,w ;1 = 21 inc counter_high ;1 jmp da_out make1477 csae counter_high,#end1477 ;1 take new table value jmp :continue ;1 mov counter_high,#sine1477 ;1 reload table-counter :continue mov w,counter_high ;1 mov m,#7 ;1 set page iread ;1 get table_data mov m,#$F ;1 mov pwm_duty_2,w ;1 = 21 inc counter_high ;1 jmp da_out make1633 csae counter_high,#end1633 ;1 take new table value jmp :continue ;1 mov counter_high,#sine1633 ;1 reload table-counter :continue mov w,counter_high ;1 mov m,#7 ;1 set page iread ;1 get table_data mov m,#$F ;1 mov pwm_duty_2,w ;1 = 21 inc counter_high ;1 da_out interrupt_out mov w,#-163 ;1 ;interrupt every 159 clocks retiw ;3 ;************************************************************* ; Reset entry ;************************************************************* reset_entry mov !ra,#%0000 ;set ra data direction register mov !rb,#%00110000 ;set rb data direction register mov m,#$F clr fsr ;reset all ram banks :loop setb fsr.4 clr ind ijnz fsr,:loop bank pwm mov pwm_period_1,#9 ;set initial periods mov pwm_period_2,#9 mov pwm_duty_1,#5 ;set initial duty cycles mov pwm_duty_2,#5 mov !option,#%10011111 ;enable rtcc interrupt ;************************************************************* ; Main ;************************************************************* main_loop mov w,#_dialnum ;send phone number string page DTMF_generation call DTMF_generation here jmp here jmp main_loop ;************************************************************* ; Subroutines ;************************************************************* org $200 ;************************************************************* ; Jump table for page 1 ;************************************************************* DTMF_generation jmp DTMF_generation_jump DTMF_generation_jump_out retp ;************************************************************* DTMF_generation_jump mov string,w ;send string at w loop mov w,string ;read chr at w mov m,#1 iread mov m,#$F test w ;if 0, exit snz jmp DTMF_generation_jump_out bank pwm mov temp,w and w,#$0f ;Keep only the lower 4 bits mov col,w ;This is the column swap temp mov w,temp and w,#$0f ;Keep only the lower 4 bits mov row,w ;This is the row setb ra.3 ;Enable output mov m,#$F mov !rb,#%00000000 ;1 Enable PWM outputs bank timers ;Send tone for 300ms mov !option,#%11011111 ;disable rtcc interrupt mov timer_accl,#$ff ;100mS mov timer_acch,#$0f ;--//-- mov !option,#%10011111 ;enable rtcc interrupt clrb timer_flag.0 ;Clear overflow-flag jnb timer_flag.0,$ ;Is overflow-flag set? bank timers mov !option,#%11011111 ;disable rtcc interrupt mov timer_accl,#$ff ;100mS mov timer_acch,#$0f ;--//-- mov !option,#%10011111 ;enable rtcc interrupt clrb timer_flag.0 ;Clear overflow-flag jnb timer_flag.0,$ ;Is overflow-flag set? bank timers mov !option,#%11011111 ;disable rtcc interrupt mov timer_accl,#$ff ;100mS mov timer_acch,#$0f ;--//-- mov !option,#%10011111 ;enable rtcc interrupt clrb timer_flag.0 ;Clear overflow-flag jnb timer_flag.0,$ ;Is overflow-flag set? :interdigit inc string ;next chr clrb ra.3 ;Disable output mov m,#$0f mov !rb,#%00110000 ;1 Disable PWM outputs bank timers ;Send tone for 100ms mov !option,#%11011111 ;disable rtcc interrupt mov timer_accl,#$ff ;50mS mov timer_acch,#$7f ;--//-- mov !option,#%10011111 ;enable rtcc interrupt clrb timer_flag.0 ;Clear overflow-flag jnb timer_flag.0,$ ;Is overflow-flag set? jmp loop ;************************************************************* ; Data ;************************************************************* org $1a0 _dialnum dw $22,0 org $600 sine697 = $ dw 5 ; 1 dw 6 ; 2 dw 7 ; 3 dw 7 ; 4 dw 8 ; 5 dw 8 ; 6 dw 8 ; 7 dw 8 ; 8 dw 9 ; 9 dw 9 ;10 dw 9 ;11 dw 9 ;12 dw 9 ;13 dw 9 ;14 dw 9 ;15 dw 9 ;16 dw 9 ;17 dw 8 ;18 dw 8 ;19 dw 8 ;20 dw 8 ;21 dw 7 ;22 dw 7 ;23 dw 6 ;24 dw 5 ;25 dw 4 ;26 dw 3 ;27 dw 2 ;28 dw 2 ;29 dw 2 ;30 dw 1 ;31 dw 1 ;32 dw 1 ;33 dw 1 ;34 dw 0 ;35 dw 0 ;36 dw 0 ;37 dw 0 ;38 dw 0 ;39 dw 0 ;40 dw 0 ;41 dw 1 ;42 dw 1 ;43 dw 1 ;44 dw 1 ;45 dw 2 ;46 dw 2 ;47 dw 3 ;48 end697 = $ dw 4 ;49 sine770 = $ dw 5 ; 1 dw 6 ; 2 dw 7 ; 3 dw 7 ; 4 dw 7 ; 5 dw 8 ; 6 dw 8 ; 7 dw 8 ; 8 dw 9 ; 9 dw 9 ;10 dw 9 ;11 dw 9 ;12 dw 9 ;13 dw 8 ;14 dw 8 ;15 dw 8 ;16 dw 7 ;17 dw 7 ;18 dw 7 ;19 dw 6 ;20 dw 5 ;21 dw 4 ;22 dw 3 ;23 dw 2 ;24 dw 2 ;25 dw 2 ;26 dw 1 ;27 dw 1 ;28 dw 1 ;29 dw 1 ;30 dw 0 ;31 dw 0 ;32 dw 0 ;33 dw 0 ;34 dw 0 ;35 dw 0 ;36 dw 1 ;37 dw 1 ;38 dw 1 ;39 dw 1 ;40 dw 2 ;41 dw 2 ;42 dw 3 ;43 end770 = $ dw 4 ;44 sine852 = $ dw 5 ; 1 dw 6 ; 2 dw 7 ; 3 dw 7 ; 4 dw 7 ; 5 dw 8 ; 6 dw 8 ; 7 dw 8 ; 8 dw 9 ; 9 dw 9 ;10 dw 9 ;11 dw 9 ;12 dw 9 ;13 dw 8 ;14 dw 8 ;15 dw 8 ;16 dw 7 ;17 dw 7 ;18 dw 7 ;19 dw 6 ;20 dw 5 ;21 dw 4 ;22 dw 3 ;23 dw 2 ;24 dw 2 ;25 dw 2 ;26 dw 1 ;27 dw 1 ;28 dw 1 ;29 dw 0 ;30 dw 0 ;31 dw 0 ;32 dw 0 ;33 dw 0 ;34 dw 1 ;35 dw 1 ;36 dw 1 ;37 dw 2 ;38 dw 2 ;39 dw 3 ;40 end852 = $ dw 4 ;41 sine941 = $ dw 5 ; 1 dw 6 ; 2 dw 7 ; 3 dw 7 ; 4 dw 8 ; 5 dw 8 ; 6 dw 8 ; 7 dw 9 ; 8 dw 9 ; 9 dw 9 ;10 dw 9 ;11 dw 8 ;12 dw 8 ;13 dw 8 ;14 dw 7 ;15 dw 7 ;16 dw 6 ;17 dw 5 ;18 dw 4 ;19 dw 3 ;20 dw 2 ;21 dw 2 ;22 dw 1 ;23 dw 1 ;24 dw 1 ;25 dw 0 ;26 dw 0 ;27 dw 0 ;28 dw 0 ;29 dw 0 ;30 dw 1 ;31 dw 1 ;32 dw 1 ;33 dw 2 ;34 dw 2 ;35 dw 3 ;36 end941 = $ dw 4 ;37 sine1200 = $ dw 5 ; 1 dw 7 ; 2 dw 8 ; 3 dw 8 ; 4 dw 9 ; 5 dw 9 ; 6 dw 10 ; 7 dw 9 ; 8 dw 9 ; 9 dw 8 ;10 dw 8 ;11 dw 7 ;12 dw 6 ;13 dw 5 ;14 dw 4 ;15 dw 3 ;16 dw 2 ;17 dw 1 ;18 dw 1 ;19 dw 0 ;20 dw 0 ;21 dw 0 ;22 dw 0 ;23 dw 0 ;24 dw 1 ;25 dw 1 ;26 dw 2 ;27 dw 3 ;28 end1200 = $ dw 4 ;29 sine1336 = $ dw 5 ; 1 dw 7 ; 2 dw 8 ; 3 dw 8 ; 4 dw 9 ; 5 dw 9 ; 6 dw 9 ; 7 dw 9 ; 8 dw 8 ; 9 dw 8 ;10 dw 7 ;11 dw 6 ;12 dw 5 ;13 dw 3 ;14 dw 2 ;15 dw 1 ;16 dw 1 ;17 dw 0 ;18 dw 0 ;19 dw 0 ;20 dw 0 ;21 dw 1 ;22 dw 1 ;23 dw 2 ;24 dw 3 ;25 end1336 = $ dw 4 ;26 org $700 sine1477 = $ dw 5 ; 1 dw 7 ; 2 dw 8 ; 3 dw 8 ; 4 dw 9 ; 5 dw 9 ; 6 dw 9 ; 7 dw 8 ; 8 dw 8 ; 9 dw 7 ;10 dw 6 ;11 dw 5 ;12 dw 3 ;13 dw 2 ;14 dw 1 ;15 dw 1 ;16 dw 0 ;17 dw 0 ;18 dw 0 ;19 dw 0 ;20 dw 1 ;21 dw 2 ;22 dw 3 ;23 end1477 = $ dw 4 ;24 sine1633 = $ dw 5 ; 1 dw 7 ; 2 dw 8 ; 3 dw 8 ; 4 dw 9 ; 5 dw 9 ; 6 dw 9 ; 7 dw 8 ; 8 dw 7 ; 9 dw 6 ;10 dw 5 ;11 dw 3 ;12 dw 2 ;13 dw 1 ;14 dw 1 ;15 dw 0 ;16 dw 0 ;17 dw 0 ;18 dw 1 ;19 dw 2 ;20 dw 3 ;21 end1633 = $ dw 4 ;22
file: /Techref/scenix/lib/io/osi1/dfs/dtmf.src, 13KB, , updated: 1999/2/20 13:23, local time: 2024/9/1 16:23,
3.139.238.176:LOG IN
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://techref.massmind.org/Techref/scenix/lib/io/osi1/dfs/dtmf.src"> scenix lib io osi1 dfs dtmf</A> |
Did you find what you needed? |
Welcome to massmind.org! |
Welcome to techref.massmind.org! |
.