Assembly codeLIST P=16F877;
#INCLUDE
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; }