📄 diagnose_whl.asm
字号:
GOTO FTOW3 ;重新判断EXPB=15?
;***浮点数除法子程序,入口地址(ACCB、EXPB)/(ACCA、EXPA),出口地址ACCB、EXPB***
FDIV CALL S_SIGN ;确定商的符号,并将负数取补
CLRF ACCCHI ;初始化ACCC寄存器
CLRF ACCCLO
CALL F_norm ;规格化ACCB
CLRF ACCCLO
CLRF ACCCHI
CLRF TIMES
MOVF ACCAHI,W ;除数为零?
BTFSS STATUS,Z
GOTO FD0 ;否,求商
MOVF ACCALO,W
BTFSC STATUS,Z
RETLW 01 ;是,返回
FD0 CALL NEG_A ;除数取补
FD1 MOVF ACCBHI,0 ;ACCBHI送ACCDLO
MOVWF ACCDLO
CALL D_add1 ;被除数尾数大于除数尾数?
BTFSS STATUS,C
GOTO FD2
RRF1 BCF STATUS,C ;是,被除数右移规格化,直到小于除数为止
RRF ACCBHI,F
RRF ACCBLO,F
INCF TIMES,F
RRF ACCCHI,F
BCF STATUS,C
GOTO FD1
FD2
CALL DDIV ;否,调用双字节除法子程序,求商的尾数
MOVF TIMES,0 ;根据右移规格化次数调整ACCB阶码
ADDWF EXPB,F
MOVF EXPA,0 ;求商的阶码
SUBWF EXPB,F
CALL F_norm ;商规格化
BTFSC SIGN,7 ;商为负?
CALL NEG_B ;是,取补
CALL NEG_A ;除数还原
RETURN ;浮点数除法完成,返回
;***********双字节纯小数除法子程序***************
DDIV MOVLW 0X0F ;初始化ACCDHI
MOVWF ACCDHI
DV1 BCF STATUS,C
RLF ACCCLO,F ;左移商
RLF ACCCHI,F
RLF ACCBLO,F ;左移余数
RLF ACCBHI,F
MOVF STATUS,0 ;暂存STATUS寄存器
MOVWF ACCDLO
MOVF ACCBHI,0 ;ACCBHI送TEMP1
MOVWF TEMP1
MOVF ACCALO,0 ;ACCB-ACCA
ADDWF ACCBLO,0
MOVWF TEMP
BTFSC STATUS,C
INCF TEMP1,F
MOVF ACCAHI,0
ADDWF TEMP1,0
BTFSC ACCDLO,0 ;左移余数时移出来的数为1?
GOTO DV2
TESTC BTFSS STATUS,C ;是,再判断ACCB尾数是否大于ACCA
GOTO DV3
DV2
MOVWF ACCBHI ;是,余数送ACCB
MOVF TEMP,0
MOVWF ACCBLO
INCF ACCCLO ,F ;商加1
DV3 DECFSZ ACCDHI,F ;商求取完毕?
GOTO DV1
MOVF ACCCHI,0 ;是,将商送ACCB
MOVWF ACCBHI
MOVF ACCCLO,0
MOVWF ACCBLO
RETLW 00
;************************************************
DtoF
CLRF SIGN
BTFSS ACCBHI,7
GOTO INTF1
BSF SIGN,7
CALL NEG_B
INTF1
MOVLW .15 ;初始化EXPB
MOVWF EXPB
CLRF ACCCHI
CLRF ACCCLO
CALL F_norm ;对ACCB进行规格化
BTFSS SIGN,7
GOTO DtoF1
CALL NEG_B
DtoF1 RETURN
;*************浮点数运算结果规格化子程序*****************
F_norm
MOVF ACCBHI,W
BTFSS STATUS,Z
GOTO C_norm
MOVF ACCBLO,W
BTFSC STATUS,Z
RETLW 0
C_norm
BTFSC ACCBHI,7
GOTO C_norm2
C_norm1
BTFSC ACCBHI,6
RETLW 0
CALL SHFTSL
DECF EXPB,F
GOTO C_norm1
C_norm2
BTFSS ACCBHI,6
RETLW 0
BCF STATUS,C
CALL SHFTSL
BSF ACCBHI,7
DECF EXPB,F
GOTO C_norm2
SHFTSL
BCF STATUS,C
RLF ACCCLO,F
RLF ACCCHI,F
RLF ACCBLO,F
RLF ACCBHI,F
RETLW 0
;******************************************************
SETUP
MOVLW .15
MOVWF TEMP
MOVF ACCBHI,W
MOVWF ACCDHI
MOVF ACCBLO,W
MOVWF ACCDLO
CLRF ACCBHI
CLRF ACCBLO
RETURN
S_SIGN
MOVF ACCAHI,0
XORWF ACCBHI,0
MOVWF SIGN
BTFSS ACCBHI,7
GOTO CHEK_A
COMF ACCBLO,F
INCF ACCBLO,F
BTFSC STATUS,Z
DECF ACCBHI,F
COMF ACCBHI,F
CHEK_A
BTFSC ACCAHI,7
CALL NEG_A
RETURN
;*******双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB**********
D_add
MOVF ACCALO,W ;ACCB和ACCA低半字节相加
ADDWF ACCBLO,F
BTFSC STATUS,C ;有进位否?
INCF ACCBHI,F ;有,ACCB高字节加1,再加ACCAHI
MOVF ACCAHI,W ;ACCA,ACCB高半字节相加
ADDWF ACCBHI,F
RETURN
;**************ACCA取补子程序***************************************
NEG_A
COMF ACCALO,F
INCF ACCALO,F
BTFSC STATUS,Z
DECF ACCAHI,F
COMF ACCAHI,F
RETURN
;**************************************
F_mpy
CALL S_SIGN ;求取乘积的符号,并对负数取补
CALL SETUP ;调用子程序将ACCB的值送ACCD
CLRF ACCCLO ;清ACCC
CLRF ACCCHI
MLOOP
BCF STATUS,C ;清进位位
RRF ACCDHI,F ;ACCD右移
RRF ACCDLO,F
BTFSC STATUS,C ;判断是否相加
CALL D_add ;加乘数至ACCB
BCF STATUS,C ;清进位位
RRF ACCBHI,F ;右移部分乘积
RRF ACCBLO,F
RRF ACCCHI,F
RRF ACCCLO,F
DECFSZ TEMP,F ;乘法完成否?
GOTO MLOOP ;否,继续循环
MOVF EXPA,W ;是,乘数与被乘数阶码相加,得积的阶码
ADDWF EXPB,F
MOVF ACCBHI,W ;ACCBHI=0?
BTFSS STATUS,Z
GOTO FINUP ;否,转FINUP
MOVF ACCBLO,W ;ACCB=0?
BTFSS STATUS,Z
GOTO SHFT08 ;否,只有ACCBHI=0,转SHFT08
MOVF ACCCHI,W ;ACCB=0,将乘积左移15位
MOVWF ACCBHI
MOVF ACCCLO,W
MOVWF ACCBLO
BCF STATUS,C
RRF ACCBHI,F
RRF ACCBLO,F
MOVLW .15 ;乘积阶码减15(十进制)
SUBWF EXPB,F
GOTO FINUP
SHFT08
MOVF ACCBLO,W
MOVWF ACCBHI
MOVF ACCCHI,W
MOVWF ACCBLO
BCF STATUS,C
RRF ACCBHI,F
RRF ACCBLO,F
MOVLW .7
SUBWF EXPB,F
FINUP
CALL F_norm
BTFSS SIGN,7
GOTO OVER
COMF ACCCLO,F
INCF ACCCLO,F
BTFSC STATUS,Z
DECF ACCCHI,F
COMF ACCCHI,F
BTFSC STATUS,Z
NEG_B
DECF ACCBLO,F
COMF ACCBLO,F
BTFSC STATUS,Z
DECF ACCBHI,F
COMF ACCBHI,F
OVER RETURN
;*************查表调用数字显示值***********************
ORG 0X1000
;**************错误指示代码调用********************************
ERROR1 ;信号微弱
BANKSEL INTCON
BCF INTCON,GIE ;禁止总中断
CALL CLEAR1
CALL CLEAR2
call delay40ms
CALL DISP_ERR1 ;信号微弱
NOP
SLEEP
GOTO $-1
ERROR2 ;齿圈装偏
BANKSEL INTCON
BCF INTCON,GIE ;禁止总中断
CALL CLEAR1
CALL CLEAR2
call delay40ms
BTFSC FIS_FLAG,0
GOTO END_ERROR2
CALL DISP_ERR2 ;齿圈装偏
SLEEP
END_ERROR2
CALL CLEAR1
CALL CLEAR2
CALL DISP_FINISH
SLEEP
NOP
GOTO $-1
ERROR3 ;齿圈缺齿
BANKSEL INTCON
BCF INTCON,GIE ;禁止总中断
CALL CLEAR1
CALL CLEAR2
call delay40ms
; CALL DISP_ERR3 ;齿圈缺齿
; NOP
BTFSC FIS_FLAG,0
GOTO END_ERROR3
CALL DISP_ERR3 ;齿圈装偏
SLEEP
END_ERROR3
CALL CLEAR1
CALL CLEAR2
CALL DISP_FINISH
SLEEP
NOP
GOTO $-1
CAL_DIGITAL
CLRF TEMP
MOVF COUNT,W
BTFSC STATUS,Z
GOTO DIG_LOOP1
DIG_LOOP
MOVLW .16
ADDWF TEMP,F
DECFSZ COUNT,1
GOTO DIG_LOOP
DECF TEMP,F
RETURN
DIG_LOOP1
CLRF TEMP
RETURN
;*****************求所取查表量的值**result_H1 TEMP_1*********************
DISP_DIGITAL
CALL CAL_DIGITAL ;取得要找所要的值
MOVF ADD_COUNT,W ;设置页地址
MOVWF PAGEADD
DIGI_LOOP
MOVF PAGEADD,W
CALL SEND2 ;设置起始页呵呵
MOVF COUNT_CLM,W ;设置要从那列开始
MOVWF CLMADD
MOVLW 0X08
MOVWF COUNT
DIGI_WRT11
MOVLW HIGH TABLE3
MOVWF PCLATH
MOVF TEMP,W
CALL TABLE3
MOVWF TEMP_STACK
MOVLW HIGH WRITE1
MOVWF PCLATH
MOVF TEMP_STACK,W
CALL WRITE2
INCF TEMP,1
DECFSZ COUNT,1
GOTO DIGI_WRT11
INCF PAGEADD,F
MOVF PAGEADD,W
CALL SEND2
; MOVLW 0X40
; MOVLW 0X60
; CALL SEND1 ;设置Y地址01XXXXXX
MOVLW 0X08
MOVWF COUNT
; MOVF COUNT_CLM,W ;REVISE
SUBWF CLMADD,F ;下一页返回前8列
DIGI_CON11
MOVLW HIGH TABLE3
MOVWF PCLATH
MOVF TEMP,W
CALL TABLE3
MOVWF TEMP_STACK
MOVLW HIGH WRITE1
MOVWF PCLATH
MOVF TEMP_STACK,W
CALL WRITE2
INCF TEMP,F
DECFSZ COUNT,F
GOTO DIGI_CON11
RETURN
;******************************
DISP_CHAR
MOVLW 0X00
MOVWF TEMP
MOVLW 0XB9 ;设置页地址
MOVWF PAGEADD
CALL DISP_CHAR1
MOVLW .96
MOVWF TEMP
MOVLW 0XBB ;设置页地址
MOVWF PAGEADD
CALL DISP_CHAR1
CALL DISP_CHAR2
CALL DISP_CHAR4
MOVLW 0X00 ;显示Hz
MOVWF TEMP
MOVLW 0XB9 ;设置页地址
MOVWF PAGEADD
CALL DISP_CHARHV
MOVLW .32 ;显示mV
MOVWF TEMP
MOVLW 0XBB ;设置页地址
MOVWF PAGEADD
CALL DISP_CHARHV
RETURN
DISP_CHAR2
MOVLW .4
MOVWF TOTAL
CLRF FLAG
MOVLW 0X40 ;REVISE空一字
MOVWF CLMADD ;设置起始行
MOVLW 0XBD ;设置页地址
MOVWF PAGEADD
CLRF TEMP
CHAR2_LOOP
MOVF PAGEADD,W
CALL SEND1 ;设置起始页呵呵
MOVLW .16 ;一个16字
MOVWF COUNT
CHAR2_LOOP1
MOVLW HIGH TABLE8
MOVWF PCLATH
MOVF TEMP,W
CALL TABLE8
MOVWF TEMP_STACK
MOVLW HIGH WRITE1
MOVWF PCLATH
MOVF TEMP_STACK,W
CALL WRITE1
INCF TEMP,F
DECFSZ COUNT,F
GOTO CHAR2_LOOP1
BTFSC FLAG,0 ;来判断是否已经完成了一个字
GOTO END2_LOOP
INCF PAGEADD,F
MOVLW .16
SUBWF CLMADD,F ;其默认值是多少!
BSF FLAG,0 ;置FLAG0为1
GOTO CHAR2_LOOP
END2_LOOP
BCF FLAG,0
DECF PAGEADD,F ;返回上一页
DECFSZ TOTAL,F
GOTO CHAR2_LOOP
RETURN
;*************加上值*******************
DISP_CHAR4
MOVLW .2
MOVWF TOTAL
MOVLW 0XB9
MOVWF PAGEADD
DISP_CHAR4_CONT
CLRF FLAG
MOVLW .96
MOVWF TEMP
MOVLW 0X70 ;为最后一个添加"值"
MOVWF CLMADD
CHAR3_LOOP
MOVF PAGEADD,W
CALL SEND1 ;设置起始页呵呵
MOVLW .16 ;一个16字
MOVWF COUNT
CHAR3_LOOP1
MOVLW HIGH TABLE8
MOVWF PCLATH
MOVF TEMP,W
CALL TABLE8
MOVWF TEMP_STACK
MOVLW HIGH WRITE1
MOVWF PCLATH
MOVF TEMP_STACK,W
CALL WRITE1
INCF TEMP,F
DECFSZ COUNT,F
GOTO CHAR3_LOOP1
BTFSC FLAG,0 ;来判断是否已经完成了一个字
GOTO END3_LOOP
INCF PAGEADD,F
MOVLW .16
SUBWF CLMADD,F ;其默认值是多少!
BSF FLAG,0 ;置FLAG0为1
GOTO CHAR3_LOOP
END3_LOOP
BCF FLAG,0
INCF PAGEADD,F
DECFSZ TOTAL,F
GOTO DISP_CHAR4_CONT
RETURN
DISP_CHAR1
MOVLW .3
MOVWF TOTAL
CLRF FLAG
MOVLW 0X40 ;REVISE空一字
MOVWF CLMADD ;设置起始行
CHAR_LOOP
MOVF PAGEADD,0
CALL SEND1 ;设置起始页呵呵
MOVLW .16 ;一个16字
MOVWF COUNT
CHAR_LOOP1
MOVLW HIGH TABLE4
MOVWF PCLATH
MOVF TEMP,W
CALL TABLE4
MOVWF TEMP_STACK
MOVLW HIGH WRITE1
MOVWF PCLATH
MOVF TEMP_STACK,W
CALL WRITE1
INCF TEMP,F
DECFSZ COUNT,F
GOTO CHAR_LOOP1
BTFSC FLAG,0 ;来判断是否已经完成了一个字
GOTO END_LOOP
INCF PAGEADD,F
MOVLW .16
SUBWF CLMADD,F ;其默认值是多少!
BSF FLAG,0 ;置FLAG0为1
GOTO CHAR_LOOP
END_LOOP
BCF FLAG,0
DECF PAGEADD,F ;返回上一页
DECFSZ TOTAL,F
GOTO CHAR_LOOP
; RETURN
;*****************************************************
DISP_CHARHV
MOVLW 0X00
MOVWF TEMP
MOVLW 0XB9 ;设置页地址
MOVWF PAGEADD
MOVLW 0X58
MOVWF VOL_STACK ;空几个数值
CALL DISP_CHAR3 ;显示Hz和mV
MOVLW .32
MOVWF TEMP
MOVLW 0XBB ;设置页地址
MOVWF PAGEADD
MOVLW 0X60
MOVWF VOL_STACK
CALL DISP_CHAR3
MOVLW .32
MOVWF TEMP
MOVLW 0XBD ;设置页地址
MOVWF PAGEADD
MOVLW 0X60
MOVWF VOL_STACK
CALL DISP_CHAR3
RETURN
DISP_CHAR3
MOVLW .2
MOVWF TOTAL
CLRF FLAG
MOVF VOL_STACK,W ;REVISE空3个字
MOVWF CLMADD ;设置起始行
CHAR_LOOPHZ
MOVF PAGEADD,0
CALL SEND2 ;设置起始页呵呵
MOVLW .8
MOVWF COUNT
CHAR_LOOP3
MOVLW HIGH TABLE7
MOVWF PCLATH
MOVF TEMP,W
CALL TABLE7
MOVWF TEMP_STACK
MOVLW HIGH WRITE1
MOVWF PCLATH
MOVF TEMP_STACK,W
CALL WRITE2
INCF TEMP,1
; MOVLW 0X01
; XORWF FLAG,F ;异或
DECFSZ COUNT,1
GOTO CHAR_LOOP3
BTFSC FLAG,0 ;来判断是否已经完成了一个字
GOTO END_LOOP3
INCF PAGEADD,F
MOVLW .8
SUBWF CLMADD,F ;其默认值是多少!
BSF FLAG,0 ;置FLAG0为1
GOTO CHAR_LOOPHZ
END_LOOP3
BCF FLAG,0
DECF PAGEADD,F ;返回上一页
;MOVLW .16
;ADDWF CLMADD,F
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -