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

📄 sim340.s

📁 本实例实现GSM模块的发送短消息
💻 S
📖 第 1 页 / 共 4 页
字号:
	subi R24,22  ; offset = 234
	sbci R25,255
	std y+1,R25
	std y+0,R24
	clr R18
	clr R19
	movw R16,R22
	xcall _copy
	.dbline 226
;     nOffset = 18;
	ldi R24,18
	ldi R25,0
	movw R30,R28
	subi R30,148  ; addi 108
	sbci R31,255
	std z+1,R25
	std z+0,R24
	.dbline 227
;     copy(pOut2,nOffset,chrTemp,0,nOff);
	movw R30,R28
	subi R30,46  ; addi 210
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	std y+5,R3
	std y+4,R2
	clr R2
	clr R3
	std y+3,R3
	std y+2,R2
	movw R24,R28
	subi R24,4  ; offset = 252
	sbci R25,255
	std y+1,R25
	std y+0,R24
	movw R30,R28
	subi R30,148  ; addi 108
	sbci R31,255
	ldd R18,z+0
	ldd R19,z+1
	movw R16,R22
	xcall _copy
	.dbline 228
;     nOffset += nOff;
	movw R30,R28
	subi R30,46  ; addi 210
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	movw R30,R28
	subi R30,148  ; addi 108
	sbci R31,255
	ldd R4,z+0
	ldd R5,z+1
	add R4,R2
	adc R5,R3
	movw R30,R28
	subi R30,148  ; addi 108
	sbci R31,255
	std z+1,R5
	std z+0,R4
	.dbline 229
;     Encode(pData,pBuf,nLen);
	movw R30,R28
	subi R30,173  ; addi 595
	sbci R31,253
	ldd R0,z+0
	ldd R1,z+1
	std y+1,R1
	std y+0,R0
	movw R18,R28
	subi R18,134  ; offset = 378
	sbci R19,254
	movw R30,R28
	subi R30,175  ; addi 593
	sbci R31,253
	ldd R16,z+0
	ldd R17,z+1
	xcall _Encode
	.dbline 230
;     ByteToChar(pBuf,chrTmp,nLen);
	movw R30,R28
	subi R30,173  ; addi 595
	sbci R31,253
	ldd R0,z+0
	ldd R1,z+1
	std y+1,R1
	std y+0,R0
	movw R18,R28
	subi R18,248  ; offset = 8
	sbci R19,255
	movw R16,R28
	subi R16,134  ; offset = 378
	sbci R17,254
	xcall _ByteToChar
	.dbline 231
;     copy(pOut2,nOffset,chrTmp,0,(2 * nLen));
	ldi R16,2
	ldi R17,0
	movw R30,R28
	subi R30,173  ; addi 595
	sbci R31,253
	ldd R18,z+0
	ldd R19,z+1
	xcall empy16s
	std y+5,R17
	std y+4,R16
	clr R2
	clr R3
	std y+3,R3
	std y+2,R2
	movw R24,R28
	adiw R24,8
	std y+1,R25
	std y+0,R24
	movw R30,R28
	subi R30,148  ; addi 108
	sbci R31,255
	ldd R18,z+0
	ldd R19,z+1
	movw R16,R22
	xcall _copy
	.dbline 232
;     nOffset += (2 * nLen);
	ldi R16,2
	ldi R17,0
	movw R30,R28
	subi R30,173  ; addi 595
	sbci R31,253
	ldd R18,z+0
	ldd R19,z+1
	xcall empy16s
	movw R30,R28
	subi R30,148  ; addi 108
	sbci R31,255
	ldd R2,z+0
	ldd R3,z+1
	add R2,R16
	adc R3,R17
	movw R30,R28
	subi R30,148  ; addi 108
	sbci R31,255
	std z+1,R3
	std z+0,R2
	.dbline 233
;     pOut2[nOffset] = 27;//PDU编码,ESC的ASCALL是27
	movw R30,R2
	add R30,R22
	adc R31,R23
	ldi R24,27
	std z+0,R24
	.dbline 235
;     
;     *nTXLen2 = nOffset;     //编码的长度
	movw R30,R12
	std z+1,R3
	std z+0,R2
	.dbline -2
L10:
	adiw R28,63
	adiw R28,63
	adiw R28,63
	adiw R28,63
	adiw R28,63
	adiw R28,63
	adiw R28,63
	adiw R28,63
	adiw R28,63
	adiw R28,12  ; offset = 579
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l Len 578 A[1:1]c
	.dbsym l pBuf 378 A[200:200]c
	.dbsym l nContent_Len 376 I
	.dbsym l chrInfo 370 A[6:6]c
	.dbsym l nLen_temp 368 I
	.dbsym l strHead_temp 354 A[14:14]c
	.dbsym l nTempLen 352 I
	.dbsym l chrTemp 252 A[100:100]c
	.dbsym l strHead 234 A[18:18]c
	.dbsym l n 232 I
	.dbsym l phoneTemp 212 A[20:20]c
	.dbsym l nOff 210 I
	.dbsym l nTemp 110 A[100:100]c
	.dbsym l nOffset 108 I
	.dbsym l chrTmp 8 A[100:100]c
	.dbsym l i 6 I
	.dbsym r sca_len 20 I
	.dbsym l sca 605 pc
	.dbsym r pOut2 22 pc
	.dbsym r pOut1 10 pc
	.dbsym r nTXLen2 12 pI
	.dbsym r nTXLen1 14 pI
	.dbsym l nLen 595 I
	.dbsym l pData 593 pc
	.dbsym l phonelen 591 I
	.dbsym l pPhone 589 pc
	.dbend
	.dbfunc e copy _copy fV
;              i -> R20,R21
;           nLen -> R22,R23
;         nStart -> R10,R11
;           pOrg -> R12,R13
;           nOrg -> R18,R19
;          pDest -> R16,R17
	.even
_copy::
	xcall push_gset4
	ldd R12,y+8
	ldd R13,y+9
	ldd R10,y+10
	ldd R11,y+11
	ldd R22,y+12
	ldd R23,y+13
	.dbline -1
	.dbline 239
; }
; //将源数组的内容拷贝到目的数组
; void copy(char pDest[],int nOrg,char pOrg[],int nStart,int nLen)
; {
	.dbline 241
;     int i;
;     for(i = 0;i < nLen;i++)
	clr R20
	clr R21
	xjmp L50
L47:
	.dbline 242
	.dbline 243
	movw R30,R20
	add R30,R10
	adc R31,R11
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	movw R30,R18
	add R30,R20
	adc R31,R21
	add R30,R16
	adc R31,R17
	std z+0,R2
	.dbline 244
L48:
	.dbline 241
	subi R20,255  ; offset = 1
	sbci R21,255
L50:
	.dbline 241
	cp R20,R22
	cpc R21,R23
	brlt L47
	.dbline -2
L46:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 20 I
	.dbsym r nLen 22 I
	.dbsym r nStart 10 I
	.dbsym r pOrg 12 pc
	.dbsym r nOrg 18 I
	.dbsym r pDest 16 pc
	.dbend
	.dbfunc e ByteToChar _ByteToChar fV
;              i -> R20,R21
;        chrTemp -> R22
;           nLen -> R10,R11
;            Out -> R18,R19
;         nInPut -> R16,R17
	.even
_ByteToChar::
	xcall push_gset3
	ldd R10,y+6
	ldd R11,y+7
	.dbline -1
	.dbline 248
;     {
;     	pDest[nOrg + i] = pOrg[i + nStart];
;     }
; }
; // 将字节处理成字符串
; void ByteToChar(char nInPut[],char Out[],int nLen)
; {
	.dbline 252
;     int i;
;     char chrTemp;
;     
;     for(i = 0;i < nLen;i++)
	clr R20
	clr R21
	xjmp L55
L52:
	.dbline 253
;     {
	.dbline 255
;         // 高字节			
;         chrTemp = (char)((nInPut[i] >> 4) & 0x0f);
	movw R30,R20
	add R30,R16
	adc R31,R17
	ldd R22,z+0
	clr R23
	asr R23
	ror R22
	asr R23
	ror R22
	asr R23
	ror R22
	asr R23
	ror R22
	andi R22,15
	andi R23,0
	.dbline 256
;         if(chrTemp >= 0 && chrTemp <= 9) chrTemp += 48;
	cpi R22,0
	brlo L56
	ldi R24,9
	cp R24,R22
	brlo L56
	.dbline 256
	subi R22,208    ; addi 48
	xjmp L57
L56:
	.dbline 257
;         else chrTemp += 55;
	subi R22,201    ; addi 55
L57:
	.dbline 258
;         Out[i] = chrTemp;
	movw R30,R20
	add R30,R18
	adc R31,R19
	std z+0,R22
	.dbline 261
;     
;         // 低字节
;         chrTemp = (char)(nInPut[i] & 0x0f);
	movw R30,R20
	add R30,R16
	adc R31,R17
	ldd R22,z+0
	clr R23
	andi R22,15
	andi R23,0
	.dbline 262
;         if(chrTemp >= 0 && chrTemp <= 9) chrTemp += 48;
	cpi R22,0
	brlo L58
	ldi R24,9
	cp R24,R22
	brlo L58
	.dbline 262
	subi R22,208    ; addi 48
	xjmp L59
L58:
	.dbline 263
;         else chrTemp += 55;
	subi R22,201    ; addi 55
L59:
	.dbline 264
	movw R30,R20
	add R30,R18
	adc R31,R19
	std z+0,R22
	.dbline 265
L53:
	.dbline 252
	subi R20,255  ; offset = 1
	sbci R21,255
L55:
	.dbline 252
	cp R20,R10
	cpc R21,R11
	brge X2
	xjmp L52
X2:
	.dbline 267
;         Out[i] = chrTemp;
;     }
;     
;     return;
	.dbline -2
L51:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 I
	.dbsym r chrTemp 22 c
	.dbsym r nLen 10 I
	.dbsym r Out 18 pc
	.dbsym r nInPut 16 pc
	.dbend
	.dbfunc e IntToChar _IntToChar fI
;              i -> <dead>
;           nLen -> R20,R21
;       chrTemp3 -> R10
;       chrTemp2 -> R12
;       chrTemp1 -> R14
;            Out -> R22,R23
;              n -> R20,R21
	.even
_IntToChar::
	xcall push_gset5
	movw R22,R18
	movw R20,R16
	.dbline -1
	.dbline 271
; }
; // 数的范围为250以内
; int IntToChar(int n,char Out[])
; {
	.dbline 278
;     int i;
;     char chrTemp1;
;     char chrTemp2;
;     char chrTemp3;
;     int nLen;
; 
;     chrTemp1 = n / 100;
	ldi R18,100
	ldi R19,0
	movw R16,R20
	xcall div16s
	mov R14,R16
	.dbline 279
;     chrTemp2 = (n - chrTemp1 * 100) / 10;
	ldi R24,100
	mul R24,R14
	movw R16,R20
	sub R16,R0
	sbc R17,R1
	ldi R18,10
	ldi R19,0
	xcall div16s
	mov R12,R16
	.dbline 280
;     chrTemp3 = n - chrTemp1 * 100 - chrTemp2 * 10;
	ldi R24,100
	mul R24,R14
	mov R10,R20
	sub R10,R0
	sbc R11,R1
	ldi R24,10
	mul R24,R12
	sub R10,R0
	sbc R11,R1
	.dbline 281
;     if(chrTemp1 != 0) 
	tst R14
	breq L61
	.dbline 282
;     {
	.dbline 283
;     	nLen = 3;
	ldi R20,3
	ldi R21,0
	.dbline 284
;         Out[0] = chrTemp1 + 0x30;
	mov R24,R14
	subi R24,208    ; addi 48
	movw R30,R22
	std z+0,R24
	.dbline 285
;         Out[1] = chrTemp2 + 0x30;
	mov R24,R12
	subi R24,208    ; addi 48
	std z+1,R24
	.dbline 286
;         Out[2] = chrTemp3 + 0x30;
	mov R24,R10
	subi R24,208    ; addi 48
	movw R30,R22
	std z+2,R24
	.dbline 287
;     }
	xjmp L62
L61:
	.dbline 289
;     else
;     {
	.dbline 290
;     	if(chrTemp2 != 0)
	tst R12
	breq L63
	.dbline 291
;     	{
	.dbline 292
;     	    nLen = 2;
	ldi R20,2
	ldi R21,0
	.dbline 293
;             Out[0] = chrTemp2 + 0x30;
	mov R24,R12
	subi R24,208    ; addi 48
	movw R30,R22
	std z+0,R24
	.dbline 294
;             Out[1] = chrTemp3 + 0x30;
	mov R24,R10
	subi R24,208    ; addi 48
	std z+1,R24
	.dbline 295
;     	}
	xjmp L64
L63:
	.dbline 297
;     	else
;     	{
	.dbline 298
;     	    nLen = 1;
	ldi R20,1
	ldi R21,0
	.dbline 299
;             Out[0] = chrTemp3 + 0x30;
	mov R24,R10
	subi R24,208    ; addi 48
	movw R30,R22
	std z+0,R24
	.dbline 300
;     	}
L64:
	.dbline 301
;     }
L62:
	.dbline 303
; 
;     return nLen;
	movw R16,R20
	.dbline -2
L60:
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym l i 1 I
	.dbsym r nLen 20 I
	.dbsym r chrTemp3 10 c
	.dbsym r chrTemp2 12 c
	.dbsym r chrTemp1 14 c
	.dbsym r Out 22 pc
	.dbsym r n 20 I
	.dbend
	.dbfunc e Encode _Encode fV
;           nDst -> <dead>
;          nLeft -> R22
;          nChar -> R10,R11
;           nSrc -> R20,R21
;           nLen -> R14,R15
;            out -> R6,R7
;             in -> R12,R13
	.even
_Encode::
	xcall push_gset5
	movw R6,R18
	movw R12,R16
	ldd R14,y+10
	ldd R15,y+11
	.dbline -1
	.dbline 307
; }
; // 编码函数
; void Encode(char in[],char out[],int nLen)
; {
	.dbline 314
;     int nSrc;        // 源字符串的计数值
;     int nDst;        // 目标编码串的计数值
;     int nChar;       // 当前正在处理的组内字符字节的序号,范围是0-7
;     char nLeft;    // 上一字节残余的数据
;     
;     // 计数值初始化
;     nSrc = 0;
	clr R20
	clr R21
	xjmp L67
L66:
	.dbline 321
;     //nDst = 0;
;     
;     // 将源串每8个字节分为一组,压缩成7个字节
;     // 循环该处理过程,直至源串被处理完
;     // 如果分组不到8字节,也能正确处理
;     while(nSrc<nLen)
;     {
	.dbline 323
;         // 取源字符串的计数值的最低3位
;         nChar = nSrc & 7;
	movw R24,R20
	andi R24,7
	andi R25,0
	movw R10,R24
	.dbline 326
;     
;         // 处理源串的每个字节
;         if(nChar == 0)
	cpi R24,0
	cpc R24,R25
	brne L69
X3:
	.dbline 327
;         {
	.dbline 329
;             // 组内第一个字节,只是保存起来,待处理下一个字节时使用
;             nLeft = *in;
	movw R30,R12
	ldd R22,z+0
	.dbline 330
;         }
	xjmp L70
L69:
	.dbline 332
;         else
;         {
	.dbline 334
;             // 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
;             *out = (*in << (8-nChar)) | nLeft;
	ldi R18,8
	ldi R19,0
	sub R18,R10
	sbc R19,R11
	movw R30,R12
	ldd R16,z+0
	clr R17
	xcall lsl16
	movw R2,R16
	mov R4,R22
	clr R5
	or R2,R4
	or R3,R5
	movw R30,R6
	std z+0,R2
	.dbline 337
;     
;             // 将该字节剩下的左边部分,作为残余数据保存起来
;             nLeft = *in >> nChar;
	movw R30,R12
	ldd R16,z+0
	clr R17
	movw R18,R10
	xcall asr16
	mov R22,R16
	.dbline 339
;             // 修改目标串的指针和计数值 
;             out++;
	movw R24,R6
	adiw R24,1
	movw R6,R24
	.dbline 341
;             //nDst++; 
;         } 
L70:
	.dbline 344
	movw R24,R12
	adiw R24,1
	movw R12,R24
	.dbline 344
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 345
L67:
	.dbline 320
	cp R20,R14
	cpc R21,R15
	brge X4
	xjmp L66
X4:
	.dbline -2
L65:
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym l nDst 1 I
	.dbsym r nLeft 22 c
	.dbsym r nChar 10 I
	.dbsym r nSrc 20 I
	.dbsym r nLen 14 I
	.dbsym r out 6 pc
	.dbsym r in 12 pc
	.dbend
	.dbfunc e FindERROR _FindERROR fI
;        nOffset -> R20,R21
;              i -> R22,R23
;           nLen -> R18,R19
;             in -> R16,R17
	.even
_FindERROR::
	xcall push_gset2
	.dbline -1
	.dbline 459
;         
;         // 修改源串的指针和计数值
;         in++; nSrc++;
;     }
;     
;     // 返回目标串长度
;     //return nDst; 
; }
; /*
; int AnalyseSms(char in[],int nLen,char chrPhone[],char chrMessage[])
; {
;     char Phone[20];
;     int phone_len;
;     char chrTemp[200];
;     char chrMessage[140];
;     int nLen_temp;
;     int nTempLen;
;     int nOffset;
;     int nOff;
;     char chrTmp;
;     int n,i;
;     int nContent_Len;
;     char content[140];
;     
;     //去掉+CMGR:信息
;     nLen_temp = nLen - 6;
;     nOffset = 6;
;     copy(chrTemp,0,in,nOffset,nLen_temp);
;     
;     if(nLen_temp < 20) return -1;
;     chrTmp = chrTemp[0];
;     if(chrTmp == '1')//新消息
;     {    	
;         chrTmp = strTemp[3];
;         if(chrTemp == '1')// 长度为三个字符
;         {
;     	    nTempLen = (strTemp[3] - 48) * 100 + (strTemp[4] - 48) * 10
;     	               + (strTemp[4] - 48);
;     	    if(nLen_temp >= 26) 
;     	    {    	        
;     	        nLen_temp -= 26;
;     	        nOffset += 26;
;     	        copy(chrTemp,0,in,nOffset,nLen_temp); 
;     	    }     
;     	    else return -1;      	    	            	
;         }// 长度为两个字符
;         else			
;         {
;     	    nTempLen = (strTemp[3] - 48) * 10 + (strTemp[4] - 48);
;     	    if(nLen_temp >= 25)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -