51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > PIC单片机 > 详细内容
PIC单片机实现CRC的小程序
发布时间:2009/7/24  阅读次数:477  字体大小: 【】 【】【
PIC单片机实现Dallas的iButton通讯时,编了段产生和校验CRC的子程序。
;PIC单片机 www.pic16.com
        #include  <P16CE625.INC>

;-------------------------------
        cblock        0x20
datBuff:8                        ;assign  8  byte  data  buffer
bit_cnt                                ;bit  counting  
CRC_COUNT                        ;number  of  bytes  for  CRC
CRC_RESULT                        ;CRC  resulr
crc_temp                        ;temporary  data  buffer  during  CRC
        endc

;-------------------------------
#define        skp0        btfsc
#define        skp1        btfss


;===============================
        org        0x000

        movlw        .7
        movwf        CRC_COUNT
        movlw        datBuff
        movwf        FSR                ;FSR  point  to  data  buffer
        call        CRC_CHECK
        movwf        datBuff+7
        goto        $

;===============================
;CHECK  THE  CRC  FOR  ?  BYTES  DATA
;For  the  polynomial  of  X^8  +  X^5  +  X^4  +  1
;Derived  from  Dallass  iButton  standard
;Before  calling,  FSR              =  data  buffer
;                                CRC_COUNT  =  number  of  bytes  for  CRC
CRC_CHECK        ;~~~~~~~~~~~~~~~
        clrf        CRC_RESULT        ;initialize  the  CRC  buffer
_crc_00
        movlw        .8                ;number  of  bits  for  one  byte
        movwf        bit_cnt                ;set  bit  counter
        movf        INDF,w                ;get  one  data  byte
        movwf        crc_temp        ;copy  to  temporary  location
_crc_01
        rrf        crc_temp,f        ;get  LSB  in  C
        skpc                        ;is  this  LSB=1?
        goto        _crc_02                ;go  if  LSB=0
        movlw        0x01                ;do  if  LSB=1
        xorwf        CRC_RESULT,f
_crc_02
        rrf        CRC_RESULT,w        ;get  LSB  of  CRC
        skpc                        ;test  LSB
        goto        _crc_03                ;go  if  LSB=0
        movlw        0x18                ;do  if  LSB=1
        xorwf        CRC_RESULT,f        ;polynomial  implementation
_crc_03
        rrf        CRC_RESULT,w        ;whole  byte  right  rotate
        rrf        CRC_RESULT,f
        decfsz        bit_cnt,f        ;bit  counting
        goto        _crc_01                ;go  on  until  aa  8  bits  done
        incf        FSR,f                ;pointer  update  to  next  byte
        decfsz        CRC_COUNT,f        ;byte  counting
        goto        _crc_00                ;go  on  until  all  byte  done
        movf        CRC_RESULT,w        ;get  CRC,  Z  set  if  CRC=0
        return                        ;return  with  CRC  in  W

        END
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号