- 打卡等级:初来乍到
- 打卡总天数:2
- 最近打卡:2026-07-01 14:52:15
新手上路
- 积分
- 15
|
$NOMOD51
NAME FCASTL
/**********************************************************************************************
* float R4R5R6R7 fcastl(long R4R5R6R7); //低在先!!!
* result = value1 // long-->float
* R4R5R6R7 = R4R5R6R7
* 32位 long-->32位 float
* float R4R5R6R7 fcastl(int R4R5); !
* result = value1 // int-->float
* R6R7 = R4R5R6R7
* 16位 int-->32位 float
* float R4R5R6R7 fcastl(char R4);
* result = value1 // char-->float
* R7 = R4R5R6R7
* 8位 char-->32位 float
* 用 途 :STC8系列MCU
* 作 者 :许意义
* 版 本 :2.00
* 日 期 :2022-12-12
**********************************************************************************************/
LD_MD MACRO BYTE_X, INC_DPTR
MOV A,BYTE_X
MOVX @DPTR,A
IF INC_DPTR
INC DPTR
ENDIF
ENDM
ST_MD MACRO BYTE_X, INC_DPTR
MOVX A,@DPTR
MOV BYTE_X,A
IF INC_DPTR
INC DPTR
ENDIF
ENDM
WAIT MACRO
MOV A,#0x01
MOVX @DPTR,A
MOVX A,@DPTR
JB ACC.0,$-1
ENDM
//NOMOD51 SET (SMALL) DEBUG EP
//SET (SMALL) DEBUG EP
; 特殊功能寄存器和位
P_SW2 DATA 0BAH ; Bit7: EAXFR
ACC DATA 0E0H
B DATA 0F0H
PSW DATA 0D0H
SP DATA 81H
DPL DATA 82H
DPH DATA 83H
IE DATA 0A8H
OV BIT 0D0H.2
P BIT 0D0H.0
F0 BIT 0D0H.5
F1 BIT 0D0H.1
RS1 BIT 0D0H.4
RS0 BIT 0D0H.3
AC BIT 0D0H.6
CY BIT 0D0H.7
EA BIT 0A8H.7
; MODE[2:0]= 1, 右移(clock:3-18); MODE[2:0]= 2, 左移(clock:3-18); MODE[2:0]= 3, 数据规格化(clock:3-20)
; MODE[2:0]= 4, 16位乘法(clock:10); MODE[2:0]= 5, 16位除法(clock:9); MODE[2:0]= 6, 32位/16位(clock:17)
ARCON DATA 0FCF6H ; Bit[7:5]: MODE[2:0], Bit[4:0]: SC[4:0]
OPCON DATA 0FCF7H ; Bit6: MDOV, Bit1: RST, Bit0: ENOP
MD3 DATA 0FCF0H
MD2 DATA 0FCF1H
MD1 DATA 0FCF2H
MD0 DATA 0FCF3H
MD5 DATA 0FCF4H
MD4 DATA 0FCF5H
?PR?_FCASTL?FCASTL SEGMENT CODE
EXTRN CODE (?C?LNEG)
PUBLIC ?C?FCASTL
PUBLIC ?C?FCASTI
PUBLIC ?C?FCASTC
RSEG ?PR?_FCASTL?FCASTL
?C?FCASTL:
MOV B, #0x20+0x7E // long-->float
SJMP FCASTC_002_
?C?FCASTI:
MOV B, #0x10+0x7E // int-->float
SJMP FCASTC_001_
?C?FCASTC:
MOV B, #0x08+0x7E // char-->float
MOV R5, #0x00
FCASTC_001_:
MOV R6, #0x00
MOV R7, #0x00
FCASTC_002_:
RLC A
MOV F0, C
JNB F0, FCASTC_003_
LCALL ?C?LNEG
FCASTC_003_:
PUSH IE
CLR EA
PUSH P_SW2
ORL P_SW2,#0x80
MOV DPTR, #MD3
LD_MD R4, 1
LD_MD R5, 1
LD_MD R6, 1
LD_MD R7, 0
MOV DPTR, #ARCON
LD_MD #0x60, +1 // 32位规格化左移(clock:3-20)
WAIT
MOV DPTR, #ARCON
MOVX A, @DPTR
ANL A, #0x1F
XCH A, B
CLR C
SUBB A, B // 指数 --> R4
MOV C, F0
RRC A
MOV R4, A
MOV DPTR, #MD3 // 小数 --> R5R6R7
MOVX A, @DPTR
MOV ACC.7, C
MOV R5, A
INC DPTR
ST_MD R6, +1
ST_MD R7, 0
POP P_SW2
POP IE
RET
END
这是官方给的使用MDU16加速的整数转单精度程序,在主函数和中断同时使用这个程序会导致输出结果符号丢失。
|
|