📄 timin.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; TIMIN.ASM MPB 25-8-05
;
; Measure input period using Timer1 16-bit capture
; and display in microseconds
;
; STATUS: Capture working
; Conversion working
; Display in progress
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROCESSOR 16F877A
; Clock = XT 4MHz, standard fuse settings:
__CONFIG 0x3731
; LABEL EQUATES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INCLUDE "P16F877A.INC" ; Standard register labels
; Local label equates.....................................
Hibyte EQU 020
Lobyte EQU 021
Tents EQU 022
Thous EQU 023
Hunds EQU 024
Tens EQU 025
Ones EQU 026
; Program begins ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0 ; Place machine code
NOP ; Required for ICD mode
GOTO init
ORG 4 ; Interrupt vector adress
GOTO ISR ; jump to service routine
init NOP
BANKSEL TRISD ; Select bank 1
CLRF TRISD ; Initialise display port
CLRF PIE1 ; Disable peripheral interrupts
BANKSEL PORTD ; Select bank 0
CLRF PORTD ; Clear display outputs
MOVLW B'11000000' ; Enable..
MOVWF INTCON ; ..peripheral interrupts
MOVLW B'00000100' ; Capture mode:
MOVWF CCP1CON ; ..every falling edge
MOVLW B'00000001' ; Enable..
MOVWF T1CON ; ..Timer 1
GOTO start ; Jump to main program
; INTERRUPT SERVICE ROUTINE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ISR CLRF TMR1L
CLRF TMR1H
BCF PIR1,CCP1IF ; Reset interrupt flag
RETFIE
; SUBROUTINES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INCLUDE "LCDIS.INC" ; Include display routines
;----------------------------------------------------------------
; Convert 16 bit binary result to 5 digits
;----------------------------------------------------------------
conv MOVF CCPR1L,W ; Get high byte
MOVWF Lobyte ; and store
MOVF CCPR1H,W ; Get low byte
MOVWF Hibyte ; and store
MOVLW 06 ; Correction value
BCF STATUS,C ; prepare carry flag
ADDWF Lobyte ; add correction
BTFSC STATUS,C ; and carry
INCF Hibyte ; in required
CLRF Tents ; clear ten thousands register
CLRF Thous ; clear thousands register
CLRF Hunds ; clear hundreds register
CLRF Tens ; clear tens register
CLRF Ones ; clear ones register
; Subtract 10000d (2710h) and count ...........................
sub10 MOVLW 010 ; get low byte to sub
BSF STATUS,C ; get ready to subtract
SUBWF Lobyte ; sub 10h from low byte
BTFSC STATUS,C ; borrow required?
GOTO sub27 ; no - sub high byte
MOVF Hibyte,F ; yes - check high byte
BTFSS STATUS,Z ; zero?
GOTO take1 ; no - take borrow
MOVLW 010 ; yes - load low byte to add
BCF STATUS,C ; get ready to add
ADDWF Lobyte ; restore low byte
GOTO subE8 ; next digit
take1 DECF Hibyte ; take borrow
sub27 MOVLW 027 ; get high byte to sub
BSF STATUS,C ; get ready to subtract
SUBWF Hibyte ; sub from high byte
BTFSS STATUS,C ; borrow taken?
GOTO done1 ; yes - restore remainder
INCF Tents ; no - count ten thousand
GOTO sub10 ; sub 10000 again
done1 MOVLW 010 ; restore..
BCF STATUS,C ; get ready to add
ADDWF Lobyte ; restore low byte
BTFSC STATUS,C ; Carry into high byte?
INCF Hibyte ; yes - add carry to high byte
MOVLW 027 ; restore..
ADDWF Hibyte ; ..high byte
; Subtract 1000d (03E8) and count.................................
subE8 MOVLW 0E8 ; get low byte to sub
BSF STATUS,C ; get ready to subtract
SUBWF Lobyte ; sub from low byte
BTFSC STATUS,C ; borrow required?
GOTO sub03 ; no - do high byte
MOVF Hibyte,F ; yes - check high byte
BTFSS STATUS,Z ; zero?
GOTO take2 ; no - take borrow
MOVLW 0E8 ; load low byte to add
BCF STATUS,C ; get ready to add
ADDWF Lobyte ; restore low byte
GOTO sub64 ; next digit
take2 DECF Hibyte ; take borrow
sub03 MOVLW 03 ; get high byte
BSF STATUS,C ; get ready to subtract
SUBWF Hibyte ; sub from high byte
BTFSS STATUS,C ; borrow taken?
GOTO done2 ; yes - restore high byte
INCF Thous ; no - count ten thousand
GOTO subE8 ; sub 1000 again
done2 MOVLW 0E8 ; restore..
BCF STATUS,C ; get ready to add
ADDWF Lobyte ; restore low byte
BTFSC STATUS,C ; Carry into high byte?
INCF Hibyte ; yes - add carry to high byte
MOVLW 03 ; restore..
ADDWF Hibyte ; ..high byte
; Subtract 100d (064h) and count.................................
sub64 MOVLW 064 ; get low byte
BSF STATUS,C ; get ready to subtract
SUBWF Lobyte ; sub from low byte
BTFSC STATUS,C ; borrow required?
GOTO inchun ; no - inc count
MOVF Hibyte,F ; yes - check high byte
BTFSS STATUS,Z ; zero?
GOTO take3 ; no - take borrow
MOVLW 064 ; load low byte to add
BCF STATUS,C ; get ready to add
ADDWF Lobyte ; restore low byte
GOTO subA ; next digit
take3 DECF Hibyte ; take borrow
inchun INCF Hunds ; count hundred
GOTO sub64 ; sub 100 again
; Subtract 10d (0Ah) and count, leaving remainder.................
subA MOVLW 0A ; get low byte to sub
BSF STATUS,C ; get ready to subtract
SUBWF Lobyte ; sub from low byte
BTFSS STATUS,C ; borrow required?
GOTO rest4 ; yes - restore byte
INCF Tens ; no - count one hundred
GOTO subA ; and repeat
rest4 ADDWF Lobyte ; restore low byte
MOVF Lobyte,W ; copy remainder..
MOVWF Ones ; to ones register
RETURN ; done
;---------------------------------------------------------------
; Display period in microseconds
;---------------------------------------------------------------
disp BSF Select,RS ; Set display data mode
MOVLW 'T' ; Time period
CALL send ; Display it
MOVLW ' ' ; Space
CALL send ; Display it
MOVLW '=' ; Equals
CALL send ; Display it
MOVLW ' ' ; Space
CALL send ; Display it
; Supress leading zeros.........................................
MOVF Tents,F ; Check digit
BTFSS STATUS,Z ; zero?
GOTO show1 ; no - show it
MOVF Thous,F ; Check digit
BTFSS STATUS,Z ; zero?
GOTO show2 ; no - show it
MOVF Hunds,F ; Check digit
BTFSS STATUS,Z ; zero?
GOTO show3 ; no - show it
MOVF Tens,F ; Check digit
BTFSS STATUS,Z ; zero?
GOTO show4 ; no - show it
MOVF Ones,F ; Check digit
BTFSS STATUS,Z ; zero?
GOTO show5 ; no - show it
; Display digits of period.....................................
show1 MOVLW 030 ; Load ASCII offset
ADDWF Tents,W ; Add digit value
CALL send ; Display it
show2 MOVLW 030 ; Load ASCII offset
ADDWF Thous,W ; Add digit value
CALL send ; Display it
show3 MOVLW 030 ; Load ASCII offset
ADDWF Hunds,W ; Add digit value
CALL send ; Display it
show4 MOVLW 030 ; Load ASCII offset
ADDWF Tens,W ; Add digit value
CALL send ; Display it
show5 MOVLW 030 ; Load ASCII offset
ADDWF Ones,W ; Add digit value
CALL send ; Display it
; Show fixed characters.........................................
MOVLW ' ' ; Space
CALL send ; Display it
MOVLW 'u' ; micro
CALL send ; Display it
MOVLW 's' ; secs
CALL send ; Display it
MOVLW ' ' ; Space
CALL send ; Display it
MOVLW ' ' ; Space
CALL send ; Display it
; Home cursor .................................................
BCF Select,RS ; Set display command mode
MOVLW 0x80 ; Code to home cursor
CALL send ; Do it
RETURN ; done
;---------------------------------------------------------------
; MAIN LOOP
;---------------------------------------------------------------
start CALL inid ; Initialise display
BANKSEL PIE1 ; Select Bank 1
BSF PIE1,CCP1IE ; Enable capture interrupt
BANKSEL PORTD ; Select Bank 0
BCF PIR1,CCP1IF ; Clear CCP1 interrupt flag
loop CALL conv ; Convert 16 bits to 5 digits
CALL disp ; Display period in microsecs
GOTO loop
END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -