📄 lcfmet737.asm
字号:
;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 + -