用PIC单片机和达拉斯的iButton的通讯时,编了段产生和校验CRC的子程序
的#include
; ---------------------- ---------
cblock 0x20
datBuff:8;分配8个字节的数据缓冲区
bit_cnt;位计数
CRC_COUNT; CRC的字节数
CRC_RESULT; CRC resulr
crc_temp; CRC
endc 期间的临时数据缓冲区
; ------ -------------------------
#define skp0 btfsc
#define skp1 btfss
; ================== ==============
org 0x000
movlw .7
movwf CRC_COUNT
movlw datBuff
movwf FSR; FSR指向数据缓冲区
调用CRC_CHECK
movwf datBuff + 7
goto $
; ========== ======================
;检查CRC?BYTES DATA
;对于X ^ 8 + X ^ 5 + X ^ 4 +1的多项式
;派生自达拉斯的iButton标准
;在调用之前,FSR =数据缓冲区
;CRC_COUNT = CRC的字节数
CRC_CHECK;“”“”“”“”“”“”“”
clrf CRC_RESULT;初始化CRC缓冲区
_crc_00
movlw .8;一位字节的位数
movwf bit_cnt;设置位计数器
movf INDF ,w;获得一个数据字节
movwf crc_temp;复制到临时位置
_crc_01
rrf crc_temp,f;在C
skpc中获得LSB ;此LSB = 1吗?
转到_crc_02;如果LSB = 0
movlw 0x01则执行;如果LSB = 1
xorwf CRC_RESULT则执行,f
_crc_02
rrf CRC_RESULT,w;
goto _crc_03;如果LSB = 0
movlw 0x18;执行;如果LSB = 1
xorwf CRC_RESULT,f;多项式实现
_crc_03
rrf CRC_RESULT,w;全字节右旋转
rrf CRC_RESULT,f
decfsz bit_cnt,f;位计数
转到_crc_01; aa完成8位
incf FSR,f;指针更新到下一个字节
decfsz CRC_COUNT,f;字节计数
转到_crc_00;继续直到完成所有字节
movf CRC_RESULT,w;获得CRC,如果CRC = 0
返回则置Z ;返回CRC in WEND
用PIC单片机和达拉斯的iButton的通讯时,编了段产生和校验CRC的子程序
的#include
; ---------------------- ---------
cblock 0x20
datBuff:8;分配8个字节的数据缓冲区
bit_cnt;位计数
CRC_COUNT; CRC的字节数
CRC_RESULT; CRC resulr
crc_temp; CRC
endc 期间的临时数据缓冲区
; ------ -------------------------
#define skp0 btfsc
#define skp1 btfss
; ================== ==============
org 0x000
movlw .7
movwf CRC_COUNT
movlw datBuff
movwf FSR; FSR指向数据缓冲区
调用CRC_CHECK
movwf datBuff + 7
goto $
; ========== ======================
;检查CRC?BYTES DATA
;对于X ^ 8 + X ^ 5 + X ^ 4 +1的多项式
;派生自达拉斯的iButton标准
;在调用之前,FSR =数据缓冲区
;CRC_COUNT = CRC的字节数
CRC_CHECK;“”“”“”“”“”“”“”
clrf CRC_RESULT;初始化CRC缓冲区
_crc_00
movlw .8;一位字节的位数
movwf bit_cnt;设置位计数器
movf INDF ,w;获得一个数据字节
movwf crc_temp;复制到临时位置
_crc_01
rrf crc_temp,f;在C
skpc中获得LSB ;此LSB = 1吗?
转到_crc_02;如果LSB = 0
movlw 0x01则执行;如果LSB = 1
xorwf CRC_RESULT则执行,f
_crc_02
rrf CRC_RESULT,w;
goto _crc_03;如果LSB = 0
movlw 0x18;执行;如果LSB = 1
xorwf CRC_RESULT,f;多项式实现
_crc_03
rrf CRC_RESULT,w;全字节右旋转
rrf CRC_RESULT,f
decfsz bit_cnt,f;位计数
转到_crc_01; aa完成8位
incf FSR,f;指针更新到下一个字节
decfsz CRC_COUNT,f;字节计数
转到_crc_00;继续直到完成所有字节
movf CRC_RESULT,w;获得CRC,如果CRC = 0
返回则置Z ;返回CRC in WEND
举报