?? 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 + -