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

📄 lcfmet737.asm

📁 FCL 元件数字测试仪
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;CAPMET737.ASM 21AUG03 - COPYRIGHT JOHN BECKER - EPE IND/CAP/FREQ METER

;PIC16F628, 3.2768MHz, WDT OFF, POR ON, XTAL XS

;Config register bits
; CP1 CP0 CP1 CP0 NIL CPD LVP BOR MCL OS2 POR WDT OS1 OS0
;  1   1   1   1   1   1   0   0   1   0   0   0   0   1
;N.B. Logic 1/0 do NOT necessarily mean that the function is On/Off
;respectively - refer to PIC '627/8 data sheet

#DEFINE BANK0 BCF $03,5
#DEFINE BANK1 BSF $03,5

        List P = PIC16F628, R=DEC; 
        __CONFIG   h'3F21'

        include P16F628.inc

        CBLOCK
REGA0				;lsb
REGA1
REGA2
REGA3				;msb

REGB0				;lsb
REGB1
REGB2
REGB3				;msb

REGC0				;lsb
REGC1
REGC2
REGC3				;msb

DSIGN				;Digit Sign. 0=positive,FF(or non zero)=negative
DIGIT1				;MSD
DIGIT2
DIGIT3
DIGIT4
DIGIT5				;Decimal digits
DIGIT6
DIGIT7
DIGIT8
DIGIT9
DIGIT10				;LSD
MTEMP
MCOUNT
DCOUNT

LOOP
LOOPA
RSLINE
STORE
SLOWIT
POINT
TIMEMSB
OVERFLOW
STORE2
LARGE
NANO
CAPREF3
CAPREF2
CAPREF1
CAPREF0
INDREF3
INDREF2
INDREF1
INDREF0
TIMEOUT
SWITCH
ZERO
INDCORRECT
CAPCORRECT
CORRECTLOC
        ENDC

PROMVAL  EQU $70   ; accessed via both BANKS

               ; locations up to $7F are available

; **************

        .ORG 0
        goto GIEOFF
        .ORG 4          ; Interrupt vector address
        goto GIEOFF
        .ORG 5          ; Start of program memory

GIEOFF: BCF INTCON,GIE  ; turn off global interrupts
        BTFSC INTCON,GIE
        goto GIEOFF
        goto START

TABLCD: addwf PCL,F     ;LCD initialisation table
        retlw %00110011 ;initialise lcd - first byte
        retlw %00110011 ;2nd byte (repeat of first)
        retlw %00110010 ;set for 4-bit operation
        retlw %00101100 ;set for 2 lines
        retlw %00000110 ;set entry mode to increment each address
        retlw %00001100 ;set display on, cursor off, blink off
        retlw %00000001 ;clear display
        retlw %00000010 ;return home, cursor & RAM to zero
                        ;end inititalisation table

TITLE:  addwf PCL,F
        retlw ' '
        retlw 'E'
        retlw 'P'
        retlw 'E'
        retlw ' '
        retlw 'L'
        retlw 'C'
        retlw 'F'
        retlw ' '
        retlw 'M'
        retlw 'E'
        retlw 'T'
        retlw 'E'
        retlw 'R'
        retlw ' '
        retlw ' '
        retlw ' '

TITLEB: addwf PCL,F
        retlw ' '
        retlw 'W'
        retlw 'A'
        retlw 'I'
        retlw 'T'
        retlw 'I'
        retlw 'N'
        retlw 'G'
        retlw ' '
        retlw 'T'
        retlw 'I'
        retlw 'M'
        retlw 'I'
        retlw 'N'
        retlw 'G'
        retlw ' '


OVERFLOWED:  addwf PCL,F
        retlw 'O'
        retlw 'V'
        retlw 'E'
        retlw 'R'
        retlw 'F'
        retlw 'L'
        retlw 'O'
        retlw 'W'

CALIB:  addwf PCL,F
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '
        retlw 'N'
        retlw 'U'
        retlw 'L'
        retlw 'L'
        retlw 'E'
        retlw 'D'
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '

TIMEDOUT: addwf PCL,F
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '
        retlw 'T'
        retlw 'I'
        retlw 'M'
        retlw 'E'
        retlw ' '
        retlw 'O'
        retlw 'U'
        retlw 'T'
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '

CAPTIME: addwf PCL,F
        retlw ' '
        retlw ' '
        retlw ' '
        retlw 'C'
        retlw 'A'
        retlw 'P'
        retlw 'A'
        retlw 'C'
        retlw 'I'
        retlw 'T'
        retlw 'O'
        retlw 'R'
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '

INDTIME: addwf PCL,F
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '
        retlw 'I'
        retlw 'N'
        retlw 'D'
        retlw 'U'
        retlw 'C'
        retlw 'T'
        retlw 'O'
        retlw 'R'
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '


CORRECTMSG: addwf PCL,F
        retlw ' '
        retlw 'C'
        retlw 'O'
        retlw 'R'
        retlw 'R'
        retlw 'E'
        retlw 'C'
        retlw 'T'
        retlw 'I'
        retlw 'O'
        retlw 'N'
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '
        retlw ' '


;*******************

START:  clrf PORTA
        clrf PORTB
        movlw $07
        movwf CMCON

        BANK1
        movlw %11000000
        movwf TRISB
        movlw %00011100     ; RA0,RA1 as output
        movwf TRISA
        movlw %10000110     ; timer 1:128, pull-ups off
        movwf OPTION_REG
        BANK0

        clrf INTCON
        call PAUSIT
        call LCDSET
        call PAUSIT

        movlw %00000000     ; T1 ext osc disable (bit3=0), T1 stopped (bit0=0), internal clock (bit1=0), bit2 dont care
        movwf T1CON

        btfsc PORTA,2       ; is S3 (RA2) pressed?
        goto CORRECTIT

        call LCD1
        bsf RSLINE,4

        clrf LOOP
TITLE2: movf LOOP,W
        call TITLE
        call LCDOUT
        incf LOOP,F
        btfss LOOP,4
        goto TITLE2

        clrf INTCON
        clrf POINT
        clrf CAPREF3
        clrf CAPREF2
        clrf CAPREF1
        clrf CAPREF0
        clrf INDREF3
        clrf INDREF2
        clrf INDREF1
        clrf INDREF0

        movlw 0
        call PRMGET
        movwf INDCORRECT
        movlw 1
        call PRMGET
        movwf CAPCORRECT

        call PAUSIT         ; delay
        call PAUSIT         ; delay

        clrf INTCON
        movlw 255
        movwf SWITCH

;****************** START OF MAIN

MAIN:   clrf TIMEOUT
        movf PORTA,W
        andlw %00010000
        xorwf SWITCH,W
        btfsc STATUS,Z
        goto MAIN2

        movf PORTA,W
        andlw %00010000
        movwf SWITCH

        call LCD21
        bsf RSLINE,4
        clrf LOOP
TITLE3: movf LOOP,W
        call TITLEB
        call LCDOUT
        incf LOOP,F
        btfss LOOP,4
        goto TITLE3

        call LCD1
        bsf RSLINE,4
        clrf LOOP
        btfsc PORTA,4
        goto TIMOUT4

MAIN3:  movf LOOP,W
        call CAPTIME
        call LCDOUT
        incf LOOP,F
        btfss LOOP,4
        goto MAIN3
        goto MAIN2

MAIN4:  movf LOOP,W
        call INDTIME
        call LCDOUT
        incf LOOP,F
        btfss LOOP,4
        goto TIMOUT4
        goto MAIN4

MAIN2:  btfsc SWITCH,4
        goto INDUCT
        goto CAPACITOR

; *****************

; QBASIC ROUTINE ILLUSTRATING INDUCTANCE FORMULA

;CLS
;DEFDBL A-Z
;PRINT "Formula:  L = ((1000000000 / (2 * PI * F) ^ 2)) / C"
;PRINT

;PI = 22 / 7
;F = 389305: PRINT "Frequency = "; F
;C = 200: C = (C * C) / (C + C): PRINT "Capacitance = "; C

;Process:
;L = F * 44: PRINT L
;L = INT(L / 7): PRINT L
;L = INT(1000000000 / L): PRINT L
;L = L * L: PRINT L
;L = INT(L / 10):
;L = L / 1000
;PRINT "Inductance = "; L; "uH"

; **************

INDUCT: movlw %00000001     ; set for correct osc
        movwf PORTA

        call INDTIMER       ; get osc frequency
        call COPY_TIME_REGA

        clrf POINT
        clrf LARGE

        movf TMR1H,W
        andlw %11000000
        iorwf TIMEMSB,W     ; is timing value less than 16384?
        btfsc STATUS,Z
        call LARGEVALUE     ; yes
        btfsc TIMEOUT,0
        goto TIMEEND

        call LCD1           ; set address
        bsf RSLINE,4        ; set RS for data send
        call BIN2DEC
        call SHOWITALL
        movlw 'H'
        call LCDOUT
        movlw 'z'
        call LCDOUT
        movlw ' '
        call LCDOUT
        movlw ' '
        call LCDOUT

        call COPY_TIME_REGA

        movlw 44            ; multiply freq x 44 (22 x 2) (2 x PI = 44/7)
        call MULTIPLYSMALL  ; REGA * 44 -> REGA        

        movlw 7             ; divide by 7
        call DIVIDESMALL    ; REGA / 7 -> REGA

        call COPY_REGA_REGB ; copy answer into REGB
        call DIVIDEBILLION  ; 1,000,000,000 / REGB -> REGA

        call COPY_REGA_REGB ; copy answer into REGB
        call MULTIPLY       ; REGA * REGB -> REGA (squaring REGA)
        movf STATUS,W
        andlw 1
        movwf OVERFLOW

        movlw '2'
        movf OVERFLOW,F
        btfss STATUS,Z
        goto SHOWOVERFLOW

        movlw 10            ; divide by 10
        call DIVIDESMALL    ; REGA / 100 -> REGA
        movf STATUS,W
        andlw 1
        movwf OVERFLOW

        movlw 'C'
        movf OVERFLOW,F
        btfss STATUS,Z
        goto SHOWOVERFLOW

        movf INDCORRECT,W   ; multiply by correction factor
        call MULTIPLYSMALL  ; REGA * REGB -> REGA
        movf STATUS,W
        andlw 1
        movwf OVERFLOW

        movlw 'A'
        movf OVERFLOW,F
        btfss STATUS,Z
        goto SHOWOVERFLOW

        movlw 100           ; divide by 100
        call DIVIDESMALL    ; REGA / 100 -> REGA
        movf STATUS,W
        andlw 1
        movwf OVERFLOW

        movlw 'B'
        movf OVERFLOW,F
        btfss STATUS,Z
        goto SHOWOVERFLOW

        btfsc PORTA,2       ; is S3 (RA2) pressed?
        call CALIBIND

        movf LARGE,F
        btfsc STATUS,Z
        call SUBTRACTINDREF

        movlw 4
        movwf POINT

        call LCD21          ; set address
        bsf RSLINE,4        ; set RS for data send

        call BIN2DEC        ; converts binary in REGA to decimal in DIGIT

        movf LARGE,F
        btfsc STATUS,Z
        call CHECKMILLI

        call SHOWITALL

        movf LARGE,F
        btfss STATUS,Z
        goto IND2

        movlw 'u'
        movf NANO,F
        btfss STATUS,Z
        movlw 'm'
        call LCDOUT
IND2:   movlw 'H'
        call LCDOUT
        movlw ' '
        call LCDOUT
        movlw ' '
        call LCDOUT
        movlw ' '
        call LCDOUT
        movlw ' '
        call LCDOUT

        goto MAIN

; ***************

CAPACITOR: movlw %00000010  ; set for correct osc
        movwf PORTA

        clrf TIMEMSB
        call INDTIMER

        call COPY_TIME_REGA

        clrf POINT
        clrf LARGE

        movf TMR1H,W
        andlw %11111110
        iorwf TIMEMSB,W     ; is timing value less than 512?
        btfsc STATUS,Z
        call LARGEVALUE     ; yes

        btfsc ZERO,0
        goto TIMEEND

        call LCD1           ; set address
        bsf RSLINE,4        ; set RS for data send
        call BIN2DEC
        call SHOWITALL
        movlw 'H'
        call LCDOUT
        movlw 'z'
        call LCDOUT
        movlw ' '
        call LCDOUT
        movlw ' '
        call LCDOUT

        call COPY_TIME_REGA

        movlw 22             ; multiply freq x PI (R = 1k) (ignoring 3 zeros)
        call MULTIPLYSMALL
        movlw 7
        call DIVIDESMALL

        call COPY_REGA_REGB ; copy answer into REGB
        call DIVIDEBILLION  ; REGA / REGB -> REGA

        movf CAPCORRECT,W   ; multiply by correction factor
        call MULTIPLYSMALL  ; REGA / REGB -> REGA
        movlw 100           ; divide by 100
        call DIVIDESMALL    ; REGA / 100 -> REGA

        btfsc PORTA,2       ; is S3 (RA2) pressed?
        call CALIBCAP

        movf LARGE,F
        btfsc STATUS,Z
        call SUBTRACTCAPREF

        call LCD21          ; set address

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -