📄 20077912523418107.asm
字号:
AD_ROTATE
RRF S_ADJ,F ;ROTATE RIGHT 1 BIT
DECFSZ S_ADJ_COUNT,F ;END ?
GOTO AD_ROTATE ;NO. CONTINUE
MOVFW S_ADJ ;READ ROTATED VALUE
ANDLW B'00000111' ;PICK-UP 3 BITS
ADDLW D'54' ;(0 TO 7) + 54 = 54 TO 61
MOVWF S_ADJ ;SAVE ADJUSTMENT DATA
;*** CAPTURE GUARD TIMER ( 1 MILISECOUND )
MOVLW D'2' ;SET LOOP COUNTER1
MOVWF G_TIME1 ;SAVE LOOP COUNTER1
G_LOOP1 MOVLW D'124' ;SET LOOP COUNTER2
MOVWF G_TIME2 ;SAVE LOOP COUNTER2
G_LOOP2 NOP ;TIME ADJUST
DECFSZ G_TIME2,F ;G_TIME2 - 1 = 0 ?
GOTO G_LOOP2 ;NO. CONTINUE
DECFSZ G_TIME1,F ;G_TIME1 - 1 = 0 ?
GOTO G_LOOP1 ;NO. CONTINUE
;*** RECEIVE PULSE DETECTOR ON
BSF PORTA,RA5 ;SET DETECTOR ON
GOTO INT_END
;*************** PULSE SEND-OUT PROCESS ****************
PULSE
MOVLW B'00010000' ;RC4=ON
MOVWF PORTC ;SET PORTC REGISTER
CALL T12US ;CALL 12USEC TIMER
CLRF PORTC ;RC4=OFF
GOTO $+1
GOTO $+1
NOP
RETURN
;*************** 12 MICROSECONDS TIMER *****************
T12US
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
NOP
RETURN
;****************** CAPTURE PROCESS ********************
CAPTURE
BCF PIR1,CCP1IF ;CLEAR CCP1 INT FLAG
CLRF P_COUNTL ;CLEAR L COUNT
CLRF P_COUNTH ;CLEAR H COUNT
CLRF CCP1CON ;CCP1 OFF
DIVISION
MOVFW S_ADJ ;READ ADJUSTMENT DATA
SUBWF CCPR1L,F ;CAPTURE - ADJUST
BTFSC STATUS,Z ;RESULT = 0 ?
GOTO DIVISION2 ;YES. "R = 0"
BTFSC STATUS,C ;RESULT < 0 ?
GOTO DIVISION1 ;NO. "R > 0"
GOTO DIVISION3 ;YES."R < 0"
DIVISION1 ;( R > 0 )
MOVLW D'1' ;SET INCREMENT VALUE
ADDWF P_COUNTL,F ;INCREMENT L COUNT
BTFSS STATUS,C ;OVERFLOW ?
GOTO DIVISION ;NO. CONTINUE
INCF P_COUNTH,F ;INCREMENT H COUNT
GOTO DIVISION ;JUMP NEXT
DIVISION2 ;( R = 0 )
MOVFW CCPR1H ;READ CCPR1H
BTFSS STATUS,Z ;CCPR1H = 0 ?
GOTO DIVISION1 ;NO. NEXT
MOVLW D'1' ;SET INCREMENT VALUE
ADDWF P_COUNTL,F ;INCREMENT L COUNT
BTFSS STATUS,C ;OVERFLOW ?
GOTO DIGIT_SET ;JUMP TO DIGIT SET
INCF P_COUNTH,F ;INCREMENT H COUNT
GOTO DIGIT_SET ;JUMP TO DIGIT SET
DIVISION3 ;( R < 0 )
MOVFW CCPR1H ;READ CCPR1H
BTFSS STATUS,Z ;CCPR1H = 0 ?
GOTO DIVISION4 ;NO. BORROW PROCESS
GOTO DIGIT_SET ;JUMP TO DIGIT SET
DIVISION4
DECF CCPR1H,F ;CCPR1H - 1
MOVLW D'255' ;BORROW VALUE
ADDWF CCPR1L,F ;CCPR1L + 255
INCF CCPR1L,F ;CCPR1L + 1
GOTO DIVISION1 ;NEXT
;**************** DIGIT SET PROCESS ********************
DIGIT_SET
CLRF DISP_U ;CLEAR 1ST DIGIT
CLRF DISP_T ;CLEAR 10TH DIGIT
CLRF DISP_H ;CLEAR 100TH DIGIT
;*** 100TH DIGIT
DIGIT_H
MOVLW D'100' ;DIVIDE VALUE
SUBWF P_COUNTL,F ;DIGIT - DIVIDE
BTFSC STATUS,Z ;RESULT = 0 ?
GOTO DIGIT_H2 ;YES. "R = 0"
BTFSC STATUS,C ;RESULT < 0 ?
GOTO DIGIT_H1 ;NO. "R > 0"
GOTO DIGIT_H3 ;YES."R < 0"
DIGIT_H1 ;( R > 0 )
INCF DISP_H,F ;INCREMENT 100TH COUNT
GOTO DIGIT_H ;JUMP NEXT
DIGIT_H2 ;( R = 0 )
MOVFW P_COUNTH ;READ H COUNTER
BTFSS STATUS,Z ;H COUNTER = 0 ?
GOTO DIGIT_H1 ;NO. NEXT
INCF DISP_H,F ;INCREMENT 100TH COUNT
GOTO DIGIT_T ;JUMP TO 10TH DIGIT PRO
DIGIT_H3 ;( R < 0 )
MOVFW P_COUNTH ;READ H COUNTER
BTFSS STATUS,Z ;H COUNTER = 0 ?
GOTO DIGIT_H4 ;NO. BORROW PROCESS
MOVLW D'100' ;DIVIDE VALUE
ADDWF P_COUNTL,F ;RETURN OVER SUB VALUE
GOTO DIGIT_T ;JUMP TO 10TH DIGIT PRO
DIGIT_H4
DECF P_COUNTH,F ;H COUNTER - 1
MOVLW D'255' ;BORROW VALUE
ADDWF P_COUNTL,F ;L COUNTER + 255
INCF P_COUNTL,F ;L COUNTER + 1
GOTO DIGIT_H1 ;NEXT
;*** 10TH DIGIT
DIGIT_T
;*** RANGE OVER CHECK
MOVFW DISP_H ;READ 100TH DIGIT
SUBLW D'9' ;9 - (100TH DIGIT)
BTFSC STATUS,Z ;RESULT = 0 ?
GOTO DIGIT_T0 ;YES. "R = 0"
BTFSC STATUS,C ;RESULT < 0 ?
GOTO DIGIT_T0 ;NO. "R > 0"
MOVLW H'0A' ;"DETECT ERROR" DATA
MOVWF DISP_U ;SET 1ST DIGIT
MOVWF DISP_T ;SET 10TH DIGIT
MOVWF DISP_H ;SET 100TH DIGIT
GOTO INT_END
DIGIT_T0
MOVLW D'10' ;DIVIDE VALUE
SUBWF P_COUNTL,F ;DIGIT - DIVIDE
BTFSC STATUS,Z ;RESULT = 0 ?
GOTO DIGIT_T1 ;YES. "R = 0"
BTFSC STATUS,C ;RESULT < 0 ?
GOTO DIGIT_T1 ;NO. "R > 0"
GOTO DIGIT_T2 ;YES."R < 0"
DIGIT_T1 ;( R >= 0 )
INCF DISP_T,F ;INCREMENT 10TH COUNT
GOTO DIGIT_T ;JUMP NEXT
DIGIT_T2 ;( R < 0 )
MOVLW D'10' ;DIVIDE VALUE
ADDWF P_COUNTL,F ;RETURN OVER SUB VALUE
GOTO DIGIT_U ;JUMP TO 1ST DIGIT PRO
;*** 1ST DIGIT
DIGIT_U
MOVFW P_COUNTL ;READ PROPAGETION COUNTER
MOVWF DISP_U ;SAVE 1ST COUNT
GOTO INT_END
;**************** LED DISPLAY CONTROL *****************
LED_CONT
BCF PIR1,TMR2IF ;CLEAR TMR2 INT FLAG
MOVFW DIGIT_CNT ;READ DIGIT COUNTER
MOVWF S_DIGIT ;SAVE DIGIT COUNTER
DECFSZ S_DIGIT,F ;1ST DIGIT ?
GOTO D_CHECK1 ;NO. NEXT
BSF PORTA,RA1 ;RA1=OFF
BSF PORTA,RA2 ;RA2=OFF
BCF PORTA,RA3 ;RA3=ON
GOTO C_DIGIT ;JUMP TO DIGIT CONT
D_CHECK1
DECFSZ S_DIGIT,F ;10TH DIGIT ?
GOTO D_CHECK2 ;NO. 100TH DIGIT
BSF PORTA,RA1 ;RA1=OFF
BCF PORTA,RA2 ;RA2=ON
BSF PORTA,RA3 ;RA3=OFF
GOTO C_DIGIT ;JUMP TO DIGIT CONT
D_CHECK2
BCF PORTA,RA1 ;RA1=ON
BSF PORTA,RA2 ;RA2=OFF
BSF PORTA,RA3 ;RA3=OFF
C_DIGIT
DECF DIGIT_CNT,W ;DIGIT COUNT - 1
ADDWF DISP_HA,W ;DIGIT H.ADR + COUNT
MOVWF FSR ;SET FSR REGISTER
MOVFW INDF ;READ DIGIT
ADDWF SEG7_HA,W ;SEG7 H.ADR + DIGIT
MOVWF FSR ;SET FSR REGISTER
MOVFW INDF ;READ SEG7 DATA
MOVWF PORTB ;WRITE LED DATA
DECFSZ DIGIT_CNT,F ;DIGIT COUNT - 1
GOTO INT_END ;JUMP TO INTERRUPT END
MOVLW D'3' ;INITIAL VALUE
MOVWF DIGIT_CNT ;SET INITIAL VALUE
GOTO INT_END ;JUMP TO INTERRUPT END
;********************************************************
; END OF ULTRASONIC RANGE METER
;********************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -