📄 crc.lst
字号:
MPASM 03.10 Released CRC.ASM 4-18-2003 11:06:00 PAGE 1
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00001
00002 ; 注意:3种格式crc16 crc CCITT crc32
00003 ; 注意:crc校验里面的除法和余数,不是我们十进制种的那种除法和余数
00004 ; 2进制中除法为xor实现的,结果和十进制不同
00005 ; 例如
00006 ; 数据为110101(二进制数) 多项式为101(二进制数)
00007 ; 110101
00008 ; 101
00009 ; 111
00010 ; 101
00011 ; 010
00012 ; 101
00013 ; 0011 -11为crc校验值
00014 ; 如果转化为十进制110101=53 101=5 53=10*5+3
00015
00016 ; 此处的CRC校验采用的是欧洲的CCITT标准
00017 ; 。CRC-CCITT是一个17位生成多项式G=[1 0001 0000 0010 0001],
00018 ; 用多项式形式表示为G(x)=x16+x12+x5+1,(此处的x16代表x的16次方)
00019 ; 由它产生的检验码R的二进制位数是16位(2字节)。
00020
00021 ; e为取BYTEa高半字节 低半字节为0,三位字节[ e 0 0 ]
00022 ; f为取BYTEa低半字节 高半字节为0,三位字节[ f 0 0 ]
00023 ; 余数结果在下面表格
00024 ; 2 个字节为一个结果,偶数字节为首字节
00025
00026 ; 例如 BYTEa =0x7A,对应的e=0x7a&0xF0=0x70,f=0x0A
00027 ; 查表DATAe(0组-f组),第7组值为0x7E,0x97
00028 ; 合并为0x7E97 [0x70,0,0]余数为0x7E97
00029 ; 查表DATAf(0组-f组),第A组值为0xA1,0x4A
00030 ; 合并为0xA14A [0x0A,0,0]余数为0xA14A
00031 ; [0x7A,0,0]的余数,高字节为 0x7E xor 0xA1 = 0xDF
00032 ; [0x7A,0,0]的余数,低字节为 0x97 xor 0x4A = 0xDD
00033 ; 最后结果为0xDFDD(或者表示为[0xDF,0xDD])
00034 ; 如果BYTEb=0x35,BYTEc=0x71,
00035 ; 则[BYTEa,BYTEb,BYTEc]的crc校验为
00036 ; 高字节=0xDF xor 0x35 = 0xEA
00037 ; 低字节=0xDD xor 0x71 = 0xAC
00038 ; [BYTEa,BYTEb,BYTEc]=[0x7a,0x35,0x71]的CRC校验码为[0xEA,0xAC]
00039
00040
00041
Warning[215]: Processor superceded by command line. Verify processor symbol.
00042 list p=p16c505 ;选择MCU
00043 #include <p16c505.inc>
00001 LIST
00002 ; P16C505.INC Standard Header File, Version 1.10 Microchip Technology, Inc.
00117 LIST
0FFF 0FF1 00044 __CONFIG _CP_OFF & _WDT_OFF & _MCLRE_ON & _XT_OSC
00045
00046 ;***************************************************************
00047 ;变量定义
00000008 00048 BYTEa EQU 0x08 ;CRC校验的第一个字节
00000009 00049 BYTEb EQU 0x09 ;CRC校验的第二个字节
MPASM 03.10 Released CRC.ASM 4-18-2003 11:06:00 PAGE 2
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0000000A 00050 BYTEc EQU 0x0A ;CRC校验的第三个字节
0000000B 00051 RESULTh EQU 0x0B ;校验码高字节
0000000C 00052 RESULTl EQU 0x0C ;校验码低字节
0000000D 00053 ADDR EQU 0x0D ;存储地址
00054
00055 ;****************************************************************
00056
00057 ; e为取BYTEa高半字节 低半字节为0,三位字节[ e 0 0 ]
00058 ; 余数结果在下面表格
00059 ; 2 个字节为一个结果,偶数字节为首字节
0001 00060 ORG 0x01 ;PAGE0
0001 00061 Table:
0001 01E2 00062 ADDWF PCL,f
0002 00063 TableEntries:
0002 0800 0800 0812 00064 dt 0x00,0x00,0x12,0x31,0x24,0x62,0x36,0x53 ;0组-3组
0831 0824 0862
0836 0853
000A 0848 08C4 085A 00065 dt 0x48,0xC4,0x5A,0xF5,0x6C,0xA6,0x7E,0x97 ;4组-7组
08F5 086C 08A6
087E 0897
0012 0891 0888 0883 00066 dt 0x91,0x88,0x83,0xB9,0xB5,0xEA,0xA7,0xDB ;8组-b组
08B9 08B5 08EA
08A7 08DB
001A 08D9 084C 08CB 00067 dt 0xD9,0x4C,0xCB,0x7D,0xFD,0x2E,0xEF,0x1F ;c组-f组
087D 08FD 082E
08EF 081F
00068 ; f为取BYTEa低半字节 高半字节为0,三位字节[ e 0 0 ]
00069 ; 余数结果在下面表格
00070 ; 2 个字节为一个结果,偶数字节为首字节
0022 0800 0800 0810 00071 dt 0x00,0x00,0x10,0x21,0x20,0x42,0x30,0x63 ;0组-3组
0821 0820 0842
0830 0863
002A 0840 0884 0850 00072 dt 0x40,0x84,0x50,0xA5,0x60,0xC6,0x70,0xE7 ;4组-7组
08A5 0860 08C6
0870 08E7
0032 0881 0808 0891 00073 dt 0x81,0x08,0x91,0x29,0xA1,0x4A,0xB1,0x6B ;8组-b组
0829 08A1 084A
08B1 086B
003A 08C1 088C 08D1 00074 dt 0xC1,0x8C,0xD1,0xAD,0xE1,0xCE,0xF1,0xEF ;c组-f组
08AD 08E1 08CE
08F1 08EF
00075 ; 由于pic只有2级硬件堆栈 所以call函数中,只能引用一个表
00076 ; 把2个表合并为一个
00077 ;******************************************************************
00078 ; cal_crc函数的参数为BYTEa BYTEb BYTEc,
00079 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -