📄 dtmf.lst
字号:
__text_start:
__start:
0054 E5CF LDI R28,0x5F
0055 E0D2 LDI R29,2
0056 BFCD OUT P3D,R28
0057 BFDE OUT P3E,R29
0058 51C0 SUBI R28,0x10
0059 40D0 SBCI R29,0
005A EA0A LDI R16,0xAA
005B 8308 STD R16,0+Y
005C 2400 CLR R0
005D E6E6 LDI R30,0x66
005E E0F0 LDI R31,0
005F E010 LDI R17,0
0060 36EA CPI R30,0x6A
0061 07F1 CPC R31,R17
0062 F011 BEQ 0x0065
0063 9201 ST R0,Z+
0064 CFFB RJMP 0x0060
0065 8300 STD R16,0+Z
0066 EAE2 LDI R30,0xA2
0067 E0F0 LDI R31,0
0068 E6A0 LDI R26,0x60
0069 E0B0 LDI R27,0
006A E010 LDI R17,0
006B 3AE8 CPI R30,0xA8
006C 07F1 CPC R31,R17
006D F021 BEQ 0x0072
006E 95C8 LPM
006F 9631 ADIW R30,1
0070 920D ST R0,X+
0071 CFF9 RJMP 0x006B
0072 D09D RCALL _main
_exit:
0073 CFFF RJMP _exit
_ISR_T1_Overflow:
0074 920A ST R0,-Y
0075 922A ST R2,-Y
0076 923A ST R3,-Y
0077 924A ST R4,-Y
0078 925A ST R5,-Y
0079 930A ST R16,-Y
007A 931A ST R17,-Y
007B 932A ST R18,-Y
007C 933A ST R19,-Y
007D 938A ST R24,-Y
007E 939A ST R25,-Y
007F 93EA ST R30,-Y
0080 93FA ST R31,-Y
0081 B60F IN R0,P3F
0082 920A ST R0,-Y
FILE: D:\ICC-AVR\examples.sl\DTMF\DTMF.c
(0000) /********************************************************
(0001) http://www.sl.com.cn
(0002) 双龙电子公司----双音频信号(DTMF)演示程序
(0003) 键盘布置图:
(0004) 1 2 3 A--PB4
(0005) 4 5 6 B--PB5
(0006) 7 8 9 C--PB6
(0007) * 0 # D--PB7
(0008) | | | |
(0009) P P P P
(0010) B B B B
(0011) 0 1 2 3
(0012) 喇叭接线图:PD5(OC1A)--1K电阻--喇叭
(0013) ********************************************************/
(0014) #include <io8515.h>
(0015) #include <macros.h>
(0016) #define Xtal 8000000 // 系统时钟频率
(0017) #define prescaler 1 // T1预分频系数
(0018) #define N_samples 128 // 在查找表中的样本数
(0019) #define Fck Xtal/prescaler // T1工作频率
(0020) #define delaycyc 10 // 读取port C口延时循环数
(0021) #pragma interrupt_handler ISR_T1_Overflow:7
(0022) /*************************** 正弦表 *****************************
(0023) 样本表: 一个周期分成128个点,每点按7位进行量化
(0024) ****************************************************************/
(0025) flash unsigned char auc_SinParam [128] = {
(0026) 64,67,
(0027) 70,73,
(0028) 76,79,
(0029) 82,85,
(0030) 88,91,
(0031) 94,96,
(0032) 99,102,
(0033) 104,106,
(0034) 109,111,
(0035) 113,115,
(0036) 117,118,
(0037) 120,121,
(0038) 123,124,
(0039) 125,126,
(0040) 126,127,
(0041) 127,127,
(0042) 127,127,
(0043) 127,127,
(0044) 126,126,
(0045) 125,124,
(0046) 123,121,
(0047) 120,118,
(0048) 117,115,
(0049) 113,111,
(0050) 109,106,
(0051) 104,102,
(0052) 99,96,
(0053) 94,91,
(0054) 88,85,
(0055) 82,79,
(0056) 76,73,
(0057) 70,67,
(0058) 64,60,
(0059) 57,54,
(0060) 51,48,
(0061) 45,42,
(0062) 39,36,
(0063) 33,31,
(0064) 28,25,
(0065) 23,21,
(0066) 18,16,
(0067) 14,12,
(0068) 10,9,
(0069) 7,6,
(0070) 4,3,
(0071) 2,1,
(0072) 1,0,
(0073) 0,0,
(0074) 0,0,
(0075) 0,0,
(0076) 1,1,
(0077) 2,3,
(0078) 4,6,
(0079) 7,9,
(0080) 10,12,
(0081) 14,16,
(0082) 18,21,
(0083) 23,25,
(0084) 28,31,
(0085) 33,36,
(0086) 39,42,
(0087) 45,48,
(0088) 51,54,
(0089) 57,60};
(0090)
(0091) //*************************** x_SW *************************
(0092) // x_SW 表(8倍): x_SW = ROUND(8*N_samples*f*510/Fck)
(0093) //************************************************************
(0094)
(0095) //高频(列)
(0096) //1209hz ---> x_SW = 79
(0097) //1336hz ---> x_SW = 87
(0098) //1477hz ---> x_SW = 96
(0099) //1633hz ---> x_SW = 107
(0100)
(0101) const unsigned char auc_frequencyH [4] = {
(0102) 107,96,
(0103) 87,79};
(0104)
(0105) //低频(行)
(0106) //697hz ---> x_SW = 46
(0107) //770hz ---> x_SW = 50
(0108) //852hz ---> x_SW = 56
(0109) //941hz ---> x_SW = 61
(0110)
(0111) const unsigned char auc_frequencyL [4] = {
(0112) 61,56,
(0113) 50,46};
(0114)
(0115)
(0116) //************************** 全局变量 ****************************
(0117) unsigned char x_SWa = 0x00; // 高频信号脉冲宽度
(0118) unsigned char x_SWb = 0x00; // 低频信号脉冲宽度
(0119) unsigned int X_LUTaExt = 0;
(0120) unsigned int X_LUTbExt = 0;
(0121) unsigned int X_LUTa;
(0122) unsigned int X_LUTb;
(0123)
(0124) /*****************************************************************
(0125) 定时器溢出中断服务程序
(0126) ******************************************************************/
(0127) void ISR_T1_Overflow (void)
(0128) {
(0129) X_LUTaExt += x_SWa;
0083 90200060 LDS R2,0x60
0085 2433 CLR R3
0086 90500063 LDS R5,0x63
0088 90400062 LDS R4,0x62
008A 0C42 ADD R4,R2
008B 1C53 ADC R5,R3
008C 92500063 STS R5,0x63
008E 92400062 STS R4,0x62
(0130) X_LUTbExt += x_SWb;
0090 90200061 LDS R2,0x61
0092 2433 CLR R3
0093 90500065 LDS R5,0x65
0095 90400064 LDS R4,0x64
0097 0C42 ADD R4,R2
0098 1C53 ADC R5,R3
0099 92500065 STS R5,0x65
009B 92400064 STS R4,0x64
(0131) // 数据规格化
(0132) X_LUTa = (char)(((X_LUTaExt+4) >> 3)&(0x007F));
009D E023 LDI R18,3
009E E030 LDI R19,0
009F 91100063 LDS R17,0x63
00A1 91000062 LDS R16,0x62
00A3 5F0C SUBI R16,0xFC
00A4 4F1F SBCI R17,0xFF
00A5 D0AC RCALL lsr16
00A6 2F80 MOV R24,R16
00A7 2F91 MOV R25,R17
00A8 778F ANDI R24,0x7F
00A9 7090 ANDI R25,0
00AA 2E28 MOV R2,R24
00AB 2433 CLR R3
00AC 92300069 STS R3,_X_LUTa+1
00AE 92200068 STS R2,_X_LUTa
(0133) X_LUTb = (char)(((X_LUTbExt+4) >> 3)&(0x007F));
00B0 E023 LDI R18,3
00B1 E030 LDI R19,0
00B2 91100065 LDS R17,0x65
00B4 91000064 LDS R16,0x64
00B6 5F0C SUBI R16,0xFC
00B7 4F1F SBCI R17,0xFF
00B8 D099 RCALL lsr16
00B9 2F80 MOV R24,R16
00BA 2F91 MOV R25,R17
00BB 778F ANDI R24,0x7F
00BC 7090 ANDI R25,0
00BD 2E28 MOV R2,R24
00BE 2433 CLR R3
00BF 92300067 STS R3,_X_LUTb+1
00C1 92200066 STS R2,_X_LUTb
(0134) // 计算 PWM 值: 高频值 + 3/4 低频值
(0135) OCR1A = (auc_SinParam[X_LUTa] + (auc_SinParam[X_LUTb]-(auc_SinParam[X_LUTb]>>2)));
00C3 E18A LDI R24,0x1A
00C4 E090 LDI R25,0
00C5 90300067 LDS R3,_X_LUTb+1
00C7 90200066 LDS R2,_X_LUTb
00C9 0E28 ADD R2,R24
00CA 1E39 ADC R3,R25
00CB 2DE2 MOV R30,R2
00CC 2DF3 MOV R31,R3
00CD 95C8 LPM
00CE 2C20 MOV R2,R0
00CF 2433 CLR R3
00D0 E022 LDI R18,2
00D1 E030 LDI R19,0
00D2 2D02 MOV R16,R2
00D3 2D13 MOV R17,R3
00D4 D084 RCALL asr16
00D5 1A20 SUB R2,R16
00D6 0A31 SBC R3,R17
00D7 E18A LDI R24,0x1A
00D8 E090 LDI R25,0
00D9 90500069 LDS R5,_X_LUTa+1
00DB 90400068 LDS R4,_X_LUTa
00DD 0E48 ADD R4,R24
00DE 1E59 ADC R5,R25
00DF 2DE4 MOV R30,R4
00E0 2DF5 MOV R31,R5
00E1 95C8 LPM
00E2 2C40 MOV R4,R0
00E3 2455 CLR R5
00E4 0C42 ADD R4,R2
00E5 1C53 ADC R5,R3
00E6 9250004B STS R5,0x4B
00E8 9240004A STS R4,0x4A
(0136) }
00EA 9009 LD R0,Y+
00EB BE0F OUT P3F,R0
00EC 91F9 LD R31,Y+
00ED 91E9 LD R30,Y+
00EE 9199 LD R25,Y+
00EF 9189 LD R24,Y+
00F0 9139 LD R19,Y+
00F1 9129 LD R18,Y+
00F2 9119 LD R17,Y+
00F3 9109 LD R16,Y+
00F4 9059 LD R5,Y+
00F5 9049 LD R4,Y+
00F6 9039 LD R3,Y+
00F7 9029 LD R2,Y+
00F8 9009 LD R0,Y+
00F9 9518 RETI
(0137)
(0138) /***********************************************************
(0139) 初始化
(0140) ***********************************************************/
(0141) void init (void)
(0142) {
(0143) MCUCR=0x00;
_init:
00FA 2422 CLR R2
00FB BE25 OUT P35,R2
(0144) TIMSK = 0x80; // T1 溢出中断使能
00FC E880 LDI R24,0x80
00FD BF89 OUT P39,R24
(0145) TCCR1A = (1<<COM1A1)+(1<<PWM10); // 不翻转、8位PWM
00FE E881 LDI R24,0x81
00FF BD8F OUT P2F,R24
(0146) TCCR1B = (1<<CS10); // 预分频系数为1、即CLK/1
0100 E081 LDI R24,1
0101 BD8E OUT P2E,R24
(0147) DDRD = (1 <<PD5); // PD5 (OC1A)用作输出
0102 E280 LDI R24,0x20
0103 BB81 OUT P11,R24
(0148) _SEI(); // 全局中断使能
0104 9478 BSET 7
(0149) }
0105 9508 RET
(0150)
(0151) /*********************************************************************
(0152) 为从PORT C口读取稳定的按键数据,所必须的延时程序(消抖延时)
(0153) *********************************************************************/
(0154) void Delay (void)
(0155) {
(0156) int i;
(0157) for (i = 0; i < delaycyc; i++) _NOP();
_Delay:
i --> R16
0106 2700 CLR R16
0107 2711 CLR R17
0108 0000 NOP
0109 5F0F SUBI R16,0xFF
010A 4F1F SBCI R17,0xFF
010B 300A CPI R16,0xA
010C E0E0 LDI R30,0
010D 071E CPC R17,R30
010E F3CC BLT 0x0108
(0158) }
010F 9508 RET
(0159)
(0160) /********************************************************************
(0161) 主程序
(0162) 从PORT C口读取按键数据(如:SL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -