pic单片机汇编程序翻译成c语言解决办法

pic单片机汇编程序翻译成c语言
高手帮忙把这段汇编翻译成c,小弟不胜感激!!!!!!!!!
list p=16f877;
#include <p16f877.inc>
xmit_data equ 30h
data_cnt equ 31h
ccpi_int_cnt equ 32h
org 000h
reset 
goto start
org 0004h
;;;;;;;;;;;;;;;;;;;;;;;;;;;ccp中断
PER_INT_V
BCF STATUS,RP0;
BCF PIR1,CCP1IF;
INCF ccpi_int_cnt,F;
BTFSS ccpi_int_cnt,0;
GOTO SYNC_PULSE
DATA_PULSE
DECF data_cnt,F;
BTFSC STATUS,Z
goto PERIOD_DELTA
RLF xmit_data,F;
MOVLW 5EH;
BTFSC STATUS,C;
MOVLW 2FH;
SEND_DATA;发送
ADDWF CCPR1L,F;
BTFSC STATUS,C;
INCF CCPR1H,F;
GOTO RET_FIE;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;发送结尾
PERIOD_DELTA
MOVLW 0EEH;
ADDWF CCPR1L,F;
BTFSC STATUS,C
INCF CCPR1H,F;
MOVLW 2;
ADDWF CCPR1H,F;
RET_FIE
BCF CCP1CON,0;
RETFIE;中断返回
SYNC_PULSE
MOVLW 2FH;
ADDWF CCPR1L,F;
BTFSC STATUS,C;
INCF CCPR1H,F;
BSF CCP1CON,0;
RETFIE;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAIN()
start
bcf STATUS,RP1;
bcf STATUS,RP0;
CLRF TMR1H
CLRF TMR1L
;MOVLW 0XFF;
;MOVWF TMR1H;
;MOVLW 0XFF;
;MOVWF TMR1L;
CLRF INTCON
CLRF PIR1
CLRF PIR2
BSF STATUS,RP0
MOVLW 0x00;
MOVWF OPTION_REG
CLRF PIE1;
CLRF PIE2;
CLRF T1CON
MOVLW 0xff;
MOVWF TRISB;
MOVLW B'11111011'
MOVWF TRISC;
BSF PIE1,CCP1IE;
BCF STATUS,RP0;
BSF INTCON,PEIE;
BSF INTCON,GIE;
MOVLW 0x08;
MOVWF CCP1CON;
MOVLW 0x09;
MOVWF data_cnt;
MOVLW 0xff;
MOVWF ccpi_int_cnt;
BSF T1CON,TMR1ON;
NEXT_BYTE
WAIT 
MOVF data_cnt,w;
BTFSS STATUS,Z
GOTO WAIT;
MOVF PORTB,W;
MOVWF xmit_data;
MOVLW 0xff;
MOVWF ccpi_int_cnt;
MOVLW 0x09;
MOVWF data_cnt;
GOTO NEXT_BYTE;
end;

------解决方案--------------------
测试f 中的某位,为1 则跳过下一句
------解决方案--------------------
WAIT 这是标号
MOVF data_cnt,w;取变量data_cnt到W寄存器
BTFSS STATUS,Z 因为上次操作影响状态寄存器的Z位,判断Z位是否为1,是则跳过goto语句,否则执行goto语句
GOTO WAIT;
看来data_cnt你声明了volatile类型,这段语句相当于while(data_cnt != 0);
你是对的。
------解决方案--------------------
自己查指令表吧,能用C的谁会去记这些指令!
------解决方案--------------------
指令早就不记得了,pic很简单,一共好像就二三十条指令,看看就懂了。
------解决方案--------------------
Assembly code

    LIST P=16F877;
    #INCLUDE <P16F877.INC>
    XMIT_DATA EQU 30H
    DATA_CNT EQU 31H
    CCPI_INT_CNT EQU 32H

        ORG 000H
        RESET  
        GOTO START

        ORG 0004H
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;CCP???
PER_INT_V
        BCF STATUS,RP0;            ;bank(0)
        BCF PIR1,CCP1IF;        ;CCP1IF=0;
        INCF CCPI_INT_CNT,F;        ;CCPI_INT_CNT++
        BTFSS CCPI_INT_CNT,0;        ;if(CCPI_INT_CNT%2=1){
        GOTO SYNC_PULSE
DATA_PULSE
        DECF DATA_CNT,F;            DATA_CNT--;
        BTFSC STATUS,Z                if(DATA_CNT!=0){
        GOTO PERIOD_DELTA
        RLF XMIT_DATA,F;                if(XMIT_DATA/128==1) CCPR1+=0x2F;
        MOVLW 5EH;                    else            CCPR1+=0x5E;
        BTFSC STATUS,C;                    XMIT_DATA*=2;
        MOVLW 2FH;
SEND_DATA;??E
        ADDWF CCPR1L,F;
        BTFSC STATUS,C;
        INCF CCPR1H,F;
        GOTO RET_FIE;
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;??E???
PERIOD_DELTA
        MOVLW 0EEH;
        ADDWF CCPR1L,F;
        BTFSC STATUS,C
        INCF CCPR1H,F;
        MOVLW 2;
        ADDWF CCPR1H,F;
RET_FIE
        BCF CCP1CON,0;                    ;CCP1CON.ON=0
        RETFIE;??????^                }else{    
SYNC_PULSE
        MOVLW 2FH;
        ADDWF CCPR1L,F;                    ;CCPR1+=0x2F
        BTFSC STATUS,C;
        INCF CCPR1H,F;
        BSF CCP1CON,0;                    ;CCP1CON.ON=1
        RETFIE;                    }
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAIN()
START:
        BCF STATUS,RP1;
        BCF STATUS,RP0;            ;BANK(0)
        CLRF TMR1H
        CLRF TMR1L            ;TMR1=0
        ;MOVLW 0XFF;
        ;MOVWF TMR1H;
        ;MOVLW 0XFF;
        ;MOVWF TMR1L;
        CLRF INTCON            ;INTCON =0
        CLRF PIR1            ;PIR1=0
        CLRF PIR2            ;PIR2=0
        BSF STATUS,RP0            ;BANK(1)
        MOVLW 0X00;
        MOVWF OPTION_REG        ;OPTION_REG =0;
        CLRF PIE1;            ;PIE1=0
        CLRF PIE2;            ;PIE2=0
        CLRF T1CON            ;T1CON=0
        MOVLW 0XFF;
        MOVWF TRISB;            ;TRISB=0xFF
        MOVLW B'11111011'
        MOVWF TRISC;            ;TRISC=0XFB
        BSF PIE1,CCP1IE;        ;CCP1IE =1
        BCF STATUS,RP0;            ;BANK(0)
        BSF INTCON,PEIE;        ;PIEE=1
        BSF INTCON,GIE;            ;GIE =1
        MOVLW 0X08;
        MOVWF CCP1CON;            ;CCP1CON =8
        MOVLW 0X09;
        MOVWF DATA_CNT;            ;DATA_CNT =9
        MOVLW 0XFF;
        MOVWF CCPI_INT_CNT;        ;CCP1_INT_CNT =0xFF
        BSF T1CON,TMR1ON;        ;TMR1ON =1
        NEXT_BYTE            ;while(1){
        WAIT          
        MOVF DATA_CNT,W;        ;    if(DATA_CNT)wait();
        BTFSS STATUS,Z
        GOTO WAIT;
        MOVF PORTB,W;
        MOVWF XMIT_DATA;        ;    XMIT_DATA=PORTB;
        MOVLW 0XFF;
        MOVWF CCPI_INT_CNT;        ;    CCPI_INT_CNT=0xFF
        MOVLW 0X09;
        MOVWF DATA_CNT;            ;    DATA_CNT=0x09
        GOTO NEXT_BYTE;            }