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

📄 diagnose_whl.asm

📁 这个可是我用了三个月的结晶
💻 ASM
📖 第 1 页 / 共 5 页
字号:
    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 + -