📄 呼死你.lst
字号:
01DA 9029 LD R2,Y+
01DB BE2F OUT 0x3F,R2
01DC 91F9 LD R31,Y+
01DD 91E9 LD R30,Y+
01DE 9199 LD R25,Y+
01DF 9189 LD R24,Y+
01E0 9129 LD R18,Y+
01E1 9109 LD R16,Y+
01E2 9029 LD R2,Y+
01E3 9518 RETI
_QueryState:
count --> R20
addrssend --> R22
01E4 D1D5 RCALL push_gset2
01E5 2F60 MOV R22,R16
01E6 9721 SBIW R28,1
(0175) }
(0176) /*************************************************
(0177) *原型:void QueryState(void)
(0178) *功能:根据*ECAV的内容判断通话是否成功
(0179) *说明:无
(0180) *参数:uchar addrssend
(0181) *返回:无
(0182) **************************************************/
(0183) void QueryState(uchar addrssend)
(0184) {
(0185) uchar count;
(0186)
(0187) if(count=Bj_rx(addrssend,',',0))
01E7 2422 CLR R2
01E8 8228 STD Y+0,R2
01E9 E22C LDI R18,0x2C
01EA 2F06 MOV R16,R22
01EB DF10 RCALL _Bj_rx
01EC 2F40 MOV R20,R16
01ED 2344 TST R20
01EE F0C9 BEQ 0x0208
(0188) {
(0189) count = count = Bj_rx(addrssend,',',++count);
01EF 2F84 MOV R24,R20
01F0 5F8F SUBI R24,0xFF
01F1 2E28 MOV R2,R24
01F2 8228 STD Y+0,R2
01F3 E22C LDI R18,0x2C
01F4 2F06 MOV R16,R22
01F5 DF06 RCALL _Bj_rx
01F6 2F40 MOV R20,R16
(0190) count ++;
01F7 9543 INC R20
(0191) if(Uart.Buf[count] == '0')
01F8 E987 LDI R24,0x97
01F9 E090 LDI R25,0
01FA 2FE4 MOV R30,R20
01FB 27FF CLR R31
01FC 0FE8 ADD R30,R24
01FD 1FF9 ADC R31,R25
01FE 8180 LDD R24,Z+0
01FF 3380 CPI R24,0x30
0200 F451 BNE 0x020B
(0192) {//接听马上挂机
(0193) WorkCount = RINGOFF;
0201 E085 LDI R24,5
0202 93800184 STS WorkCount,R24
(0194) Time.Sec = 1;
0204 E081 LDI R24,1
0205 9380008F STS Time,R24
(0195) }
(0196) }
0207 C003 RJMP 0x020B
(0197) else //发送挂机命令
(0198) {
(0199) WorkCount = RINGOFF;//
0208 E085 LDI R24,5
0209 93800184 STS WorkCount,R24
(0200) }
020B 9621 ADIW R28,1
020C D1A1 RCALL pop_gset2
020D 9508 RET
_DealRxBuf:
count --> R22
addrss --> R20
020E D1A9 RCALL push_gset3
020F 2F40 MOV R20,R16
0210 9721 SBIW R28,1
(0201) }
(0202) /*************************************************
(0203) *原型:void Deal_rx(void)
(0204) *功能:处理接收到的数据
(0205) *说明:无
(0206) *参数:uchar addrss-双音计数
(0207) *返回:无
(0208) **************************************************/
(0209) void DealRxBuf(uchar addrss)
(0210) {
(0211) unsigned char count = NULL;
0211 2766 CLR R22
(0212)
(0213) CLR_BIT(UCSRB,RXCIE);//关接收
0212 9857 CBI 0x0A,7
(0214)
(0215) switch(WorkCount)//任务指示器
0213 90A00184 LDS R10,WorkCount
0215 24BB CLR R11
0216 20AA TST R10
0217 F411 BNE 0x021A
0218 20BB TST R11
0219 F0D1 BEQ 0x0234
021A 01C5 MOVW R24,R10
021B 3081 CPI R24,1
021C E0E0 LDI R30,0
021D 079E CPC R25,R30
021E F0A9 BEQ 0x0234
021F 3082 CPI R24,2
0220 E0E0 LDI R30,0
0221 079E CPC R25,R30
0222 F0B9 BEQ 0x023A
0223 3083 CPI R24,3
0224 E0E0 LDI R30,0
0225 079E CPC R25,R30
0226 F129 BEQ 0x024C
0227 3084 CPI R24,4
0228 E0E0 LDI R30,0
0229 079E CPC R25,R30
022A F159 BEQ 0x0256
022B 3085 CPI R24,5
022C E0E0 LDI R30,0
022D 079E CPC R25,R30
022E F159 BEQ 0x025A
022F 3086 CPI R24,6
0230 E0E0 LDI R30,0
0231 079E CPC R25,R30
0232 F101 BEQ 0x0253
0233 C048 RJMP 0x027C
(0216) {
(0217) case LINE:
(0218) case SETUPTEL:
(0219) WorkCount++;
0234 91800184 LDS R24,WorkCount
0236 5F8F SUBI R24,0xFF
0237 93800184 STS WorkCount,R24
(0220) break;
0239 C042 RJMP 0x027C
(0221) case RTEL:
(0222) //在数组从COUNT开始到ADDRSS内查找一个字符,无找到返回0
(0223) if(count=Bj_rx(addrss,'"',count))
023A 8368 STD Y+0,R22
023B E222 LDI R18,0x22
023C 2F04 MOV R16,R20
023D DEBE RCALL _Bj_rx
023E 2F60 MOV R22,R16
023F 2366 TST R22
0240 F409 BNE 0x0242
0241 C03A RJMP 0x027C
(0224) {
(0225) Save_tel(count,TelBuf); //读出电话本与定时时间
0242 E52F LDI R18,0x5F
0243 E031 LDI R19,1
0244 DEFE RCALL _Save_tel
(0226) WorkCount = CALLTEL;//有读到电话本马上去拔号处理
0245 E083 LDI R24,3
0246 93800184 STS WorkCount,R24
(0227) DealTxUartBz = TRUE;//如果未读到电话本,红灯亮
0248 E081 LDI R24,1
0249 9380017E STS DealTxUartBz,R24
(0228) }
(0229) break;
024B C030 RJMP 0x027C
(0230) case CALLTEL://拔号成功,接着查询状态
(0231) WorkCount = QUERY;
024C E086 LDI R24,6
024D 93800184 STS WorkCount,R24
(0232) Time.Sec = timesec;//2000ms
024F E184 LDI R24,0x14
0250 9380008F STS Time,R24
(0233) break;
0252 C029 RJMP 0x027C
(0234) case QUERY://根据回应分析状态
(0235) QueryState(addrss);
0253 2F04 MOV R16,R20
0254 DF8F RCALL _QueryState
(0236) break;
0255 C026 RJMP 0x027C
(0237) case GET://有来电接听挂断
(0238) WorkCount = RINGOFF;
0256 E085 LDI R24,5
0257 93800184 STS WorkCount,R24
(0239) break;
0259 C022 RJMP 0x027C
(0240) case RINGOFF://发挂机命令成功
(0241) Time.Mec = Time.Min = NULL;
025A 2422 CLR R2
025B 2433 CLR R3
025C 92300093 STS 0x93,R3
025E 92200092 STS Time+3,R2
0260 92300095 STS 0x95,R3
0262 92200094 STS 0x94,R2
(0242)
(0243) Time.Sec = time3sec;//定时3秒
0264 E18E LDI R24,0x1E
0265 9380008F STS Time,R24
(0244) if(!Time.Atd)//如果无定时,直接拔打下一个
0267 90200090 LDS R2,Time+1
0269 90300091 LDS R3,Time+2
026B 2022 TST R2
026C F449 BNE 0x0276
026D 2033 TST R3
026E F439 BNE 0x0276
(0245) {
(0246) Time.Sec = timesec;
026F E184 LDI R24,0x14
0270 9380008F STS Time,R24
(0247) WorkCount = CALLTEL;
0272 E083 LDI R24,3
0273 93800184 STS WorkCount,R24
(0248) }
0275 C003 RJMP 0x0279
(0249) else //否则定时未到,等待定时到再拔号
(0250) {
(0251) WorkCount = NULLACK;
0276 E087 LDI R24,7
0277 93800184 STS WorkCount,R24
(0252) }
(0253) Busybz = FALSE;
0279 2422 CLR R2
027A 92200183 STS Busybz,R2
(0254) break;
(0255) }
(0256) UART_RXHEAD = NULL; //接收器指向头
027C 2422 CLR R2
027D 92200180 STS UART_RXHEAD,R2
(0257) DealRxUartBz = FALSE; //串口接收处理标志清0
027F 9220017F STS DealRxUartBz,R2
(0258) SET_BIT(UCSRB,RXCIE); //开接收
0281 9A57 SBI 0x0A,7
0282 9621 ADIW R28,1
0283 D12C RCALL pop_gset3
0284 9508 RET
_DealTx:
0285 D136 RCALL push_gset1
(0259) }
(0260) /**************************************************
(0261) *原型:void InitUART(void)
(0262) *功能:初始化UART,接收中断开,接收/发送口开
(0263) *参数:速率为19.2k,8位数据+1位STOP位,bandrate
(0264) *返回:无
(0265) **************************************************/
(0266) void DealTx(void)
(0267) {
(0268) switch(WorkCount)
0286 91400184 LDS R20,WorkCount
0288 2755 CLR R21
0289 3040 CPI R20,0
028A 0745 CPC R20,R21
028B F0D9 BEQ 0x02A7
028C 3041 CPI R20,1
028D E0E0 LDI R30,0
028E 075E CPC R21,R30
028F F0D9 BEQ 0x02AB
0290 3042 CPI R20,2
0291 E0E0 LDI R30,0
0292 075E CPC R21,R30
0293 F0D9 BEQ 0x02AF
0294 3043 CPI R20,3
0295 E0E0 LDI R30,0
0296 075E CPC R21,R30
0297 F0D9 BEQ 0x02B3
0298 3044 CPI R20,4
0299 E0E0 LDI R30,0
029A 075E CPC R21,R30
029B F409 BNE 0x029D
029C C033 RJMP 0x02D0
029D 3045 CPI R20,5
029E E0E0 LDI R30,0
029F 075E CPC R21,R30
02A0 F409 BNE 0x02A2
02A1 C032 RJMP 0x02D4
02A2 3046 CPI R20,6
02A3 E0E0 LDI R30,0
02A4 075E CPC R21,R30
02A5 F119 BEQ 0x02C9
02A6 C030 RJMP 0x02D7
(0269) {
(0270) case LINE://建立连接
(0271) puts("ATE0");
02A7 E807 LDI R16,0x87
02A8 E010 LDI R17,0
02A9 DE30 RCALL _puts
(0272) break;
02AA C02C RJMP 0x02D7
(0273)
(0274) case SETUPTEL:
(0275) puts("AT+CPBS=\"SM\"");
02AB E70A LDI R16,0x7A
02AC E010 LDI R17,0
02AD DE2C RCALL _puts
(0276) break;
02AE C028 RJMP 0x02D7
(0277)
(0278) case RTEL://查找电话本
(0279)
(0280) puts("AT+CPBR=1");
02AF E700 LDI R16,0x70
02B0 E010 LDI R17,0
02B1 DE28 RCALL _puts
(0281) break;
02B2 C024 RJMP 0x02D7
(0282)
(0283) case CALLTEL://在报警时发拔号命令
(0284) //拔号定时重新清0
(0285) puts("ATH");
02B3 E60C LDI R16,0x6C
02B4 E010 LDI R17,0
02B5 DE24 RCALL _puts
(0286) delay_ms(1500);
02B6 ED0C LDI R16,0xDC
02B7 E015 LDI R17,5
02B8 DD98 RCALL _delay_ms
(0287) DealRxUartBz =FALSE;
02B9 2422 CLR R2
02BA 9220017F STS DealRxUartBz,R2
(0288) WorkCount = CALLTEL;
02BC E083 LDI R24,3
02BD 93800184 STS WorkCount,R24
(0289) Time.Sec = time3sec;//定时3秒
02BF E18E LDI R24,0x1E
02C0 9380008F STS Time,R24
(0290) puts(TelBuf);
02C2 E50F LDI R16,0x5F
02C3 E011 LDI R17,1
02C4 DE15 RCALL _puts
(0291) Busybz = TRUE;//忙标志置1
02C5 E081 LDI R24,1
02C6 93800183 STS Busybz,R24
(0292) break;
02C8 C00E RJMP 0x02D7
(0293)
(0294) case QUERY://查询拔号状态
(0295) puts("AT+CLCC");
02C9 E604 LDI R16,0x64
02CA E010 LDI R17,0
02CB DE0E RCALL _puts
(0296) Time.Sec = timesec;
02CC E184 LDI R24,0x14
02CD 9380008F STS Time,R24
(0297) break;
02CF C007 RJMP 0x02D7
(0298) case GET://接听
(0299) puts("ATA");//发送摘机命令
02D0 E600 LDI R16,0x60
02D1 E010 LDI R17,0
02D2 DE07 RCALL _puts
(0300) break;
02D3 C003 RJMP 0x02D7
(0301) case RINGOFF://挂机
(0302) puts("ATH");
02D4 E60C LDI R16,0x6C
02D5 E010 LDI R17,0
02D6 DE03 RCALL _puts
(0303) break;
(0304) }
(0305)
(0306) DealTxUartBz = FALSE; //已发送完,把发送标志清0
02D7 2422 CLR R2
02D8 9220017E STS DealTxUartBz,R2
(0307) UART_RXHEAD = NULL;
02DA 92200180 STS UART_RXHEAD,R2
02DC D0E2 RCALL pop_gset1
02DD 9508 RET
FILE: D:\MEGA8\西门子3508\3508呼死你\timetask.h
(0001)
(0002)
(0003) //TIMER1 initialize - prescale:256
(0004) // WGM: 0) Normal, TOP=0xFFFF
(0005) // desired value: 100mSec
(0006) // actual value: 100.000mSec (0.0%)
(0007) void timer1_init(void)
(0008) {
(0009) TCCR1B = 0x00; //stop
_timer1_init:
02DE 2422 CLR R2
02DF BC2E OUT 0x2E,R2
(0010) TCNT1H = 0xF4; //setup
02E0 EF84 LDI R24,0xF4
02E1 BD8D OUT 0x2D,R24
(0011) TCNT1L = 0xC0;
02E2 EC80 LDI R24,0xC0
02E3 BD8C OUT 0x2C,R24
(0012) OCR1AH = 0x0B;
02E4 E08B LDI R24,0xB
02E5 BD8B OUT 0x2B,R24
(0013) OCR1AL = 0x40;
02E6 E480 LDI R24,0x40
02E7 BD8A OUT 0x2A,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -