共通の宣言部
;===============================================================
; Declare Register
;===============================================================
WADCH_ EQU 0x30 ;A/D convertion channel No.
WADR0H EQU 0x31 ;ch0H
WADR0L EQU 0x32 ; 0L
WADR1H EQU 0x33 ; 1H
WADR1L EQU 0x34 ; 1L
WADAVC EQU 0x35 ;averege count
WADS0H EQU 0x36 ;ch0H
WADS0L EQU 0x37 ;ch0H
WADS1H EQU 0x38 ;ch1H
WADS1L EQU 0x39 ;ch1L
W_TH_H EQU 0x3A ;Threshold compare level Hi
W_TH_L EQU 0x3B ;Threshold compare level Lo
;
W_BINL EQU 0x58 ;work for B2-BCD, BCD-2B conv.
W_BINH EQU 0x59 ;
W_DS21 EQU 0x5A ;Data digit 2&1
W_DS43 EQU 0x5B ;D 4&3
W_DSX5 EQU 0x5C ;D x&5
W_BITC EQU 0x5D ;work for 2B-4BCD
W_BFDT EQU 0x5E ;work for 2B-4BCD
;
W_TMPL EQU 0x60 ;work for BCD-2B
W_TMPH EQU 0x61 ;
;
W_CHR1 EQU 0x6B ;Hexadecimal to Char conv.(BCDCHR)
W_CHR2 EQU 0x6C ;
W_CHR3 EQU 0x6D ;
W_CHR4 EQU 0x6E ;
W_CHR5 EQU 0x6F ;
;
BIT_CT EQU 0x77 ;Bit Counter
AL EQU 0x78 ;AL software accumulater
AH EQU 0x79 ;AH
BL EQU 0x7A ;BL
BH EQU 0x7B ;BH
CL EQU 0x7C ;CL
CH EQU 0x7D ;CH
DL EQU 0x7E ;DL
DH EQU 0x7F ;DH
;---------------------------------------------------------------
(1)16bit加減算
;===============================================================
; D_ADD:Double Pecision Addition
;---------------------------------------------------------------
; CALL D_ADD ;CHCL+AHAL-->CHCL
;* CALL D_ADD ;DHDLCHCL+AHAL-->DHDLCHCL
;===============================================================
D_ADD MOVF AL,W
ADDWF CL,F
BTFSC STATUS,C
INCF CH,F
MOVF AH,W ;Z check
ADDWF CH,F
;* BTFSC STATUS,C
;* INCF DL,F
;* MOVF DL,W
;* BTFSC STATUS,Z
;* INCF DH,F
RETURN
;
;===============================================================
; D_SUB:Double Pecision Subtraction
;---------------------------------------------------------------
; CALL D_SUB ;BHBL-AHAL-->BHBL
;===============================================================
D_SUB MOVF AL,W
SUBWF BL,F
BTFSS STATUS,C
DECF BH,F
MOVF AH,W
SUBWF BH,F
RETURN
;---------------------------------------------------------------
(2)16bit乗算
オリジナルはマイクロチップのサンプルです(多少モディファイしました)
;===============================================================
; D_MLT:Double Pecision Multiply
;---------------------------------------------------------------
; CALL D_MLT ;BHBL*AHAL-->DHDLCHCL (BH,BL:壊れる)
;===============================================================
D_MLT CLRF CL
CLRF CH
CLRF DL
CLRF DH
MOVLW 16 ;Data count
MOVWF BIT_CT ; BH BL:壊れる
; ; AH AL:変化無
BCF STATUS,C ;DH DL CH CL
;
DMLTL1 RRF BH,F
RRF BL,F
BTFSS STATUS,C
GOTO DMLTL2
;
MOVF AL,W
ADDWF DL,F
BTFSC STATUS,C
INCF DH,F
MOVF AH,W
ADDWF DH,F
;
DMLTL2 RRF DH,F
RRF DL,F
RRF CH,F
RRF CL,F
DECFSZ BIT_CT,F
GOTO DMLTL1
RETURN
;---------------------------------------------------------------
(3)Bin-BCD変換
;===============================================================
; B2_BCD:Binary to Decimal conversion
;===============================================================
; W_BINH:W_BINL --> W_DSX5:W_DS43:W_DS21, counter:W_BITC, temp:W_BFDT
;---------------------------------------------------------------
B2_BCD BCF STATUS,C
MOVLW .16
MOVWF W_BITC
CLRF W_DSX5
CLRF W_DS43
CLRF W_DS21
B2_BC1 RLF W_BINL,F
RLF W_BINH,F
RLF W_DS21,F
RLF W_DS43,F
RLF W_DSX5,F
DECFSZ W_BITC,F
GOTO ADJDEC
;
RETURN ;Return B2_BCD
;
ADJDEC MOVLW W_DS21
MOVWF FSR
CALL ADJBCD
MOVLW W_DS43
MOVWF FSR
CALL ADJBCD
MOVLW W_DSX5
MOVWF FSR
CALL ADJBCD
GOTO B2_BC1
;---------------------------------------------------------------
; ADJBCD:Adjust BCD
;---------------------------------------------------------------
ADJBCD MOVLW 3 ;Adjust BCD
ADDWF INDF,W
MOVWF W_BFDT ;Save temp work
BTFSC W_BFDT,3 ;test if result > 7
MOVWF INDF
MOVLW 0x30
ADDWF INDF,W
MOVWF W_BFDT ;Save temp work
BTFSC W_BFDT,7 ;test if result > 7
MOVWF INDF
RETURN
;---------------------------------------------------------------
(4)BCD-CHR変換
;===============================================================
; BCDCHR:Hexadecimal to Character conversion
;---------------------------------------------------------------
; W_DSX5:W_DS43:W_DS21 --> W_CHR5:W_CHR4:W_CHR3:W_CHR2:W_CHR1
;===============================================================
BCCH5V MOVLW ' '
MOVWF W_CHR5
;
MOVF W_DSX5,W
CALL BCCONV
MOVWF W_CHR4
;
MOVLW '.'
MOVWF W_CHR3
SWAPF W_DS43,W
CALL BCCONV
MOVWF W_CHR2
MOVF W_DS43,W
CALL BCCONV
MOVWF W_CHR1
RETURN
;
BCDCHR MOVF W_DS21,W
CALL BCCONV
MOVWF W_CHR1
SWAPF W_DS21,W
CALL BCCONV
MOVWF W_CHR2
;
MOVF W_DS43,W
CALL BCCONV
MOVWF W_CHR3
SWAPF W_DS43,W
CALL BCCONV
MOVWF W_CHR4
;
MOVF W_DSX5,W
CALL BCCONV
MOVWF W_CHR5
RETURN
;
BC_LCD CALL BCCONV
GOTO LCD_DT
;
BCCONV ANDLW 0x0F
IORLW 0x30
RETURN
; ;Zero suppress
Z_SUPR MOVF W_CHR5,W
SUBLW 0x30
BTFSS STATUS,Z
RETURN
MOVLW 0x20
MOVWF W_CHR5
MOVF W_CHR4,W
SUBLW 0x30
BTFSS STATUS,Z
RETURN
MOVLW 0x20
MOVWF W_CHR4
MOVF W_CHR3,W
SUBLW 0x30
BTFSS STATUS,Z
RETURN
MOVLW 0x20
MOVWF W_CHR3
MOVF W_CHR2,W
SUBLW 0x30
BTFSS STATUS,Z
RETURN
MOVLW 0x20
MOVWF W_CHR2
RETURN
;
XFRLCD MOVF W_CHR5,W
CALL LCD_DT
MOVF W_CHR4,W
CALL LCD_DT
MOVF W_CHR3,W
CALL LCD_DT
MOVF W_CHR2,W
CALL LCD_DT
MOVF W_CHR1,W
CALL LCD_DT
RETURN
;---------------------------------------------------------------
(5)BCD-Bin変換
;===============================================================
; BCD_B2:Hexadecimal to Binary conversion
;---------------------------------------------------------------
; W_DSX5:W_DS43:W_DS21 --> W_BINH:W_BINL, temp:W_TMPH,W_TMPL
;===============================================================
BCD_B2 CLRF W_BINH
MOVF W_DSX5,W
ANDLW 0x0F
MOVWF W_BINL
CALL MPY10A ;10a+b
;
SWAPF W_DS43,W
CALL MPY10B ;10(10a)+b)
;
MOVF W_DS43,W
CALL MPY10B ;10(10(10a)+b)+c)
;
SWAPF W_DS21,W
CALL MPY10B ;10(10(10(10a)+b)+c)+d)
;
MOVF W_DS21,W
ANDLW 0x0F
ADDWF W_BINL,F
BTFSC STATUS,C
INCF W_BINH,F ;10(10(10(10a)+b)+c)+d)+e
RETURN
;
;---------------------------------------------------------------
; MULTIPLY BY 10
;---------------------------------------------------------------
MPY10B ANDLW 0x0F
ADDWF W_BINL,F
BTFSC STATUS,C
INCF W_BINH,F
;
MPY10A BCF STATUS,C ; *2
RLF W_BINL,W
MOVWF W_TMPL
RLF W_BINH,W
MOVWF W_TMPH
;
BCF STATUS,C ; *2
RLF W_BINL,F
RLF W_BINH,F
BCF STATUS,C ; *4
RLF W_BINL,F
RLF W_BINH,F
BCF STATUS,C ; *8
RLF W_BINL,F
RLF W_BINH,F
;
MOVF W_TMPL,W ;N*10 = N*8 + N*2
ADDWF W_BINL,F
BTFSC STATUS,C
INCF W_BINH,F
MOVF W_TMPH,W
ADDWF W_BINH,F
RETURN
;---------------------------------------------------------------
(6)A/D変換値から電圧への換算
;---------------------------------------------------------------
;A/D値: WADS1H:WADS1L ;(BH:000000xx, BL:xxxxxxxx)
; *12513 ;(AH:00110000, AL:11100001)
; CALL D_MLT ;BHBL*AHAL-->DHDLCHCL (BH,BL:壊れる)
; /256 ;DH[DLCH]CL
; 1023 * 12513 / 256 = 50003
;表示: [ ][5][.][0][0]
;---------------------------------------------------------------
;---------------------------------------------------------------
MOVF WADS1H,W
MOVWF W_BINH
MOVF WADS1L,W
MOVWF W_BINL
CALL B2_BCD ;W_BINH:.L --> W_DSX5:.43:.21
CALL BCDCHR ;W_DSX5:.43:.21 --> W_CHR5:.1
CALL Z_SUPR
CALL XFRLCD ;A/D値表示
CALL LCD_SP
;
MOVF WADS1H,W
MOVWF BH
MOVF WADS1L,W
MOVWF BL
CALL D_MLT
;
MOVF DL,W ; / 256 DH [DLCH] CL
MOVWF W_BINH
MOVF CH,W
MOVWF W_BINL
CALL B2_BCD ;W_BINH:.L --> W_DSX5:.43:.21
;*** CALL BCDCHR ;W_DSX5:.43:.21 --> W_CHR5:.1
;*** A/D値[00000011][11111111] → [5][0][0][0][3]
;
CALL BCCH5V ;小数点セット [ ][5][.][0][0]
;*** CALL Z_SUPR ;前ゼロ消去
;*** CALL XFRLCD ;電圧値表示(LCD)
;
;===============================================================
; BCDCHR:Hexadecimal to Character conversion
;---------------------------------------------------------------
; W_DSX5:W_DS43:W_DS21 --> W_CHR5:W_CHR4:W_CHR3:W_CHR2:W_CHR1
; ;小数点セット [ ][5][.][0][0]
;===============================================================
BCCH5V MOVLW ' '
MOVWF W_CHR5
;
MOVF W_DSX5,W
CALL BCCONV
MOVWF W_CHR4
;
MOVLW '.'
MOVWF W_CHR3
SWAPF W_DS43,W
CALL BCCONV
MOVWF W_CHR2
MOVF W_DS43,W
CALL BCCONV
MOVWF W_CHR1
RETURN
;---------------------------------------------------------------