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

📄 crc.s

📁 AVR16源代码 ICC编译器
💻 S
字号:
	.module Crc.c
	.area text(rom, con, rel)
	.dbfile E:\程序\AVR程序\BOOTLoadICC\Crc.c
	.dbfunc e CRC16 _CRC16 fs
;            ACC -> R20,R21
;           byte -> R22,R23
;         TOPBIT -> R10,R11
;              k -> R14
;      remainder -> R12,R13
;            Len -> R18,R19
;        Message -> R16,R17
	.even
_CRC16::
	xcall push_gset5
	.dbline -1
	.dbline 15
; #include	<iom128v.h>
; #include	"Crc.h"
; 
; //============================================================
; //函	数:unsigned short CRC16(unsigned char *Message, int Len)
; //功	能:CRC16计算
; //入口参数:Message 要进行CRC16计算字符串,Len字符串长度  
; //返 回 值:CRC16计算结果  
; //设 计 者:覃道堂 
; //创作时间:2004-03-30
; //修改时间:
; //修改目的:
; //============================================================
; unsigned short CRC16(unsigned char *Message, int Len)
; {
	.dbline 19
; 	int 		byte;
; 	unsigned char  	k;
; 	unsigned short 	ACC,TOPBIT;
;     	unsigned short 	remainder = 0x0000;
	clr R12
	clr R13
	.dbline 21
; 
; 	TOPBIT = 0x8000;
	ldi R24,32768
	ldi R25,128
	movw R10,R24
	.dbline 22
;    	for (byte = 0; byte < Len; ++byte)
	clr R22
	clr R23
	xjmp L5
L2:
	.dbline 23
;    	{
	.dbline 24
; 		ACC = Message[byte];
	movw R30,R22
	add R30,R16
	adc R31,R17
	ldd R20,z+0
	clr R21
	.dbline 25
; 		remainder ^= (ACC <<8);
	movw R2,R20
	mov R3,R2
	clr R2
	eor R12,R2
	eor R13,R3
	.dbline 26
;        	for (k = 8; k > 0; --k)
	ldi R24,8
	mov R14,R24
	xjmp L9
L6:
	.dbline 27
;        	{
	.dbline 28
;            	if (remainder & TOPBIT)
	movw R2,R12
	and R2,R10
	and R3,R11
	tst R2
	brne X0
	tst R3
	breq L10
X0:
	.dbline 29
; 			{
	.dbline 30
;                	remainder = (remainder << 1) ^0x8005;
	ldi R24,32773
	ldi R25,128
	movw R2,R12
	lsl R2
	rol R3
	eor R2,R24
	eor R3,R25
	movw R12,R2
	.dbline 31
; 			}
	xjmp L11
L10:
	.dbline 33
;            	else
; 			{
	.dbline 34
;            	 	remainder = (remainder << 1);
	lsl R12
	rol R13
	.dbline 35
; 			}
L11:
	.dbline 36
L7:
	.dbline 26
	dec R14
L9:
	.dbline 26
	clr R2
	cp R2,R14
	brlo L6
	.dbline 37
L3:
	.dbline 22
	subi R22,255  ; offset = 1
	sbci R23,255
L5:
	.dbline 22
	cp R22,R18
	cpc R23,R19
	brlt L2
	.dbline 38
; 		}
;  	}
;     	return (remainder^0x0000);
	movw R16,R12
	.dbline -2
L1:
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r ACC 20 s
	.dbsym r byte 22 I
	.dbsym r TOPBIT 10 s
	.dbsym r k 14 c
	.dbsym r remainder 12 s
	.dbsym r Len 18 I
	.dbsym r Message 16 pc
	.dbend
	.dbfunc e Verify_Command _Verify_Command fc
;        Crc_Tmp -> R20,R21
;            Len -> R10,R11
;     ReceiveBuf -> R22,R23
	.even
_Verify_Command::
	xcall push_gset3
	movw R10,R18
	movw R22,R16
	.dbline -1
	.dbline 52
; } 
; 
; //============================================================
; //函	数:unsigned char Verify_Command(unsigned char *ReceiveBuf,int Len)
; //功	能:CRC校验处理
; //入口参数:校验数据,校验数据长度
; //返 回 值:0校验成功。否则不正确
; //设 计 者:覃道堂 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; unsigned char Verify_Command(unsigned char *ReceiveBuf,int Len)
; {
	.dbline 55
; 	unsigned short 	Crc_Tmp;
; 
; 	if(ReceiveBuf[4] != (Len - 2))//整包数据长度减去校验和为命令长度
	movw R24,R10
	sbiw R24,2
	movw R30,R22
	ldd R2,z+4
	clr R3
	cp R2,R24
	cpc R3,R25
	breq L13
	.dbline 56
; 		return 1;
	ldi R16,1
	xjmp L12
L13:
	.dbline 58
; 
; 	Crc_Tmp = ReceiveBuf[Len-2]*0x100 + ReceiveBuf[Len-1];
	movw R30,R10
	sbiw R30,2
	add R30,R22
	adc R31,R23
	ldd R18,z+0
	clr R19
	ldi R16,256
	ldi R17,1
	xcall empy16s
	movw R20,R16
	movw R30,R10
	sbiw R30,1
	add R30,R22
	adc R31,R23
	ldd R2,z+0
	clr R3
	add R20,R2
	adc R21,R3
	.dbline 60
; 	
; 	if((CRC16(ReceiveBuf, Len-2)) !=Crc_Tmp)
	movw R18,R10
	subi R18,2
	sbci R19,0
	movw R16,R22
	xcall _CRC16
	cp R16,R20
	cpc R17,R21
	breq L15
	.dbline 61
; 		return 3;
	ldi R16,3
	xjmp L12
L15:
	.dbline 62
; 	return 0;
	clr R16
	.dbline -2
L12:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r Crc_Tmp 20 s
	.dbsym r Len 10 I
	.dbsym r ReceiveBuf 22 pc
	.dbend

⌨️ 快捷键说明

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