⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timin.asm

📁 代码保护功能处于持续发展中。Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏Microchip 代码保护功能的行为均可视 为违反了《数字器件千年版权法案(Digital Mille
💻 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 + -