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

📄 m16_xmodem.s

📁 AVR M16 Xmodem传输及发送彩信的实现
💻 S
📖 第 1 页 / 共 5 页
字号:
;     for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
	ldi R20,1
	xjmp L128
L125:
	.dbline 407
;     {
	.dbline 408
;         send_a_byte(EOT);
	ldi R16,4
	xcall _send_a_byte
	.dbline 410
; 		// send file end
; 		Delay(1);
	ldi R16,1
	ldi R17,0
	xcall _Delay
	.dbline 411
; 		temp=temp_char0;
	lds R22,_temp_char0
	.dbline 412
;         if(temp == ACK)
	cpi R22,6
	brne L129
X45:
	.dbline 413
;            return 1;       // file end acknowledged  接收方返因ACK信号
	ldi R16,1
	xjmp L124
L129:
	.dbline 414
;     }
L126:
	.dbline 406
	inc R20
L128:
	.dbline 406
	ldi R24,3
	cp R24,R20
	brsh L125
X46:
	.dbline 415
;     return 0;               // file tx failed
	clr R16
	.dbline -2
L124:
	.dbline 0 ; func end
	ld R22,y+
	ld R20,y+
	ret
	.dbsym r temp 22 c
	.dbsym r attempt 20 c
	.dbend
	.dbfunc e update_CRC _update_CRC fi
;       checksum -> R18,R19
;         inData -> R16
	.even
_update_CRC::
	.dbline -1
	.dbline 419
; }
; 
; uint update_CRC(uchar inData, uint checksum)
; {
	.dbline 420
;     return  ((checksum << 8) ^ crc16_table[ (checksum >> 8) ^ inData ]);
	mov R2,R16
	clr R3
	movw R30,R18
	mov R30,R31
	clr R31
	eor R30,R2
	eor R31,R3
	lsl R30
	rol R31
	ldi R24,<_crc16_table
	ldi R25,>_crc16_table
	add R30,R24
	adc R31,R25
	lpm R2,Z+
	lpm R3,Z
	movw R16,R18
	mov R17,R16
	clr R16
	eor R16,R2
	eor R17,R3
	.dbline -2
L131:
	.dbline 0 ; func end
	ret
	.dbsym r checksum 18 i
	.dbsym r inData 16 c
	.dbend
	.dbfunc e intDelay _intDelay fV
;              i -> R16,R17
	.even
_intDelay::
	.dbline -1
	.dbline 429
; }
; 
; /*
; *************************************
; *延时子程序,延时约10×i机器周期     *
; *************************************/
; 
; void intDelay(uint i)
; {
L133:
	.dbline 430
; 	while(i--);
L134:
	.dbline 430
	movw R2,R16
	subi R16,1
	sbci R17,0
	tst R2
	brne L133
	tst R3
	brne L133
X47:
	.dbline -2
L132:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e memcmp_self _memcmp_self fc
;              i -> R10
;          lenth -> y+1
;        string2 -> R18,R19
;        string1 -> R16,R17
	.even
_memcmp_self::
	st -y,R10
	.dbline -1
	.dbline 435
; }
; 
; 
; char memcmp_self(char const *string1, char const *string2 ,unsigned int lenth)
; {
	.dbline 437
;     uchar i;
;     for(i = 0; i<lenth; i++)
	clr R10
	xjmp L140
L137:
	.dbline 438
;     {
	.dbline 439
;          if(*string1 != *string2)
	movw R30,R18
	lpm R2,Z
	movw R30,R16
	lpm R3,Z
	cp R3,R2
	breq L141
X48:
	.dbline 440
;              return 0;
	clr R16
	xjmp L136
L141:
	.dbline 441
;          string1++;
	subi R16,255  ; offset = 1
	sbci R17,255
	.dbline 442
;          string2++;
	subi R18,255  ; offset = 1
	sbci R19,255
	.dbline 443
;     }
L138:
	.dbline 437
	inc R10
L140:
	.dbline 437
	mov R2,R10
	clr R3
	ldd R0,y+1
	ldd R1,y+2
	cp R2,R0
	cpc R3,R1
	brlo L137
X49:
	.dbline 444
;     return 1;
	ldi R16,1
	.dbline -2
L136:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r i 10 c
	.dbsym l lenth 1 i
	.dbsym r string2 18 pkc
	.dbsym r string1 16 pkc
	.dbend
	.dbfunc e do_serial_data _do_serial_data fV
;              i -> R16
	.even
_do_serial_data::
	.dbline -1
	.dbline 448
; }
; //char do_serial_data(uchar lenth)
; void do_serial_data(void)
; {
	.dbline 450
;  uchar i;
;  	 if(receive_data[0]=='+') 
	lds R24,_receive_data
	cpi R24,43
	brne L144
X50:
	.dbline 451
;      {     receive_CLIP = 1;
	.dbline 451
	ldi R24,1
	sts _receive_CLIP,R24
	.dbline 452
; 	 	if('1' == receive_data[8] && ((receive_data[18] >= '0') && (receive_data[18] <= '9')))
	lds R24,_receive_data+8
	cpi R24,49
	brne L146
X51:
	lds R24,_receive_data+18
	cpi R24,48
	brlo L146
X52:
	ldi R24,57
	lds R2,_receive_data+18
	cp R24,R2
	brlo L146
X53:
	.dbline 453
; 		{
	.dbline 454
; 		 	 for(i=8;i<19;i++)
	ldi R16,8
	xjmp L154
L151:
	.dbline 455
; 			 dial_number[i-8]=receive_data[i];
	ldi R24,<_receive_data
	ldi R25,>_receive_data
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_dial_number-8
	ldi R25,>_dial_number-8
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
L152:
	.dbline 454
	inc R16
L154:
	.dbline 454
	cpi R16,19
	brlo L151
X54:
	.dbline 456
; 			 flag_mobile = 1;
	ldi R24,1
	sts _flag_mobile,R24
	.dbline 457
; 		}
L146:
	.dbline 459
; 		
; 	}
L144:
	.dbline -2
L143:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e Delay _Delay fV
;              i -> R20
;       Delay_MS -> R16,R17
	.even
_Delay::
	st -y,R20
	.dbline -1
	.dbline 510
; 	/*switch (lenth)
; 	{
; 		case 0:
; 				break;
; 		case 1:
; 				break;
; 		case 2:
; 				
; 				break;
; 		case 3:
; 			 if(memcmp_self(receive_data, DATA_OK,2)==0 )                //检测是否收到 OK
; 					receive_OK = 1;
; 				break;
; 		case 4:
; 			 if(memcmp_self(receive_data, DATA_RING,4)==0 )                //检测是否收到 OK
; 					receive_RING = 1;
; 				break;
; 		case 5:
;                 if(memcmp_self(receive_data, DATA_ERROR, 5)==0)             //检测是否收到 ERROR
;                     receive_ERROR = 1;
; 				break;
; 		case 6:
; 				break;
; 		case 7:
; 				break;
; 		case 8:
; 				break;
; 		case 17:
; 				if(memcmp_self(receive_data,DATA_DOWNFINEOK,17)) //检测是否收到 Ok_Info_FileClose
;                      receive_DOWNFINEOK = 1;
; 				break;		
; 		case 25:
;                 if(memcmp_self(receive_data,DATA_DOWNFINE,25))    //检测是否收到 Ok_Info_FileUploadStarted 
;                      receive_DOWNFINE = 1;
; 				break;
; 		case 29:
; 			    if(memcmp_self(receive_data,DATA_CLIP,5)) //检测是否收到 Ok_Info_FileClose
;                 {     receive_CLIP = 1;
; 					  for(i=8;i<19;i++)
; 					  dial_number[i-8]=receive_data[i];
; 				}
; 		default:
; 				break;
; 	}*/
; }
; 
; 
; 
; //1MS的延时
; void Delay(unsigned int Delay_MS)
; {
	xjmp L158
L157:
	.dbline 513
;         unsigned char i;
; 	while(Delay_MS--)
; 	{
	.dbline 514
; 	   for(i=0;i<111;i++);
	clr R20
	xjmp L163
L160:
	.dbline 514
L161:
	.dbline 514
	inc R20
L163:
	.dbline 514
	cpi R20,111
	brlo L160
X55:
	.dbline 515
; 	}
L158:
	.dbline 512
	movw R2,R16
	subi R16,1
	sbci R17,0
	tst R2
	brne L157
	tst R3
	brne L157
X56:
	.dbline -2
L156:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r i 20 c
	.dbsym r Delay_MS 16 i
	.dbend
	.dbfunc e sendcmd _sendcmd fV
;       by_Array -> R16,R17
	.even
_sendcmd::
	.dbline -1
	.dbline 519
; }
; 
; void sendcmd(unsigned char *by_Array)
; {
	xjmp L166
L168:
	.dbline 522
; 	while(*by_Array)
; 	{
; 	 while (!( UCSRA & (1<<UDRE)));
L169:
	.dbline 522
	sbis 0xb,5
	rjmp L168
X57:
	.dbline 523
; 	  UDR=*by_Array;
	movw R30,R16
	ldd R2,z+0
	out 0xc,R2
	.dbline 524
; 	  by_Array++;
	subi R16,255  ; offset = 1
	sbci R17,255
	.dbline 525
; 	}	
L166:
	.dbline 520
	movw R30,R16
	ldd R2,z+0
	tst R2
	brne L169
X58:
	.dbline -2
L164:
	.dbline 0 ; func end
	ret
	.dbsym r by_Array 16 pc
	.dbend
	.dbfunc e mms_atsent _mms_atsent fV
	.even
_mms_atsent::
	.dbline -1
	.dbline 528
; }
; void mms_atsent(void)
; {
	.dbline 529
; receive_OK=0;
	clr R2
	sts _receive_OK,R2
	.dbline 530
; sendcmd("AT$MMSW=0\r\n") ;
	ldi R16,<L172
	ldi R17,>L172
	xcall _sendcmd
L173:
	.dbline 531
; while(receive_OK==0) ;
L174:
	.dbline 531
	lds R2,_receive_OK
	tst R2
	breq L173
X59:
	.dbline 532
; Delay(10);
	ldi R16,10
	ldi R17,0
	xcall _Delay
	.dbline 534
; 
; receive_DAYUHAO=0;
	clr R2
	sts _receive_DAYUHAO,R2
	.dbline 535
; sendcmd("AT$MMSW=1,1\r\n") ;
	ldi R16,<L176
	ldi R17,>L176
	xcall _sendcmd
L177:
	.dbline 536
; while(receive_DAYUHAO==0) ;
L178:
	.dbline 536
	lds R2,_receive_DAYUHAO
	tst R2
	breq L177
X60:
	.dbline 537
; receive_OK=0;
	clr R2
	sts _receive_OK,R2
	.dbline 538
; send_m_byte(dial_number,11);
	ldi R18,11
	ldi R19,0
	ldi R16,<_dial_number
	ldi R17,>_dial_number
	xcall _send_m_byte
	.dbline 539
; send_a_byte(ctrl_z);
	ldi R16,26
	xcall _send_a_byte
L180:
	.dbline 540
; while(receive_OK==0) ;
L181:
	.dbline 540
	lds R2,_receive_OK
	tst R2
	breq L180
X61:
	.dbline 541
; Delay(10);
	ldi R16,10
	ldi R17,0
	xcall _Delay
	.dbline 543
; 
; receive_DAYUHAO=0;
	clr R2
	sts _receive_DAYUHAO,R2
	.dbline 544
; sendcmd("AT$MMSW=4,1\r\n");
	ldi R16,<L183
	ldi R17,>L183
	xcall _sendcmd
L184:
	.dbline 545
; while(receive_DAYUHAO==0) ;
L185:
	.dbline 545
	lds R2,_receive_DAYUHAO
	tst R2
	breq L184
X62:
	.dbline 546
; receive_OK=0;
	clr R2
	sts _receive_OK,R2
	.dbline 547
; sendcmd(subject);
	ldi R16,<_subject
	ldi R17,>_subject
	xcall _sendcmd
	.dbline 548
; send_a_byte(ctrl_z);
	ldi R16,26
	xcall _send_a_byte
L187:
	.dbline 549
; while(receive_OK==0) ;
L188:
	.dbline 549
	lds R2,_receive_OK
	tst R2
	breq L187
X63:
	.dbline 550
; Delay(10);
	ldi R16,10
	ldi R17,0
	xcall _Delay
	.dbline 552
; 
; receive_DAYUHAO=0;
	clr R2
	sts _receive_DAYUHAO,R2
	.dbline 553
; sendcmd("AT$MMSW=5,1,1\r\n");
	ldi R16,<L190
	ldi R17,>L190
	xcall _sendcmd
L191:
	.dbline 554
; while(receive_DAYUHAO==0) ;
L192:
	.dbline 554
	lds R2,_receive_DAYUHAO
	tst R2
	breq L191
X64:
	.dbline 555
; receive_OK=0;
	clr R2
	sts _receive_OK,R2
	.dbline 556
; sendcmd("mypicture");
	ldi R16,<L194
	ldi R17,>L194
	xcall _sendcmd
	.dbline 557
; send_a_byte(ctrl_z);
	ldi R16,26
	xcall _send_a_byte
L195:
	.dbline 558
; while(receive_OK==0) ;
L196:
	.dbline 558
	lds R2,_receive_OK
	tst R2
	breq L195
X65:
	.dbline 559
; Delay(10);
	ldi R16,10
	ldi R17,0
	xcall _Delay
	.dbline 561
; 
; receive_OK=0;
	clr R2
	sts _receive_OK,R2
	.dbline 562
; sendcmd("AT$MMSW=6,1,\"test.jpg\"\r\n");
	ldi R16,<L198
	ldi R17,>L198
	xcall _sendcmd
L199:
	.dbline 563
; while(receive_OK==0) ;
L200:
	.dbline 563
	lds R2,_receive_OK
	tst R2
	breq L199
X66:
	.dbline 564
; Delay(10);
	ldi R16,10
	ldi R17,0
	xcall _Delay
	.dbline 566
; 
; receive_OK=0;
	clr R2
	sts _receive_OK,R2
	.dbline 567
; sendcmd("AT$MMSSEND\r\n");
	ldi R16,<L202
	ldi R17,>L202
	xcall _sendcmd
L203:
	.dbline 568
; while(receive_OK==0) ;
L204:
	.dbline 568
	lds R2,_receive_OK
	tst R2
	breq L203
X67:
	.dbline 569
; Delay(10);
	ldi R16,10
	ldi R17,0
	xcall _Delay
	.dbline 571
; 
; receive_MMSTRACE=0;
	clr R2
	sts _receive_MMSTRACE,R2
L206:
	.dbline 572
; while(receive_MMSTRACE==0) ;
L207:
	.dbline 572
	lds R2,_receive_MMSTRACE
	tst R2
	breq L206
X68:
	.dbline 574
; 
; receive_OK=0;
	clr R2
	sts _receive_OK,R2
	.dbline 575
; sendcmd(deletmms);
	ldi R16,<_deletmms
	ldi R17,>_deletmms
	xcall _sendcmd
L209:
	.dbline 576
; while(receive_OK==0) ;
L210:
	.dbline 576
	lds R2,_receive_OK
	tst R2
	breq L209
X69:
	.dbline -2
L171:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Xmodem _Xmodem fV
;              i -> R20,R21
	.even
_Xmodem::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 581
; 
; }
; 
; void Xmodem(void)
; {	 int i;
	.dbline 582
; 	pic = test_pic1;
	ldi R24,<_test_pic1
	ldi R25,>_test_pic1
	sts _pic+1,R25
	sts _pic,R24
	.dbline 584
; 	
; receive_sp = 0;
	clr R2
	clr R3
	sts _receive_sp+1,R3
	sts _receive_sp,R2
	.dbline 585
; 	for (i = 1; i < 65530; i++)
	ldi R20,1
	ldi R21,0
	xjmp L216
L213:
	.dbline 586
; 	{
	.dbline 587
; 		if((*(pic-1) == 0xff) &&((*pic) == 0xd9))
	lds R2,_pic
	lds R3,_pic+1
	movw R30,R2
	sbiw R30,1
	lpm R24,Z
	cpi R24,255
	brne L217
X70:
	movw R30,R2
	lpm R24,Z
	cpi R24,217
	brne L217
X71:
	.dbline 588
; 		{
	.dbline 589
; 			break;
	xjmp L215
L217:
	.dbline 591
; 		}
;         	pic++;
	lds R24,_pic
	lds R25,_pic+1
	adiw R24,1
	sts _pic+1,R25
	sts _pic,R24
	.dbline 592
; 	}
L214:
	.dbline 585
	subi R20,255  ; offset = 1
	sbci R21,255
L216:
	.dbline 585
	ldi R24,250
	ldi R25,255
	ldi R26,0
	ldi R27,0
	movw R2,R20
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	cp R2,R24
	cpc R3,R25
	cpc R4,R26
	cpc R5,R27
	brlt L213
X72:
L215:
	.dbline 593
;     picLenth = i;
	sts _picLenth+1,R21
	sts _picLenth,R20
	.dbline 595
; 
;             receive_OK = 0;
	clr R2
	sts _receive_OK,R2
	.dbline 596
;             receive_ERROR = 0;  //删除旧图片
	sts _receive_ERROR,R2
	.dbline 597
;             send_m_byte("at$fdel=\"*\"\r\n",13);
	ldi R18,13
	ldi R19,0
	ldi R16,<L219
	ldi R17,>L219
	xcall _send_m_byte
L220:
	.dbline 598
;             while((receive_OK == 0) && (receive_ERRO

⌨️ 快捷键说明

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