📄 dtmf.lis
字号:
;
; //高频(列)
; //1209hz ---> x_SW = 79
; //1336hz ---> x_SW = 87
; //1477hz ---> x_SW = 96
; //1633hz ---> x_SW = 107
;
; const unsigned char auc_frequencyH [4] = {
; 107,96,
; 87,79};
;
; //低频(行)
; //697hz ---> x_SW = 46
; //770hz ---> x_SW = 50
; //852hz ---> x_SW = 56
; //941hz ---> x_SW = 61
;
; const unsigned char auc_frequencyL [4] = {
; 61,56,
; 50,46};
;
;
; //************************** 全局变量 ****************************
; unsigned char x_SWa = 0x00; // 高频信号脉冲宽度
; unsigned char x_SWb = 0x00; // 低频信号脉冲宽度
; unsigned int X_LUTaExt = 0;
; unsigned int X_LUTbExt = 0;
; unsigned int X_LUTa;
; unsigned int X_LUTb;
;
; /*****************************************************************
; 定时器溢出中断服务程序
; ******************************************************************/
; void ISR_T1_Overflow (void)
; {
001E .dbline 130
; X_LUTaExt += x_SWa;
001E 20900000 lds R2,_x_SWa
0022 3324 clr R3
0024 50900300 lds R5,_X_LUTaExt+1
0028 40900200 lds R4,_X_LUTaExt
002C 420C add R4,R2
002E 531C adc R5,R3
0030 50920300 sts _X_LUTaExt+1,R5
0034 40920200 sts _X_LUTaExt,R4
0038 .dbline 131
; X_LUTbExt += x_SWb;
0038 20900100 lds R2,_x_SWb
003C 3324 clr R3
003E 50900500 lds R5,_X_LUTbExt+1
0042 40900400 lds R4,_X_LUTbExt
0046 420C add R4,R2
0048 531C adc R5,R3
004A 50920500 sts _X_LUTbExt+1,R5
004E 40920400 sts _X_LUTbExt,R4
0052 .dbline 133
; // 数据规格化
; X_LUTa = (char)(((X_LUTaExt+4) >> 3)&(0x007F));
0052 23E0 ldi R18,3
0054 30E0 ldi R19,0
0056 10910300 lds R17,_X_LUTaExt+1
005A 00910200 lds R16,_X_LUTaExt
005E 0C5F subi R16,252 ; offset = 4
0060 1F4F sbci R17,255
0062 00D0 rcall lsr16
0064 802F mov R24,R16
0066 912F mov R25,R17
0068 8F77 andi R24,127
006A 9070 andi R25,0
006C 282E mov R2,R24
006E 3324 clr R3
0070 30920300 sts _X_LUTa+1,R3
0074 20920200 sts _X_LUTa,R2
0078 .dbline 134
; X_LUTb = (char)(((X_LUTbExt+4) >> 3)&(0x007F));
0078 23E0 ldi R18,3
007A 30E0 ldi R19,0
007C 10910500 lds R17,_X_LUTbExt+1
0080 00910400 lds R16,_X_LUTbExt
0084 0C5F subi R16,252 ; offset = 4
0086 1F4F sbci R17,255
0088 00D0 rcall lsr16
008A 802F mov R24,R16
008C 912F mov R25,R17
008E 8F77 andi R24,127
0090 9070 andi R25,0
0092 282E mov R2,R24
0094 3324 clr R3
0096 30920100 sts _X_LUTb+1,R3
009A 20920000 sts _X_LUTb,R2
009E .dbline 136
; // 计算 PWM 值: 高频值 + 3/4 低频值
; OCR1A = (auc_SinParam[X_LUTa] + (auc_SinParam[X_LUTb]-(auc_SinParam[X_LUTb]>>2)));
009E 80E0 ldi R24,<_auc_SinParam
00A0 90E0 ldi R25,>_auc_SinParam
00A2 30900100 lds R3,_X_LUTb+1
00A6 20900000 lds R2,_X_LUTb
00AA 280E add R2,R24
00AC 391E adc R3,R25
00AE E22D mov R30,R2
00B0 F32D mov R31,R3
00B2 C895 lpm
00B4 202C mov R2,R0
00B6 3324 clr R3
00B8 22E0 ldi R18,2
00BA 30E0 ldi R19,0
00BC 022D mov R16,R2
00BE 132D mov R17,R3
00C0 00D0 rcall asr16
00C2 201A sub R2,R16
00C4 310A sbc R3,R17
00C6 80E0 ldi R24,<_auc_SinParam
00C8 90E0 ldi R25,>_auc_SinParam
00CA 50900300 lds R5,_X_LUTa+1
00CE 40900200 lds R4,_X_LUTa
00D2 480E add R4,R24
00D4 591E adc R5,R25
00D6 E42D mov R30,R4
00D8 F52D mov R31,R5
00DA C895 lpm
00DC 402C mov R4,R0
00DE 5524 clr R5
00E0 420C add R4,R2
00E2 531C adc R5,R3
00E4 50924B00 sts 74+1,R5
00E8 40924A00 sts 74,R4
00EC .dbline 137}
; }
00EC L1:
00EC 0990 ld R0,y+
00EE 0FBE out 0x3f,R0
00F0 F991 ld R31,y+
00F2 E991 ld R30,y+
00F4 9991 ld R25,y+
00F6 8991 ld R24,y+
00F8 3991 ld R19,y+
00FA 2991 ld R18,y+
00FC 1991 ld R17,y+
00FE 0991 ld R16,y+
0100 5990 ld R5,y+
0102 4990 ld R4,y+
0104 3990 ld R3,y+
0106 2990 ld R2,y+
0108 0990 ld R0,y+
010A 1895 reti
010C .dbfunc s init _init fI
.even
010C _init::
010C .dbline 143{
;
; /***********************************************************
; 初始化
; ***********************************************************/
; void init (void)
; {
010C .dbline 144
; MCUCR=0x00;
010C 2224 clr R2
010E 25BE out 0x35,R2
0110 .dbline 145
; TIMSK = 0x80; // T1 溢出中断使能
0110 80E8 ldi R24,128
0112 89BF out 0x39,R24
0114 .dbline 146
; TCCR1A = (1<<COM1A1)+(1<<PWM10); // 不翻转、8位PWM
0114 81E8 ldi R24,129
0116 8FBD out 0x2f,R24
0118 .dbline 147
; TCCR1B = (1<<CS10); // 预分频系数为1、即CLK/1
0118 81E0 ldi R24,1
011A 8EBD out 0x2e,R24
011C .dbline 148
; DDRD = (1 <<PD5); // PD5 (OC1A)用作输出
011C 80E2 ldi R24,32
011E 81BB out 0x11,R24
0120 .dbline 149
; _SEI(); // 全局中断使能
0120 7894 sei
0122 .dbline 150}
; }
0122 L2:
0122 0895 ret
0124 .dbfunc s Delay _Delay fI
; i -> R16,R17
.even
0124 _Delay::
0124 .dbline 156{
;
; /*********************************************************************
; 为从PORT C口读取稳定的按键数据,所必须的延时程序(消抖延时)
; *********************************************************************/
; void Delay (void)
; {
0124 .dbline 158
0124 0027 clr R16
0126 1127 clr R17
0128 L4:
0128 .dbline 158
0128 0000 nop
012A L5:
012A .dbline 158
; int i;
; for (i = 0; i < delaycyc; i++) _NOP();
012A 0F5F subi R16,255 ; offset = 1
012C 1F4F sbci R17,255
012E .dbline 158
012E 0A30 cpi R16,10
0130 E0E0 ldi R30,0
0132 1E07 cpc R17,R30
0134 CCF3 brlt L4
0136 .dbline 159}
; }
0136 L3:
0136 0895 ret
0138 .dbsym r i 16 I
0138 .dbfunc s main _main fI
; uc_Counter -> R20
; uc_Input -> R22
.even
0138 _main::
0138 .dbline 170{
;
; /********************************************************************
; 主程序
; 从PORT C口读取按键数据(如:SL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -