INC A JZ DISP_DP DEC A
DISP_LOOKUP: MOVC A, @A+DPTR MOV DAT, A LCALL PR2 LCALL DELAY
DJNZ TEMP1, DISP_NORMAL SJMP DISP_DONE ; ----------- DISP_ZERO: MOV A, #00H ; '0' MOV TEMP1, #01H SJMP DISP_LOOKUP
; --------------
DISP_DP: ; DISPLAY, DECIMAL POINT MOV A, #0AH SJMP DISP_LOOKUP ; ----------- DISP_ERR:
MOV A, #0CH ; 'E' MOVC A, @A+DPTR MOV DAT, A LCALL PR2 LCALL DELAY SJMP DISP_DONE ; ---------------- DISP_DONE: RET
;================= DISPTAB:
DB 30H,31H,32H,33H,34H,35H,36H,37H, 38H, 39H DB 2EH, 2DH, 45H ; '.', '-', 'E'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; =======================================================
;;*************************************** ;; LCD 初始化程序
;;*************************************** LCDINIT:MOV A,#30H MOV DPTR,#CW_ADD
MOV R2,#03H LCDINT1:MOVX @DPTR,A LCALL DELAY DJNZ R2,LCDINT1 MOV COM,#38H LCALL PR1 MOV COM,#01H LCALL PR1
MOV COM,#06H ;设置输入方式 LCALL PR1
MOV COM,#0FH LCALL PR1 RET
;******************************** ;读BF和AC值
;********************************
PR0: PUSH DPH PUSH DPL PUSH ACC
MOV DPTR,#CR_ADD MOVX A,@DPTR MOV COM,A POP ACC POP DPL POP DPH RET
;******************************** ;写指令代码字程序
;********************************
PR1: PUSH DPH PUSH DPL PUSH ACC
MOV DPTR,#CR_ADD PR11:MOVX A,@DPTR JB ACC.7,PR11 MOV A,COM
MOV DPTR,#CW_ADD MOVX @DPTR,A
POP ACC POP DPL POP DPH RET
;******************************** ;写显示数据子程序
;******************************** PR2: PUSH DPH PUSH DPL PUSH ACC
MOV DPTR,#CR_ADD PR21:MOVX A,@DPTR JB ACC.7,PR21 MOV A,DAT
MOV DPTR,#DW_ADD MOVX @DPTR,A POP ACC POP DPL POP DPH RET
;******************************** ;读显示数据子程序
;******************************** PR3: PUSH DPH PUSH DPL PUSH ACC
MOV DPTR,#CR_ADD PR31:MOVX A,@DPTR JB ACC.7,PR31 MOV DPTR,#DR_ADD MOVX A,@DPTR MOV DAT,A POP ACC POP DPL POP DPH RET
;***************************************** ; DELAY
;***************************************** DELAY: MOV R6,#02H MOV R7,#02H DELAY1: NOP
DJNZ R7,DELAY1
DJNZ R6,DELAY1 RET
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; FLOATLIB 浮点程序库
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ===========================================================
;(1) 标号: FSDT 功能:浮点数格式化
;入口条件:待格式化浮点操作数在[R0]中。 ;出口信息:已格式化浮点操作数仍在[R0]中。
;影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节 FSDT: LCALL MVR0 ; 将待格式化操作数传送到第一工作区中 LCALL RLN ; 通过左规完成格式化
LJMP MOV0 ; 将已格式化浮点操作数传回到[R0]中
;(2) 标号: FADD 功能:浮点数加法
;入口条件:被加数在[R0]中,加数在[R1]中。
;出口信息:OV=0时,和仍在[R0]中,OV=1时,溢出。
;影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 6字节 FADD: CLR F0 ; 设立加法标志 SJMP AS ; 计算代数和
;(3) 标号: FSUB 功能:浮点数减法
;入口条件:被减数在[R0]中,减数在[R1]中。
;出口信息:OV=0时,差仍在[R0]中,OV=1时,溢出。
;影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节 FSUB: SETB F0 ; 设立减法标志
AS: LCALL MVR1 ; 计算代数和。先将[R1]传送到第二工作区 MOV C,F0 ; 用加减标志来校正第二操作数的有效符号 RRC A XRL A,@R1 MOV C,ACC.7
ASN: MOV 1EH,C ; 将第二操作数的有效符号存入位1EH中 XRL A,@R0 ; 与第一操作数的符号比较 RLC A
MOV F0,C ; 保存比较结果
LCALL MVR0 ; 将[R0]传送到第一工作区中 LCALL AS1 ; 在工作寄存器中完成代数运算
MOV0: INC R0 ; 将结果传回到[R0]中的子程序入口 INC R0
MOV A,R4 ; 传回尾数的低字节 MOV @R0,A DEC R0
MOV A,R3 ; 传回尾数的高字节 MOV @R0,A DEC R0
MOV A,R2 ; 取结果的阶码 MOV C,1FH ; 取结果的数符 MOV ACC.7,C ; 拼入阶码中 MOV @R0,A
CLR ACC.7 ; 不考虑数符 CLR OV ; 清除溢出标志
CJNE A,#3FH,MV01; 阶码是否上溢? SETB OV ; 设立溢出标志
MV01: MOV A,@R0 ; 取出带数符的阶码 RET
MVR0: MOV A,@R0 ; 将[R0]传送到第一工作区中的子程序 MOV C,ACC.7 ; 将数符保存在位1FH中 MOV 1FH,C
MOV C,ACC.6 ; 将阶码扩充为8bit补码 MOV ACC.7,C
MOV R2,A ; 存放在R2中 INC R0
MOV A,@R0 ; 将尾数高字节存放在R3中 MOV R3,A INC R0
MOV A,@R0 ; 将尾数低字节存放在R4中 MOV R4,A
DEC R0 ; 恢复数据指针 DEC R0 RET
MVR1: MOV A,@R1 ; 将[R1]传送到第二工作区中的子程序 MOV C,ACC.7 ; 将数符保存在位1EH中 MOV 1EH,C
MOV C,ACC.6 ; 将阶码扩充为8bit补码 MOV ACC.7,C
MOV R5,A ; 存放在R5中 INC R1
MOV A,@R1 ; 将尾数高字节存放在R6中 MOV R6,A INC R1
MOV A,@R1 ; 将尾数低字节存放在R7中