📄 detectaphone.lst
字号:
__text_start:
__start:
00DA E5CF LDI R28,0x5F
00DB E0D4 LDI R29,4
00DC BFCD OUT 0x3D,R28
00DD BFDE OUT 0x3E,R29
00DE 51C0 SUBI R28,0x10
00DF 40D0 SBCI R29,0
00E0 EA0A LDI R16,0xAA
00E1 8308 STD Y+0,R16
00E2 2400 CLR R0
00E3 EAE5 LDI R30,0xA5
00E4 E0F0 LDI R31,0
00E5 E011 LDI R17,1
00E6 3DE7 CPI R30,0xD7
00E7 07F1 CPC R31,R17
00E8 F011 BEQ 0x00EB
00E9 9201 ST R0,Z+
00EA CFFB RJMP 0x00E6
00EB 8300 STD Z+0,R16
00EC E6EF LDI R30,0x6F
00ED E0F1 LDI R31,1
00EE E6A0 LDI R26,0x60
00EF E0B0 LDI R27,0
00F0 E011 LDI R17,1
00F1 3BE4 CPI R30,0xB4
00F2 07F1 CPC R31,R17
00F3 F021 BEQ 0x00F8
00F4 95C8 LPM
00F5 9631 ADIW R30,1
00F6 920D ST R0,X+
00F7 CFF9 RJMP 0x00F1
00F8 D3DE RCALL _main
_exit:
00F9 CFFF RJMP _exit
_uart0_rx_isr:
j --> R16
i --> R16
00FA 922A ST R2,-Y
00FB 923A ST R3,-Y
00FC 930A ST R16,-Y
00FD 938A ST R24,-Y
00FE 939A ST R25,-Y
00FF 93EA ST R30,-Y
0100 93FA ST R31,-Y
0101 B62F IN R2,0x3F
0102 922A ST R2,-Y
FILE: D:\MyProject\SMS-MC55\Code\窃听器delay\main.c
(0001) ////////////////////////////////////////////////////////////////////////////////
(0002) // ICC-AVR application builder : 2006-6-25 下午 06:02:39
(0003) // Target : M8
(0004) // Crystal: 3.6864Mhz
(0005) // Author: Anwarye
(0006) // Title: Detcetaphone
(0007) ////////////////////////////////////////////////////////////////////////////////
(0008)
(0009) #include <iom8v.h>
(0010) #include <macros.h>
(0011) #include "var.h"
(0012)
(0013) #define XTAL == 3.6864M
(0014)
(0015) ////////////////////////////////////////////////////////////////////////////////
(0016) #pragma interrupt_handler uart0_rx_isr:12
(0017) void uart0_rx_isr(void)
(0018) {
(0019) unsigned char i,j;
(0020) if(UDR == 0x0A)
0103 B18C IN R24,0x0C
0104 308A CPI R24,0xA
0105 F409 BNE 0x0107
(0021) {
(0022) return; // 收到0x0A直接丢弃
0106 C07A RJMP 0x0181
(0023) }
(0024)
(0025) i = RxIndex;
0107 910000C6 LDS R16,RxIndex
(0026) j = RxIndex-1;
0109 910000C6 LDS R16,RxIndex
010B 5001 SUBI R16,1
(0027) if((RxBuf[0] == 0x30) && (RxBuf[1] == 0x0D))
010C 918000C7 LDS R24,RxBuf
010E 3380 CPI R24,0x30
010F F499 BNE 0x0123
0110 918000C8 LDS R24,RxBuf+1
0112 308D CPI R24,0xD
0113 F479 BNE 0x0123
(0028) {
(0029) RxIndexTail = RxIndex; // 保存接收缓冲指针尾
0114 902000C6 LDS R2,RxIndex
0116 9220006C STS RxIndexTail,R2
(0030) RxIndex = 0; // 接收缓冲指针归零
0118 2422 CLR R2
0119 922000C6 STS RxIndex,R2
(0031) RxStatus = 1; // 接收完成标志置位
011B E081 LDI R24,1
011C 9380006D STS RxStatus,R24
(0032) OkFlag = 1;
011E 9380006F STS OkFlag,R24
(0033) error = 0;
0120 92200076 STS error,R2
(0034) return;
0122 C05E RJMP 0x0181
(0035) }
(0036) if((RxBuf[0] == 0x32) && (RxBuf[1] == 0x0D)) // 收到来电信号,来电标志置位
0123 918000C7 LDS R24,RxBuf
0125 3382 CPI R24,0x32
0126 F479 BNE 0x0136
0127 918000C8 LDS R24,RxBuf+1
0129 308D CPI R24,0xD
012A F459 BNE 0x0136
(0037) {
(0038) CallInFlag = 1; // 置电话呼入标志
012B E081 LDI R24,1
012C 93800070 STS CallInFlag,R24
(0039) RxIndex = 0;
012E 2422 CLR R2
012F 922000C6 STS RxIndex,R2
(0040) RxStatus = 1;
0131 9380006D STS RxStatus,R24
(0041) OkFlag = 1;
0133 9380006F STS OkFlag,R24
(0042) return;
0135 C04B RJMP 0x0181
(0043) }
(0044) else if((RxBuf[0] == 0x33) && (RxBuf[1] == 0x0D)) // 被叫号码忙 或者挂机 主叫挂机
0136 918000C7 LDS R24,RxBuf
0138 3383 CPI R24,0x33
0139 F479 BNE 0x0149
013A 918000C8 LDS R24,RxBuf+1
013C 308D CPI R24,0xD
013D F459 BNE 0x0149
(0045) {
(0046) BusyFlag = 1; // 置电话呼入标志
013E E081 LDI R24,1
013F 93800072 STS BusyFlag,R24
(0047) RxIndex = 0;
0141 2422 CLR R2
0142 922000C6 STS RxIndex,R2
(0048) RxStatus = 1;
0144 9380006D STS RxStatus,R24
(0049) OkFlag = 1;
0146 9380006F STS OkFlag,R24
(0050) return;
0148 C038 RJMP 0x0181
(0051) }
(0052) else if((RxBuf[0] == 0x37) && (RxBuf[1] == 0x0D)) // 收到来电信号,来电标志置位
0149 918000C7 LDS R24,RxBuf
014B 3387 CPI R24,0x37
014C F479 BNE 0x015C
014D 918000C8 LDS R24,RxBuf+1
014F 308D CPI R24,0xD
0150 F459 BNE 0x015C
(0053) {
(0054) NoCarrierFlag = 1; // 置电话呼入标志 NO CARRIER
0151 E081 LDI R24,1
0152 93800071 STS NoCarrierFlag,R24
(0055) RxIndex = 0;
0154 2422 CLR R2
0155 922000C6 STS RxIndex,R2
(0056) RxStatus = 1;
0157 9380006D STS RxStatus,R24
(0057) OkFlag = 1;
0159 9380006F STS OkFlag,R24
(0058) return;
015B C025 RJMP 0x0181
(0059) }
(0060) else if((RxBuf[0] == 0x34) && (RxBuf[1] == 0x0D)) // 收到来电信号,来电标志置位
015C 918000C7 LDS R24,RxBuf
015E 3384 CPI R24,0x34
015F F479 BNE 0x016F
0160 918000C8 LDS R24,RxBuf+1
0162 308D CPI R24,0xD
0163 F459 BNE 0x016F
(0061) {
(0062) RxIndex = 0;
0164 2422 CLR R2
0165 922000C6 STS RxIndex,R2
(0063) RxStatus = 1;
0167 E081 LDI R24,1
0168 9380006D STS RxStatus,R24
(0064) OkFlag = 1;
016A 9380006F STS OkFlag,R24
(0065) error = 1;
016C 93800076 STS error,R24
(0066) return;
016E C012 RJMP 0x0181
(0067) }
(0068) else
(0069) {
(0070)
(0071) RxBuf[RxIndex++] = UDR; // 继续接收数据放入接收缓冲
016F 902000C6 LDS R2,RxIndex
0171 2433 CLR R3
0172 2D82 MOV R24,R2
0173 5F8F SUBI R24,0xFF
0174 938000C6 STS RxIndex,R24
0176 EC87 LDI R24,0xC7
0177 E090 LDI R25,0
0178 2DE2 MOV R30,R2
0179 27FF CLR R31
017A 0FE8 ADD R30,R24
017B 1FF9 ADC R31,R25
017C B02C IN R2,0x0C
017D 8220 STD Z+0,R2
(0072) RxStatus = 0; // 串口接收中
017E 2422 CLR R2
017F 9220006D STS RxStatus,R2
(0073) // return; // 结束接收,直接跳出
(0074) }
0181 9029 LD R2,Y+
0182 BE2F OUT 0x3F,R2
0183 91F9 LD R31,Y+
0184 91E9 LD R30,Y+
0185 9199 LD R25,Y+
0186 9189 LD R24,Y+
0187 9109 LD R16,Y+
0188 9039 LD R3,Y+
0189 9029 LD R2,Y+
018A 9518 RETI
_uart0_tx_isr:
018B 922A ST R2,-Y
018C 938A ST R24,-Y
018D 939A ST R25,-Y
018E 93EA ST R30,-Y
018F 93FA ST R31,-Y
0190 B62F IN R2,0x3F
0191 922A ST R2,-Y
(0075) }
(0076)
(0077) ////////////////////////////////////////////////////////////////////////////////
(0078) #pragma interrupt_handler uart0_tx_isr:14
(0079) void uart0_tx_isr(void)
(0080) {
(0081)
(0082) if(!TxStatus) // 本帧数据未发完,则继续发送
0192 9020006E LDS R2,TxStatus
0194 2022 TST R2
0195 F449 BNE 0x019F
(0083) {
(0084) //while ( !(UCSRA & (1<<UDRE)) ); // 等待UDR空
(0085) UDR = TxBuf[TxIndex];
0196 EA86 LDI R24,0xA6
0197 E090 LDI R25,0
0198 91E000A5 LDS R30,TxIndex
019A 27FF CLR R31
019B 0FE8 ADD R30,R24
019C 1FF9 ADC R31,R25
019D 8020 LDD R2,Z+0
019E B82C OUT 0x0C,R2
(0086) }
(0087) if((TxBuf[TxIndex] == 0x0D) || (TxBuf[TxIndex] == 0x1A)) // 本帧数据发送结束
019F EA86 LDI R24,0xA6
01A0 E090 LDI R25,0
01A1 91E000A5 LDS R30,TxIndex
01A3 27FF CLR R31
01A4 0FE8 ADD R30,R24
01A5 1FF9 ADC R31,R25
01A6 8180 LDD R24,Z+0
01A7 308D CPI R24,0xD
01A8 F051 BEQ 0x01B3
01A9 EA86 LDI R24,0xA6
01AA E090 LDI R25,0
01AB 91E000A5 LDS R30,TxIndex
01AD 27FF CLR R31
01AE 0FE8 ADD R30,R24
01AF 1FF9 ADC R31,R25
01B0 8180 LDD R24,Z+0
01B1 318A CPI R24,0x1A
01B2 F441 BNE 0x01BB
(0088) {
(0089) TxStatus = 1; // 发送完成状态标志置位
01B3 E081 LDI R24,1
01B4 9380006E STS TxStatus,R24
(0090) TxIndex = 0; // 发送缓冲区指针归零
01B6 2422 CLR R2
01B7 922000A5 STS TxIndex,R2
(0091) UCSRB &= ~((1<<TXCIE));//|(1<<TXEN)); // 关发送中断
01B9 9856 CBI 0x0A,6
(0092) return;
01BA C005 RJMP 0x01C0
(0093) }
(0094) TxIndex++;
01BB 918000A5 LDS R24,TxIndex
01BD 5F8F SUBI R24,0xFF
01BE 938000A5 STS TxIndex,R24
01C0 9029 LD R2,Y+
01C1 BE2F OUT 0x3F,R2
01C2 91F9 LD R31,Y+
01C3 91E9 LD R30,Y+
01C4 9199 LD R25,Y+
01C5 9189 LD R24,Y+
01C6 9029 LD R2,Y+
01C7 9518 RETI
(0095) }
(0096) unsigned char CheckRx(void)
(0097) {
(0098) unsigned char i,j;
(0099) i = RxIndex;
_CheckRx:
j --> R18
i --> R16
01C8 910000C6 LDS R16,RxIndex
(0100) j = RxIndex - 1;
01CA 912000C6 LDS R18,RxIndex
01CC 5021 SUBI R18,1
(0101) if(( RxBuf[j] == 0x30) && (RxBuf[i] == 0x0D))
01CD EC87 LDI R24,0xC7
01CE E090 LDI R25,0
01CF 2FE2 MOV R30,R18
01D0 27FF CLR R31
01D1 0FE8 ADD R30,R24
01D2 1FF9 ADC R31,R25
01D3 8180 LDD R24,Z+0
01D4 3380 CPI R24,0x30
01D5 F471 BNE 0x01E4
01D6 EC87 LDI R24,0xC7
01D7 E090 LDI R25,0
01D8 2FE0 MOV R30,R16
01D9 27FF CLR R31
01DA 0FE8 ADD R30,R24
01DB 1FF9 ADC R31,R25
01DC 8180 LDD R24,Z+0
01DD 308D CPI R24,0xD
01DE F429 BNE 0x01E4
(0102) {
(0103) RxIndex = 0;
01DF 2422 CLR R2
01E0 922000C6 STS RxIndex,R2
(0104) return (1);
01E2 E001 LDI R16,1
01E3 C001 RJMP 0x01E5
(0105) }
(0106) else
(0107) {
(0108) return (0);
01E4 2700 CLR R16
01E5 9508 RET
(0109) }
(0110) }
(0111) /*-----------------------------------------------------------------------*/
(0112) /////////////////////////// 清除接收缓冲 ////////////////////////////////
(0113) /*-----------------------------------------------------------------------*/
(0114) void ClearRxBuf(void)
(0115) {
(0116) unsigned char i;
(0117) for(i=0;i<128;i++)
_ClearRxBuf:
i --> R16
01E6 2700 CLR R16
01E7 C009 RJMP 0x01F1
(0118) {
(0119) RxBuf[i] = 0;
01E8 EC87 LDI R24,0xC7
01E9 E090 LDI R25,0
01EA 2FE0 MOV R30,R16
01EB 27FF CLR R31
01EC 0FE8 ADD R30,R24
01ED 1FF9 ADC R31,R25
01EE 2422 CLR R2
01EF 8220 STD Z+0,R2
01F0 9503 INC R16
01F1 3800 CPI R16,0x80
01F2 F3A8 BCS 0x01E8
01F3 9508 RET
(0120) }
(0121) }
(0122) /*-----------------------------------------------------------------------*/
(0123) /////////////////////////// 串口发送使能 ////////////////////////////////
(0124) /*-----------------------------------------------------------------------*/
(0125) void TxEnable(void)
(0126) {
(0127) //RxIndex = 0;
(0128) UDR = TxBuf[0]; // 发送缓冲头送入串口发送寄存器,激活开始发送
_TxEnable:
01F4 902000A6 LDS R2,TxBuf
01F6 B82C OUT 0x0C,R2
(0129) UCSRB |= ((1<<TXCIE));//|(1<<TXEN));
01F7 9A56 SBI 0x0A,6
01F8 9508 RET
_Put_AT_command:
count --> R20
atlen --> R22
atc --> R10
01F9 D357 RCALL push_gset3
01FA 2F62 MOV R22,R18
01FB 0158 MOVW R10,R16
(0130) }
(0131) /*-----------------------------------------------------------------------*/
(0132) ///////////////////////////// 发送AT命令 /////////////////////////////////
(0133) /*-----------------------------------------------------------------------*/
(0134) void Put_AT_command(const unsigned char *atc, unsigned char atlen)
(0135) {
(0136) unsigned char count;
(0137)
(0138) for(count = 0;count < atlen;count++) // AT命令窜移入发送缓冲
01FC 2744 CLR R20
01FD C00D RJMP 0x020B
(0139) {
(0140) TxBuf[count] = atc[count];
01FE 2FE4 MOV R30,R20
01FF 27FF CLR R31
0200 0DEA ADD R30,R10
0201 1DFB ADC R31,R11
0202 91E4 LPM R30,0(Z)
0203 EA86 LDI R24,0xA6
0204 E090 LDI R25,0
0205 2FA4 MOV R26,R20
0206 27BB CLR R27
0207 0FA8 ADD R26,R24
0208 1FB9 ADC R27,R25
0209 93EC ST R30,0(X)
020A 9543 INC R20
020B 1746 CP R20,R22
020C F388 BCS 0x01FE
(0141) }
(0142)
(0143) TxBuf[atlen] = 0x0D; // 发送缓冲窜结尾加“回车”
020D EA86 LDI R24,0xA6
020E E090 LDI R25,0
020F 2FE6 MOV R30,R22
0210 27FF CLR R31
0211 0FE8 ADD R30,R24
0212 1FF9 ADC R31,R25
0213 E08D LDI R24,0xD
0214 8380 STD Z+0,R24
(0144) TxBuf[atlen + 1] = 0x00; // 发送缓冲窜结束符号
0215 EA87 LDI R24,0xA7
0216 E090 LDI R25,0
0217 2FE6 MOV R30,R22
0218 27FF CLR R31
0219 0FE8 ADD R30,R24
021A 1FF9 ADC R31,R25
021B 2422 CLR R2
021C 8220 STD Z+0,R2
(0145)
(0146) OkFlag = 0;
021D 9220006F STS OkFlag,R2
(0147) TxStatus = 0;
021F 9220006E STS TxStatus,R2
(0148) TxIndex = 1; // 发送指针偏移1
0221 E081 LDI R24,1
0222 938000A5 STS TxIndex,R24
(0149) TxEnable(); // 激活发送
0224 DFCF RCALL _TxEnable
(0150) while(!TxStatus); // 等代发送结束,发送缓冲指针为零则可以发送
0225 9020006E LDS R2,TxStatus
0227 2022 TST R2
0228 F3E1 BEQ 0x0225
(0151) DelayMs(20);
0229 E104 LDI R16,0x14
022A E010 LDI R17,0
022B D2B1 RCALL _DelayMs
(0152) while(!OkFlag); // 收到模块返回OK,命令结束
022C 9020006F LDS R2,OkFlag
022E 2022 TST R2
022F F3E1 BEQ 0x022C
(0153) OkFlag = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -