?? 20077912523418107.asm
字號:
;********************************************************
;
; ULTRASONIC RANGE METER
;
; DEVICE : PIC16F873
; AUTHOR : SEIICHI INOUE
;********************************************************
LIST P=PIC16F873
INCLUDE P16F873.INC
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF
ERRORLEVEL -302 ;SUPPRESS BANK WARNING
;**************** LABEL DEFINITION ********************
CBLOCK H'20'
S_COUNT ;SEND-OUT PULSE COUNT ADR
S_ADJ ;ADJUSTMENT DATA ADDRESS
S_ADJ_COUNT ;ROTATE VALUE SAVE ADR
S_DIGIT ;DIGIT CONT WORK ADDRESS
G_TIME1 ;GUARD TIMER ADDRESS 1
G_TIME2 ;GUARD TIMER ADDRESS 2
P_COUNTL ;PROPAGATION L CNT ADR
P_COUNTH ;PROPAGATION H CNT ADR
DIGIT_CNT ;DIGIT COUNTER HEAD ADR
DISP_HA ;DIGIT HEAD ADDRESS
DISP_U ;1ST DIGIT ADDRESS
DISP_T ;10TH DIGIT ADDRESS
DISP_H ;100TH DIGIT ADDRESS
SEG7_HA ;7 SEGLED TABLE HEAD ADR
SEG70 ;PATTERN 0 SET ADR
SEG71 ;PATTERN 1 SET ADR
SEG72 ;PATTERN 2 SET ADR
SEG73 ;PATTERN 3 SET ADR
SEG74 ;PATTERN 4 SET ADR
SEG75 ;PATTERN 5 SET ADR
SEG76 ;PATTERN 6 SET ADR
SEG77 ;PATTERN 7 SET ADR
SEG78 ;PATTERN 8 SET ADR
SEG79 ;PATTERN 9 SET ADR
SEG7A ;PATTERN A SET ADR
SEG7B ;PATTERN B SET ADR
ENDC
RA1 EQU H'01' ;RA1 PORT DESIGNATION
RA2 EQU H'02' ;RA2 PORT DESIGNATION
RA3 EQU H'03' ;RA3 PORT DESIGNATION
RA5 EQU H'05' ;RA5 PORT DESIGNATION
CCP1 EQU H'02' ;CCP1(RC2) DESIGNATION
SEG7_0 EQU B'01000000' ;-GFEDCBA PATTERN 0
SEG7_1 EQU B'01111001' ; PATTERN 1
SEG7_2 EQU B'00100100' ; PATTERN 2
SEG7_3 EQU B'00110000' ; PATTERN 3
SEG7_4 EQU B'00011001' ; PATTERN 4
SEG7_5 EQU B'00010010' ; PATTERN 5
SEG7_6 EQU B'00000010' ; PATTERN 6
SEG7_7 EQU B'01111000' ; PATTERN 7
SEG7_8 EQU B'00000000' ; PATTERN 8
SEG7_9 EQU B'00010000' ; PATTERN 9
SEG7_A EQU B'01111111' ; DETECT ERROR
SEG7_B EQU B'00100011' ; ILLEGAL INT
;**************** PROGRAM START ***********************
ORG 0 ;RESET VECTOR
GOTO INIT
ORG 4 ;INTERRUPT VECTOR
GOTO INT
;**************** INITIAL PROCESS *********************
INIT
;*** PORT INITIALIZATION
BSF STATUS,RP0 ;CHANGE TO BANK1
MOVLW B'00000001' ;AN0 TO INPUT MODE
MOVWF TRISA ;SET TRISA REGISTER
CLRF TRISB ;RB PORT TO OUTPUT MODE
MOVLW B'00000100' ;RC2/CCP1 TO INPUT MODE
MOVWF TRISC ;SET TRISC REGISTER
;*** ULTRASONIC SENDING PERIOD INITIALIZATION (TIMER0)
MOVLW B'11010111' ;T0CS=0,PSA=0,PS=1:256
MOVWF OPTION_REG ;SET OPTION_REG REGISTER
BCF STATUS,RP0 ;CHANGE TO BANK0
CLRF TMR0 ;CLEAR TMR0 REGISTER
;*** CAPTURE MODE INITIALIZATION (TIMER1)
MOVLW B'00000001' ;PRE=1:1 TMR1=INT TMR1=ON
MOVWF T1CON ;SET T1CON REGISTER
CLRF CCP1CON ;CCP1 OFF
;*** A/D CONVERTER INITIALIZATION
MOVLW B'01000001' ;ADCS=01 CHS=AN0 ADON=ON
MOVWF ADCON0 ;SET ADCON0 REGISTER
BSF STATUS,RP0 ;CHANGE TO BANK1
MOVLW B'00001110' ;ADFM=0 PCFG=1110
MOVWF ADCON1 ;SET ADCON1 REGISTER
BCF STATUS,RP0 ;CHANGE TO BANK0
;*** DISPLAY INITIALIZATION (TIMER2)
MOVLW DISP_U ;SET DIGIT HEAD ADDRESS
MOVWF DISP_HA ;SAVE DIGIT HEAD SDDRESS
MOVLW H'0A' ;"DETECT ERROR" DATA
MOVWF DISP_U ;SET 1ST DIGIT
MOVWF DISP_T ;SET 10TH DIGIT
MOVWF DISP_H ;SET 100TH DIGIT
MOVLW D'3' ;DIGIT COUNTER
MOVWF DIGIT_CNT ;SET DIGIT COUNTER
MOVLW SEG70 ;SET 7SEG HEAD ADDRESS
MOVWF SEG7_HA ;SAVE 7SEG HEAD ADDRESS
MOVLW SEG7_0 ;SET 7SEGMENT PATTERN 0
MOVWF SEG70 ;SAVE PATTERN 0
MOVLW SEG7_1 ;SET 7SEGMENT PATTERN 1
MOVWF SEG71 ;SAVE PATTERN 1
MOVLW SEG7_2 ;SET 7SEGMENT PATTERN 2
MOVWF SEG72 ;SAVE PATTERN 2
MOVLW SEG7_3 ;SET 7SEGMENT PATTERN 3
MOVWF SEG73 ;SAVE PATTERN 3
MOVLW SEG7_4 ;SET 7SEGMENT PATTERN 4
MOVWF SEG74 ;SAVE PATTERN 4
MOVLW SEG7_5 ;SET 7SEGMENT PATTERN 5
MOVWF SEG75 ;SAVE PATTERN 5
MOVLW SEG7_6 ;SET 7SEGMENT PATTERN 6
MOVWF SEG76 ;SAVE PATTERN 6
MOVLW SEG7_7 ;SET 7SEGMENT PATTERN 7
MOVWF SEG77 ;SAVE PATTERN 7
MOVLW SEG7_8 ;SET 7SEGMENT PATTERN 8
MOVWF SEG78 ;SAVE PATTERN 8
MOVLW SEG7_9 ;SET 7SEGMENT PATTERN 9
MOVWF SEG79 ;SAVE PATTERN 9
MOVLW SEG7_A ;SET 7SEGMENT PATTERN A
MOVWF SEG7A ;SAVE PATTERN A
MOVLW SEG7_B ;SET 7SEGMENT PATTERN B
MOVWF SEG7B ;SAVE PATTERN B
MOVLW B'00011110' ;OPS=1:4,T2=ON,EPS=1:16
MOVWF T2CON ;SET T2CON REGISTER
BSF STATUS,RP0 ;CHANGE TO BANK1
MOVLW D'157' ;157X64=10048USEC
MOVWF PR2 ;SET PR2 REGISTER
BSF PIE1,TMR2IE ;TMR2IE=ON
BCF STATUS,RP0 ;CHANGE TO BANK0
;*** INTERRUPTION CONTROL
MOVLW B'11100000' ;GIE=ON,PEIE=ON,T0IE=ON
MOVWF INTCON ;SET INTCON REGISTER
WAIT
GOTO $ ;INTERRUPTION WAIT
;*************** INTERRUPTION PROCESS *****************
INT
MOVFW PIR1 ;READ PIR1 REGISTER
BTFSC PIR1,CCP1IF ;CAPTURE OCCURRED ?
GOTO CAPTURE ;YES. "CAPTURE"
BTFSC PIR1,TMR2IF ;TMR2 TIME OUT ?
GOTO LED_CONT ;YES. "LED DISPLAY"
MOVFW INTCON ;READ INTCON REGISTER
BTFSC INTCON,T0IF ;TMR0 TIME OUT ?
GOTO SEND ;YES. "PULSE SEND"
;*************** ILLEGAL INTERRUPTION *****************
ILLEGAL
MOVLW H'0B' ;SET ILLEGAL DISP DIGIT
ADDWF SEG7_HA,W ;SEG7 H.ADR + DIGIT
MOVWF FSR ;SET FSR REGISTER
MOVFW INDF ;READ SEG7 DATA
MOVWF PORTB ;WRITE LED DATA
BCF PORTA,RA1 ;RA1=ON
BCF PORTA,RA2 ;RA2=ON
BCF PORTA,RA3 ;RA3=ON
GOTO $ ;STOP
;************ END OF INTERRUPTION PROCESS **************
INT_END
RETFIE
;*************** PULSE SEND-OUT PROCESS ****************
SEND
BCF INTCON,T0IF ;CLEAR TMR0 INT FLAG
CLRF TMR0 ;TIMER0 CLEAR
;*** RECEIVED PULSE DETECTION CHECK
MOVFW PORTC ;READ PORTC REGISTER
BTFSC PORTC,CCP1 ;DETECTED ?
GOTO DETECT_OFF ;YES. DETECTED
MOVLW H'0A' ;"DETECT ERROR" DATA
MOVWF DISP_U ;SET 1ST DIGIT
MOVWF DISP_T ;SET 10TH DIGIT
MOVWF DISP_H ;SET 100TH DIGIT
;*** RECEIVE PULSE DETECTOR OFF
DETECT_OFF
BCF PORTA,RA5 ;SET DETECTOR OFF
;*** CAPTURE START
CLRF TMR1H ;CLEAR TMR1H REGISTER
CLRF TMR1L ;CLEAR TMR1L REGISTER
CLRF CCPR1H ;CLEAR CCPR1H REGISTER
CLRF CCPR1L ;CLEAR CCPR1L REGISTER
MOVLW B'00000101' ;CCP1M=0101(CAPTURE)
MOVWF CCP1CON ;SET CCP1CON REGISTER
BSF STATUS,RP0 ;CHANGE TO BANK1
BSF PIE1,CCP1IE ;CCP1 INTERRUPTIN ENABLE
BCF STATUS,RP0 ;CHANGE TO BANK0
BCF PIR1,CCP1IF ;CLEAR CCP1 INT FLAG
;*** 40KHZ PULSE SEND ( 0.5 MSEC )
MOVLW D'20' ;SEND-OUT PULSE COUNT
MOVWF S_COUNT ;SET COUNT
S_LOOP
CALL PULSE ;CALL PULSE SEND SUB
DECFSZ S_COUNT,F ;END ?
GOTO S_LOOP ;NO. CONTINUE
;*** GET ADJUSTMENT DATA
BSF ADCON0,GO ;START A/D CONVERT
AD_CHECK
BTFSC ADCON0,GO ;A/D CONVERT END ?
GOTO AD_CHECK ;NO. AGAIN
MOVFW ADRESH ;READ ADRESH REGISTER
MOVWF S_ADJ ;SAVE CONVERTED DATA
MOVLW D'5' ;SET ROTATE VALUE
MOVWF S_ADJ_COUNT ;SAVE ROTATE VALUE
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -