Processor 16F877 Radix DEC EXPAND include "p16f877.inc" CBLOCK 0x20 lastH lastL thisH thisL diffH diffL count tmp TxW TxR NumH NumL TenK Thou Hund Tens Ones TxBuffer:32 ENDC _ResetVector set 0x00 _IntVector set 0x04 ORG _ResetVector goto Start Start: CLRF PORTA CLRF PORTB CLRF PORTC CLRF PORTD BANKSEL CCP1CON movlw 0x04 ; Capture every falling edge movwf CCP1CON BANKSEL T1CON movlw 0x05 ; Timer mode movwf T1CON BANKSEL SPBRG ; Setup Baud rate movlw 5 ; 38400 with low rate movwf SPBRG ; 14745600/ 64(5+1) = 38400 ; Enable USART TX Enable and set BaudRate LOW movlw B'00100000' ; TXEN movwf TXSTA BANKSEL RCSTA movlw 0x80 movwf RCSTA BANKSEL TRISD MOVLW 0x00 ; all o/p MOVWF TRISD BANKSEL TRISB movlw 0x00 movwf TRISB movlw 0xBF ; all i/p except RC6/TX movwf TRISC BANKSEL TxR clrf TxR clrf TxW BANKSEL STATUS bcf STATUS,IRP ; select bank 0/1 for INDF loop BANKSEL TxR ; Any chars in the buffer ? movf TxR,W xorwf TxW,W ; 0 -> empty btfsc STATUS,Z goto nothing BANKSEL TXSTA ; Tx buffer empty btfss TXSTA,TRMT goto nothing BANKSEL TxR movlw TxBuffer addwf TxR,W movwf FSR movf INDF,W movwf TXREG incf TxR,W andlw 0x1F movwf TxR nothing BANKSEL PIR1 btfss PIR1,2 ; test CCP1IF goto loop clrf PORTB clrf PORTD movf CCPR1H,W movwf thisH movwf diffH movf CCPR1L,W movwf thisL movwf diffL ;---------------------------- ; 16-bit Subtraction-with-Borrow ; lastH:lastL - Number to be subtracted ; Carry - NOT( Borrow to be subtracted ) ; diffH:diffL - Number to be subtracted FROM ;Out diffH:diffL - Result ; Carry - NOT( Borrow result) movf lastL,W subwf diffL,F movf lastH,W btfss STATUS,C incfsz lastH,W subwf diffH,F ;diff = diff - last, WITH VALID CARRY ;(although the Z flag is not valid). movf thisH,W movwf lastH movf thisL,W movwf lastL movf diffH,W sublw 32 btfss STATUS,C goto testtx movf diffH,W ;; movwf PORTB movwf NumH ;; call write movf diffL,W ;; movwf PORTD movwf NumL call Convert movf Thou,W addlw 0x30 call write movf Hund,W addlw 0x30 call write movf Tens,W addlw 0x30 call write movf Ones,W addlw 0x30 call write movlw 0x20 call write goto done testtx movlw 13 call write movlw 10 call write done bcf PIR1,2 goto loop writehex write BANKSEL TxW movwf tmp movlw TxBuffer addwf TxW,W movwf FSR movf tmp,W movwf INDF incf TxW,W andlw 0x1F movwf TxW movwf PORTB return Convert: ; Takes number in NumH:NumL ; Returns decimal in ; TenK:Thou:Hund:Tens:Ones swapf NumH,W andlw 0x0F ;*** PERSONALLY, I'D REPLACE THESE 2 addlw 0xF0 ;*** LINES WITH "IORLW 11110000B" -AW movwf Thou addwf Thou,F addlw 0xE2 movwf Hund addlw 0x32 movwf Ones movf NumH,W andlw 0x0F addwf Hund,F addwf Hund,F addwf Ones,F addlw 0xE9 movwf Tens addwf Tens,F addwf Tens,F swapf NumL,W andlw 0x0F addwf Tens,F addwf Ones,F rlf Tens,F rlf Ones,F comf Ones,F rlf Ones,F movf NumL,W andlw 0x0F addwf Ones,F rlf Thou,F movlw 0x07 movwf TenK movlw 0x0A ; Ten Lb1: addwf Ones,F decf Tens,F btfss 3,0 goto Lb1 Lb2: addwf Tens,F decf Hund,F btfss 3,0 goto Lb2 Lb3: addwf Hund,F decf Thou,F btfss 3,0 goto Lb3 Lb4: addwf Thou,F decf TenK,F btfss 3,0 goto Lb4 retlw 0 END