⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 呼死你.lst

📁 基于单片机的短信报警机
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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 + -