📄 elc-1.asm
字号:
MOV 59H,#07 ;100
MOV 5AH,#0C8H
MOV 5BH,#00H
MOV R1,#59H
LCALL FMUL
MOV 56H,R4
MOV 57H,R2
MOV 58H,R3
LCALL FINT
MOV A,R3
MOV B,#10
DIV AB ;取得显示数据后两位
MOVC A,@A+DPTR
SETB ACC.7 ;添加小数点
MOV DISPLAY3,A
MOV A,B
MOVC A,@A+DPTR
MOV DISPLAY4,A
LCALL DIS_DAT
RET
DISP_FL6: LCALL FINT ;100> >10
MOV A,R3
MOV B,#10
DIV AB ;取得显示数据的整数部分
MOVC A,@A+DPTR ;送显示数据的前两位到寄存器
MOV DISPLAY1,A
MOV A,B
MOVC A,@A+DPTR
SETB ACC.7 ;设置小数点
MOV DISPLAY2,A
MOV R1,#5CH
LCALL INTF ;取显示数据的整数部分
LCALL FSUB ;取显示数据的小数部分
MOV 56H,R4 ;保存到60H
MOV 57H,R2
MOV 58H,R3
MOV 59H,#07 ;置浮点数100
MOV 5AH,#0C8H
MOV 5BH,#00H
MOV R0,#56H
MOV R1,#59H
LCALL FMUL ;显示数据的小数部分乘以100
MOV 56H,R4
MOV 57H,R2
MOV 58H,R3
LCALL FINT ;取得显示数据后两位
MOV A,R3
MOV B,#10
DIV AB
MOVC A,@A+DPTR ;送显示数据到相应寄存器
MOV DISPLAY3,A
MOV A,B
MOVC A,@A+DPTR
MOV DISPLAY4,A
LCALL DIS_DAT
RET
;**************************显示程序************************
DIS_DAT: ;MOV SCON,#00H ;设置串口工作方式0
CLR OE
MOV R1,#5
MOV R0,#DISPLAY5 ;
DIS_DAT1: ;MOV SBUF,@R0 ;送显示数据的第四字节到SBUF发送,并启动发送,P3.1开始有CLK输出
;JNB TI,$ ;发送完毕后TI置位
;CLR TI ;清标志位
MOV R2,#8
MOV A,@R0
DIS_DAT2: CLR DSP_CLK
RLC A
MOV DSP_DAT,C
SETB DSP_CLK
DJNZ R2,DIS_DAT2
DEC R0 ;传输下一字节的地址
; DEC R1
DJNZ R1,DIS_DAT1 ;是否输出最后一个字节
SETB OE ;打开输出允许,显示数据
NOP
RET
;***********数码管段码译码表********************
SEGTAB: DB 3FH,06H,5BH,4FH,66H ;0,1,2,3,4
DB 6DH,7DH,07H,7FH,6FH ;5,6,7,8,9
;************************延时子程序********************************
DELAY: MOV R4,#03H
AA2: MOV R5,#0FFH
AA1: MOV R6,#0FFH
AA: NOP
NOP
DJNZ R6,AA
DJNZ R5,AA1
DJNZ R4,AA2
RET
;************************闪烁显示程序**********************
DIS_FLASH: NOP
RET
PRO_ABN: NOP
RET
;******************************************************************************
;* 浮点运算子程序库 *
;******************************************************************************
;**********三字节浮点数转换为四字节浮点数*************
;R0放三字节浮点数首地址,R1放四字节浮点数首地址,R2放浮点数个数
FLOAT3TO4: NOP
INC R0 ;(R0)(R0+1)(R0+2)是否为0
MOV A,@R0
JNZ FLOAT3T2
INC R0
MOV A,@R0
JNZ FLOAT3T1
MOV @R1,#0
INC R1
MOV @R1,#0
INC R1
MOV @R1,#0
INC R1
MOV @R1,#0
INC R1
INC R0
DJNZ R2,FLOAT3TO4 ;判断转换结束否
RET
FLOAT3T1: DEC R0
FLOAT3T2: DEC R0
MOV A,@R0 ;取三字节浮点数的第一个字节
INC R0 ;三字节浮点数指针加1
MOV B,A
MOV C,ACC.6
MOV ACC.7,C ;阶码扩大到8位
ADD A,#01111110B ;加上偏移量变成移码
MOV C,B.7
RRC A ;循环右移,加回数符并保存最低位
MOV @R1,A ;保存四字节浮点数第一个字节
INC R1 ;四字节浮点数指针加1
MOV A,@R0 ;取三字节浮点数的第二个字节
INC R0 ;三字节浮点数指针加1
MOV ACC.7,C ;最高位加上阶码的最后一位
MOV @R1,A ;保存四字节浮点数第二个字节
INC R1 ;四字节浮点数指针加1
MOV A,@R0 ;取三字节浮点数的第三个字节直接保存到四字节浮点数的第三字节
INC R0
MOV @R1,A
INC R1
MOV @R1,#00H ;四字节浮点数第四位补0
INC R1
DJNZ R2,FLOAT3TO4 ;判断转换结束否
RET
;***************四字节浮点数转换为三字节浮点数***************
;***************R0放三字节浮点数首地址,R1放四字节浮点数首地址,R2放浮点数个数**********
FLOAT4TO3: NOP
MOV A,@R1
JNZ FLOAT4T4
INC R1
MOV A,@R1
JNZ FLOAT4T3
INC R1
MOV A,@R1
JNZ FLOAT4T2
INC R1
MOV A,@R1
JNZ FLOAT4T1
MOV @R0,#00H
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#00H
INC R0
INC R1
DJNZ R2,FLOAT4TO3
RET
FLOAT4T1: DEC R1
FLOAT4T2: DEC R1
FLOAT4T3: DEC R1
MOV A,@R1
FLOAT4T4: INC R1
MOV B,@R1
INC R1
MOV C,B.7
RLC A
MOV B.7,C
ADD A,#10000010B
MOV C,ACC.7
MOV ACC.6,C
MOV C,B.7
MOV ACC.7,C
MOV @R0,A
INC R0
SETB B.7
MOV @R0,B
INC R0
MOV A,@R1
INC R1
MOV B,@R1
INC R1
MOV C,B.7
ADDC A,#00H
MOV @R0,A
INC R0
DJNZ R2,FLOAT4TO3
RET
;**************三字节浮点数->三字节整数****************
;**************R0放三字节浮点数首地址,R1放结果(三字节整数)首地址***************
F3INT: MOV A,@R0
JB ACC.6,F3INT2
CLR ACC.7
CLR C
SUBB A,#25
JNC F3INT3 ;数大于2的24次方转
MOV A,@R0
CLR ACC.7
MOV R7,A
INC R0
MOV A,@R0
MOV R5,A
INC R0
MOV A,@R0
MOV R6,A
MOV R2,#00H
MOV R3,#00H
MOV R4,#00H
F3INT1: CLR C
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R7,F3INT1
MOV A,R2
MOV @R1,A
INC R1
MOV A,R3
MOV @R1,A
INC R1
MOV A,R4
MOV @R1,A
RET
F3INT2: MOV @R1,#00H
INC R1
MOV @R1,#00H
INC R1
MOV @R1,#00H
RET
F3INT3: MOV @R1,#0FFH
INC R1
MOV @R1,#0FFH
INC R1
MOV @R1,#0FFH
RET
;*****************三字节整数转化为三字节浮点数*******************
;************R0放三字节整数首地址,R1放结果(三字节浮点数)首地址************
INT3F: MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
INC R0
MOV A,@R0
MOV R4,A
DEC R0
DEC R0
MOV B,#0
MOV R7,#24
INT3F1: MOV A,R2
JB ACC.7,INT3F2
MOV A,R4
CLR C
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
INC B
DJNZ R7,INT3F1
INT3F2: INC R1
MOV A,R2
MOV @R1,A
INC R1
MOV A,R3
MOV @R1,A
DEC R1
DEC R1
MOV A,#24
CLR C
SUBB A,B
MOV @R1,A
RET
;*********************三角正弦函数*************************************************
;*********R0放弧度(三字节浮点数)首地址,R1放结果(三字节浮点数)首地址***********
FSIN: MOV @R1,#2 ;3.14159->(R1)
INC R1
MOV @R1,#0C9H
INC R1
MOV @R1,#10H
DEC R1
DEC R1
LCALL FDIV ;结果在R4R2R3;符号在FG00
MOV A,R0
PUSH ACC ;保存指针R0
INC SP
MOV A,SP
INC SP
INC SP
XCH A,R1
MOV R0,A
MOV A,R4
CLR ACC.7
MOV R4,A
JZ FSM1
JNB ACC.6,FSM3
FSM1: MOV R4,#40H
MOV R2,#0
MOV R3,#0
SJMP FSM4
FSM2: CLR C
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
INC R4
FSM3: CJNE R4,#16,FSM2
FSM4: MOV A,R3
MOV C,ACC.0
MOV FG03,C
JNB FG00,FSM5
CPL FG03
FSM5: MOV A,R4
MOV R6,A
SETB C
CLR PSW.5
LCALL FSDT
MOV A,R6
MOV C,FG00
MOV ACC.7,C
MOV R4,A
LCALL FSTR
LCALL FMUL
MOV A,R0
XCH A,R1
DEC A
MOV SP,A
LCALL FSTR
POP ACC
PUSH ACC
MOV R0,A
LCALL FSUB
MOV A,R4
CLR ACC.7
MOV R4,A
LCALL FSTR
MOV A,R1
MOV R0,A
LJMP FPLN
FSM6: MOV A,@R1
MOV C,FG03
MOV ACC.7,C
MOV @R1,A
POP ACC
MOV R0,A
RET
DXSCSBG:DB 0F7H,0A8H,70H
DB 7AH,0C6H,70H
DB 0F9H,0C5H,68H
DB 0FEH,0A5H,41H
DB 0FAH,26H,0A0H
DB 1,80H,0EH
DB 0FBH,0,1CH
DB 40H
;*********************多项式计算子程序*******************************
;程序为三字节浮点数X的多项式计算子程序
;入口时,X存放于(R0)指向的内部RAM中,(R1)指向存放结果的内部RAM单元
;FPLN子程序中调用FABP和WDMUL等子程序,使用DPTR,A,R0-R7寄存器
;********************************************************************
FPLN: MOV DPTR,#DXSCSBG
CLR A
MOVC A,@A+DPTR
MOV R6,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R2,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R3,A
INC DPTR
FP1: MOV A,@R0
XRL A,R6
MOV C,ACC.7
MOV FG00,C
INC R0
MOV A,@R0
MOV R4,A
INC R0
MOV A,@R0
MOV R5,A
DEC R0
DEC R0
LCALL WDMUL
MOV A,R2
JB ACC.7,FP2
MOV A,R7
RLC A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RL A
MOV R2,A
DEC R6
FP2: MOV A,R6
ADD A,@R0
MOV C,FG00
MOV ACC.7,C
MOV R6,A
CLR A
MOVC A,@A+DPTR
MOV R7,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R4,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R5,A
INC DPTR
CLR FG02
LCALL FABP
MOV A,R4
MOV R6,A
CLR A
MOVC A,@A+DPTR
CJNE A,#40H,FP1
LCALL FSTR
INC DPTR
CLR A
LJMP FSM6
;****************定点无符号双字节小数(纯小数)乘法子程序******************
;被乘数:R4(高位)R5(低位)
;乘数:R2(高位)R3(低位)
;结果返回:R2R3R7
;使用累加器A,寄存器B,R2,R3,R4,R5,R6,R7及标志位F0
;************************************************************************
WDMUL: MOV A,R3
MOV B,R5
MUL AB
MOV R7,B
MOV A,R3
MOV B,R4
MUL AB
ADD A,R7
MOV R7,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2
MOV B,R5
MUL AB
ADD A,R7
MOV R7,A
MOV A,R3
ADDC A,B
MOV R3,A
MOV PSW.5,C
MOV A,R2
MOV B,R4
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV C,PSW.5
ADDC A,#0
MOV R2,A
RET
;*********************通用规格化子程序FSDT********************
;功能:使两操作数的阶码相等
;CY=0,F=0,则对R6(阶)R2R3进行右规一位操作,右移输入位为FG01
;CY=0,F=1,则对R7(阶)R4R5进行右规一位操作,右移输入位为FG01
;CY=1,则对R6(阶)R2R3进行左规格化,第一次左移输入位为FG01
;使用A,CY,F0,R0-R7
;**************************************************************
NOP
NOP
FSDT: JC FS2 ;通用规格化子程序
MOV C,FG01
JB PSW.5,FS1
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
INC R6
RET
FS1: MOV A,R4
RRC A
MOV R4,A
MOV A,R5
RRC A
MOV R5,A
INC R7
RET
FS2: MOV A,R2
JNZ FS4
CJNE R3,#0,FS5
MOV R6,#41H
FS3: RET
FS4: JB ACC.7,FS3
FS5: MOV C,PSW.5
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
CLR PSW.5
DEC R6
SJMP FS2
;**********************浮点数取数子程序**********************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -