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

📄 crc.lst

📁 在PIC上实现CRC16算法的源程序
💻 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 + -