📄 呼死你.lst
字号:
(0037) }
(0038) putchar(0x0D);//回车换行
00E6 E00D LDI R16,0xD
00E7 DFEE RCALL _putchar
(0039) putchar(0x0A);
00E8 E00A LDI R16,0xA
00E9 DFEC RCALL _putchar
00EA D2D4 RCALL pop_gset1
00EB 9508 RET
_putgmgr:
s --> R20
00EC D2CF RCALL push_gset1
00ED 01A8 MOVW R20,R16
(0040) }
(0041) void putgmgr(char *s)
(0042) {
00EE C005 RJMP 0x00F4
(0043) while (*s)
(0044) {
(0045) putchar(*s);
00EF 01FA MOVW R30,R20
00F0 8100 LDD R16,Z+0
00F1 DFE4 RCALL _putchar
(0046) s++;
00F2 5F4F SUBI R20,0xFF
00F3 4F5F SBCI R21,0xFF
00F4 01FA MOVW R30,R20
00F5 8020 LDD R2,Z+0
00F6 2022 TST R2
00F7 F7B9 BNE 0x00EF
(0047) }
(0048) putchar(0x1a);//^z
00F8 E10A LDI R16,0x1A
00F9 DFDC RCALL _putchar
00FA D2C4 RCALL pop_gset1
00FB 9508 RET
_Bj_rx:
count_1 --> R20
data --> R18
addrss_1 --> R16
00FC D2BF RCALL push_gset1
00FD 814A LDD R20,Y+2
(0049) }
(0050) /*************************************************
(0051) *原型:unsigned char Bj_rx(uchar addrss_1,uchar data,uchar count_1)
(0052) *功能:在数组内查找一个字符
(0053) *说明:如果有找到返回地址,无返回0
(0054) *参数:addrss,data
(0055) *返回:addrss or 0
(0056) **************************************************/
(0057) unsigned char Bj_rx(uchar addrss_1,uchar data,uchar count_1)
(0058) {
(0059) for( ;count_1<addrss_1;count_1++)
00FE C00C RJMP 0x010B
(0060) {
(0061) //判断SIM卡有无预存号
(0062) if(Uart.Buf[count_1] == data)
00FF E987 LDI R24,0x97
0100 E090 LDI R25,0
0101 2FE4 MOV R30,R20
0102 27FF CLR R31
0103 0FE8 ADD R30,R24
0104 1FF9 ADC R31,R25
0105 8020 LDD R2,Z+0
0106 1622 CP R2,R18
0107 F411 BNE 0x010A
(0063) return count_1;
0108 2F04 MOV R16,R20
0109 C004 RJMP 0x010E
010A 9543 INC R20
010B 1740 CP R20,R16
010C F390 BCS 0x00FF
(0064) }
(0065) return 0;
010D 2700 CLR R16
010E D2B0 RCALL pop_gset1
010F 9508 RET
(0066) }
(0067) /*************************************************
(0068) *原型:void CopyStr(uchar *p,uchar *s)
(0069) *功能:把字符串s拷贝在p
(0070) *说明:无
(0071) *参数:*p,*S
(0072) *返回:指针地址
(0073) *日期:06-01-16
(0074) **************************************************/
(0075) uchar *CopyStr(uchar *p,uchar *s)
(0076) {
(0077) do
(0078) {
(0079) *p ++ =*s++;
_CopyStr:
s --> R18
p --> R16
0110 01F9 MOVW R30,R18
0111 01D8 MOVW R26,R16
0112 9001 LD R0,Z+
0113 019F MOVW R18,R30
0114 920D ST R0,X+
0115 018D MOVW R16,R26
(0080) }
(0081) while((*s != NULL)&&(*s != 0x0d));
0116 01F9 MOVW R30,R18
0117 8020 LDD R2,Z+0
0118 2433 CLR R3
0119 2022 TST R2
011A F019 BEQ 0x011E
011B 2D82 MOV R24,R2
011C 308D CPI R24,0xD
011D F791 BNE 0x0110
(0082) *p = NULL;
011E 2422 CLR R2
011F 01F8 MOVW R30,R16
0120 8220 STD Z+0,R2
(0083) return p;
0121 9508 RET
_ReadTime:
temp --> R20
tempval --> R12
bitcount --> R20
val --> R22
count --> R14
p --> R10
0122 D291 RCALL push_gset5
0123 0158 MOVW R10,R16
(0084) }
(0085)
(0086) /*************************************************
(0087) *原型:uint ReadTime(uchar *p)
(0088) *功能: 读取心跳时间与复位时间
(0089) *说明:如果无存心跳时间为10分钟,复位时间为1天
(0090) *参数:uchar *p-接收到,len长度
(0091) *返回:val-运算完的值
(0092) **************************************************/
(0093) #define TIMELEN 4 //时间长度
(0094) uint ReadTime(uchar *p)
(0095) {
(0096) uchar count;
(0097) uint temp=1;
0124 E041 LDI R20,1
0125 E050 LDI R21,0
(0098) uint val = NULL;
0126 2766 CLR R22
0127 2777 CLR R23
(0099) uint tempval;
(0100) uchar bitcount=0;//位计数
0128 2744 CLR R20
0129 C010 RJMP 0x013A
(0101) //当结束或超过位数跳出
(0102) while((*p != '"')&&(bitcount < TIMELEN))
(0103) {
(0104) count = *p ++; //把值读进
012A 01F5 MOVW R30,R10
012B 90E1 LD R14,Z+
012C 015F MOVW R10,R30
(0105) count = count - 0x30;
012D 2D8E MOV R24,R14
012E 5380 SUBI R24,0x30
012F 2EE8 MOV R14,R24
(0106) tempval =(uint)(val * 10); //乘进位
0130 E00A LDI R16,0xA
0131 E010 LDI R17,0
0132 019B MOVW R18,R22
0133 D26A RCALL empy16s
0134 0168 MOVW R12,R16
(0107) val = (uint)(count+tempval); //存进
0135 2D6E MOV R22,R14
0136 2777 CLR R23
0137 0F60 ADD R22,R16
0138 1F71 ADC R23,R17
(0108) bitcount ++; //位数加1
0139 9543 INC R20
013A 01F5 MOVW R30,R10
013B 8180 LDD R24,Z+0
013C 3282 CPI R24,0x22
013D F011 BEQ 0x0140
013E 3044 CPI R20,4
013F F350 BCS 0x012A
(0109) }
(0110) return val;
0140 018B MOVW R16,R22
0141 D270 RCALL pop_gset5
0142 9508 RET
_Save_tel:
i --> R10
p --> R22
count --> R20
0143 D274 RCALL push_gset3
0144 01B9 MOVW R22,R18
0145 2F40 MOV R20,R16
(0111) }
(0112) /*************************************************
(0113) *原型:void Save_tel(uchar count,uchar *p )
(0114) *功能:把从SIM卡读到电话本存到二维数组内
(0115) *说明:最大可存16位号码,超出只取前面,时间0-9999分钟
(0116) *参数:uchar count-定位,*p要填写的缓冲区
(0117) *返回:无
(0118) **************************************************/
(0119) void Save_tel(uchar count,uchar *p )
(0120) {
(0121) unsigned char i = 0;
0146 24AA CLR R10
(0122)
(0123) ++ count;
0147 9543 INC R20
(0124)
(0125) *p++ = 'A';
0148 E481 LDI R24,0x41
0149 01FB MOVW R30,R22
014A 9381 ST R24,Z+
(0126) *p++ = 'T';
014B E584 LDI R24,0x54
014C 9381 ST R24,Z+
(0127) *p++ = 'D';
014D E484 LDI R24,0x44
014E 9381 ST R24,Z+
014F 01BF MOVW R22,R30
0150 C00E RJMP 0x015F
(0128) while((Uart.Buf[count]!= '"' )&&(Uart.Buf[count] != '*'))
(0129) {
(0130) if(i < TELLEN)//当号码长度未超过TELLEN,填写在缓冲区内
0151 2D8A MOV R24,R10
0152 318E CPI R24,0x1E
0153 F450 BCC 0x015E
(0131) *p++ = Uart.Buf[count];
0154 E987 LDI R24,0x97
0155 E090 LDI R25,0
0156 2FE4 MOV R30,R20
0157 27FF CLR R31
0158 0FE8 ADD R30,R24
0159 1FF9 ADC R31,R25
015A 8020 LDD R2,Z+0
015B 01FB MOVW R30,R22
015C 9221 ST R2,Z+
015D 01BF MOVW R22,R30
(0132) count++; //指向下一个接收缓冲区
015E 9543 INC R20
015F E987 LDI R24,0x97
0160 E090 LDI R25,0
0161 2FE4 MOV R30,R20
0162 27FF CLR R31
0163 0FE8 ADD R30,R24
0164 1FF9 ADC R31,R25
0165 8020 LDD R2,Z+0
0166 2433 CLR R3
0167 2D82 MOV R24,R2
0168 3282 CPI R24,0x22
0169 F011 BEQ 0x016C
016A 328A CPI R24,0x2A
016B F729 BNE 0x0151
(0133) }
(0134) *p++ =';';
016C E38B LDI R24,0x3B
016D 01FB MOVW R30,R22
016E 9381 ST R24,Z+
016F 01BF MOVW R22,R30
(0135) *p = NULL;//结束
0170 2422 CLR R2
0171 8220 STD Z+0,R2
(0136) //如有预存的定时时间
(0137) if(Uart.Buf[count] =='*')
0172 E987 LDI R24,0x97
0173 E090 LDI R25,0
0174 2FE4 MOV R30,R20
0175 27FF CLR R31
0176 0FE8 ADD R30,R24
0177 1FF9 ADC R31,R25
0178 8180 LDD R24,Z+0
0179 328A CPI R24,0x2A
017A F469 BNE 0x0188
(0138) {
(0139) ++count;
017B 9543 INC R20
(0140) Time.Atd=ReadTime(&Uart.Buf[count]);//转换成时间
017C E987 LDI R24,0x97
017D E090 LDI R25,0
017E 2F04 MOV R16,R20
017F 2711 CLR R17
0180 0F08 ADD R16,R24
0181 1F19 ADC R17,R25
0182 DF9F RCALL _ReadTime
0183 93100091 STS Time+2,R17
0185 93000090 STS Time+1,R16
(0141) }
0187 C006 RJMP 0x018E
(0142) else
(0143) {
(0144) Time.Atd = NULL;//定时标志为0
0188 2422 CLR R2
0189 2433 CLR R3
018A 92300091 STS Time+2,R3
018C 92200090 STS Time+1,R2
(0145) }
018E D221 RCALL pop_gset3
018F 9508 RET
_UART_RX_interrupt:
hz1 --> R16
data --> R18
0190 922A ST R2,-Y
0191 930A ST R16,-Y
0192 932A ST R18,-Y
0193 938A ST R24,-Y
0194 939A ST R25,-Y
0195 93EA ST R30,-Y
0196 93FA ST R31,-Y
0197 B62F IN R2,0x3F
0198 922A ST R2,-Y
(0146) }
(0147) /*************************************************
(0148) *原型:void UART_RX_interrupt(void)
(0149) *功能:接收串口数据
(0150) *说明:无
(0151) *参数:无
(0152) *返回:无
(0153) **************************************************/
(0154) #pragma interrupt_handler UART_RX_interrupt:iv_USART_RX
(0155) void UART_RX_interrupt( void )
(0156) {
(0157) unsigned char data,hz1;
(0158) data = UDR;
0199 B12C IN R18,0x0C
(0159) hz1 = UART_RXHEAD;
019A 91000180 LDS R16,UART_RXHEAD
(0160) UART_RXHEAD++;
019C 2F80 MOV R24,R16
019D 5F8F SUBI R24,0xFF
019E 93800180 STS UART_RXHEAD,R24
(0161) Uart.Buf[hz1] = data; //把数据存到接收缓冲区
01A0 E987 LDI R24,0x97
01A1 E090 LDI R25,0
01A2 2FE0 MOV R30,R16
01A3 27FF CLR R31
01A4 0FE8 ADD R30,R24
01A5 1FF9 ADC R31,R25
01A6 8320 STD Z+0,R18
(0162) //如果超出范围从头收起
(0163) if(UART_RXHEAD>=UARTRXLEN)
01A7 91800180 LDS R24,UART_RXHEAD
01A9 3C88 CPI R24,0xC8
01AA F018 BCS 0x01AE
(0164) UART_RXHEAD = NULL;
01AB 2422 CLR R2
01AC 92200180 STS UART_RXHEAD,R2
(0165)
(0166) if((data == 'K')&&(Uart.Buf[--hz1] =='O'))
01AE 342B CPI R18,0x4B
01AF F489 BNE 0x01C1
01B0 2F80 MOV R24,R16
01B1 5081 SUBI R24,1
01B2 2E28 MOV R2,R24
01B3 2F08 MOV R16,R24
01B4 E987 LDI R24,0x97
01B5 E090 LDI R25,0
01B6 2DE2 MOV R30,R2
01B7 27FF CLR R31
01B8 0FE8 ADD R30,R24
01B9 1FF9 ADC R31,R25
01BA 8180 LDD R24,Z+0
01BB 348F CPI R24,0x4F
01BC F421 BNE 0x01C1
(0167) DealRxUartBz = TRUE;
01BD E081 LDI R24,1
01BE 9380017F STS DealRxUartBz,R24
01C0 C019 RJMP 0x01DA
(0168)
(0169) //在空闲状态来电振铃发摘机命令起机
(0170) else if((data=='G')&&(Uart.Buf[--hz1]=='N')&&(!Busybz))
01C1 3427 CPI R18,0x47
01C2 F4B9 BNE 0x01DA
01C3 2F80 MOV R24,R16
01C4 5081 SUBI R24,1
01C5 2E28 MOV R2,R24
01C6 2F08 MOV R16,R24
01C7 E987 LDI R24,0x97
01C8 E090 LDI R25,0
01C9 2DE2 MOV R30,R2
01CA 27FF CLR R31
01CB 0FE8 ADD R30,R24
01CC 1FF9 ADC R31,R25
01CD 8180 LDD R24,Z+0
01CE 348E CPI R24,0x4E
01CF F451 BNE 0x01DA
01D0 90200183 LDS R2,Busybz
01D2 2022 TST R2
01D3 F431 BNE 0x01DA
(0171) {
(0172) UART_RXHEAD = NULL; //接收计数器与号码标志指向空
01D4 2422 CLR R2
01D5 92200180 STS UART_RXHEAD,R2
(0173) WorkCount = GET; //任务计数器指向接听命令
01D7 E084 LDI R24,4
01D8 93800184 STS WorkCount,R24
(0174) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -