最据山寨特色的《中颖快速浮点乘、除法程库》!!!
一、简介浮点数的运算,一贯比定点数慢很多,在C51中,浮点数乘除法,由于缺少相适应指令,运算速度超级慢,比浮点数加减法,慢不是一个等级,极大的影响了51单片机的实时运算速度,本文中,依靠中颖SH79/88/89系列的特色----准16位乘除指令,对所有关联到的无符号、有符号int型,无符号、有符号long型 和 float型变量的乘除运算,均作了运算速度大幅度提升,为方便使用,以外挂库形式加入,实行对C51内库自动替换,无缝嵌入。
其中最具有山寨特色的是float型的除法运算,便用中颖SH79/88/89系列的准16位乘除指令,经过简单的组合运算,代替原Keil C51的加减法模拟除法程序,大幅度地提升了原float型的除法的运算速度,解决了原51浮点除法特慢的通病。
二、中颖专用乘除库清单
/*
extern uint16 imul(uint16 value1,uint16 value2); // 16位*16位-->16位(无符号二进制乘法)
extern uint16uidiv(uint32 value1,uint16 value2); // 16位/16位-->16位(无符号二进制除法)
extern uint32 lmul(uint32 value1,uint32 value2); // 32位*32位-->32位(无符号二进制乘法)
extern uint32uldiv(uint32 value1,uint32 value2); // 32位/32位-->32位(无符号二进制除法)
extern float fpmul(float value1, float value2); // 二进制浮点数快速乘法
extern float fpdiv(float value1, float value2); // 二进制浮点数快速除法
*/
三、便用说明
只需要在编译程序过程中国,加入《中颖专用乘除库》----MATH_SH88F51.LIB,其他什么事都不用干!在编译过程中实现自动替换原C51库函数,无缝嵌入。
四、友情提示
本《中颖专用乘除库》,仅适用于中颖SH79/88/89系列单片机,其他51单片机并不适用,由于Keil C51不支持中颖51单片机的软件仿真,所以必须要用中颖51单片机的硬件仿真或依靠中颖51单片机的实时运行,运算结果才能正确。 《中颖专用乘除库》
有用,占位支持!下载使用! 本《中颖专用乘除库》,增加了若干非常实用的,无符号、有符号定点多字节乘法、除法子程序库,还有一个特色就是,增加了无符号、有符号定点多字节除法同时取商和余数子程序库,对同时需要用到这两个参数的场合,极大地提高了运行速度,使用时只需在C程序中,插入如下头本件 global.h 即可。
/***************************************************************************************
Model: global.h
Description : Head file of defining global variable.
Author: CLR
Create Time : 2011-09-29
Version ID: 1.3
用途 :中颖SH79/88/89F51系列MCU
作者 :许意义
21icID :LAOXU
中颖论坛 : bbs.21ic.com
****************************************************************************************/
#ifndef_GLOBAL_H
#define_GLOBAL_H
#pragmaMODDP2 // 打开中颖单片机双DPTR功能,加速数据传送
//#pragmaNOMODDP2 // 关闭中颖单片机双DPTR功能
/*--------------------------------------------------------------------------------------*/
/* Resource - math.asm */
/*--------------------------------------------------------------------------------------*/
externuint8 ascii_hex(uint8 value1); //1位 ASCII --> 1位 HEX(低半字节)
externuint8 hex_ascii(uint8 value1); //1位 HEX(低半字节)--> 1位 ASCII
externuint8 bcd8_hex(uint8 value1); //8位 BCD --> 8位 HEX
extern uint16bcd16_hex(uint16 value1); // 16位 BCD -->16位 HEX
extern uint32bcd32_hex(uint32 value1); // 32位 BCD -->32位 HEX
externuint16 hex8_bcd(uint8 value1); //8位 HEX -->16位 BCD
extern uint32hex16_bcd(uint16 value1); // 16位 HEX -->32位 BCD
extern uint32hex32_bcd(uint32 value1); // 32位 HEX -->32位 BCD
externuint32mul16_8(uint16 value1,uint8 value2);// 16位* 8位-->32位(无符号二进制乘法)
externuint32mul16(uint16 value1,uint16 value2); // 16位*16位-->32位(无符号二进制乘法)
externuint32mul32_8(uint32 value1,uint8 value2);// 32位* 8位-->32位(无符号二进制乘法)
externuint32mul32_16(uint32 value1,uint16 value2);// 32位*16位-->32位(无符号二进制乘法)
externuint32mul32(uint32 value1,uint32 value2); // 32位*32位-->32位(无符号二进制乘法)
extern uint16div16_8(uint16 value1,uint8 value2); // 16位/ 8位-->16位(无符号二进制除法)
externuint16div16(uint16 value1,uint16 value2); // 16位/16位-->16位(无符号二进制除法)
externuint32div32_8(uint32 value1,uint8 value2);// 32位/ 8位-->32位(无符号二进制除法)
externuint32div32_16(uint32 value1,uint16 value2);// 32位/16位-->32位(无符号二进制除法)
externuint32div32(uint32 value1,uint32 value2); // 32位/32位-->32位(无符号二进制除法)
extern uint8mod16_8(uint16 value1,uint8 value2);// 16位% 8位--> 8位(无符号二进制取余数)
extern uint16mod16(uint16 value1,uint16 value2); // 16位%16位-->16位(无符号二进制取余数)
extern uint8 mod32_8(uint32 value1,uint8 value2); // 32位% 8位--> 8位(无符号二进制取余数)
extern uint16 mod32_16(uint32 value1,uint16 value2); // 32位%16位-->16位(无符号二进制取余数)
extern uint32 mod32(uint32 value1,uint32 value2); // 32位%32位-->32位(无符号二进制取余数)
extern uint16div16_8m(uint16 value1,uint8 value2,uint8 data *p); // 16位/ 8位-->16位(无符号二进制除法及取余数,8位余数存*p)
extern uint16div16m(uint16 value1,uint16 value2,uint16 data *p); // 16位/16位-->16位(无符号二进制除法及取余数,16位余数存*p)
extern uint32div32_8m(uint32 value1,uint8 value2,uint8 data *p); // 32位/ 8位--> 8位(无符号二进制除法及取余数,8位余数存*p)
extern uint32 div32_16m(uint32 value1,uint16 value2,uint16 data *p); // 32位/16位-->16位(无符号二进制除法及取余数,16位余数存*p)
extern uint32 div32m(uint32 value1,uint32 value2,uint32 data *p); // 32位/32位-->32位(无符号二进制除法及取余数,32位余数存*p)
externint32smul16_8(int16 value1,int8 value2); // 16位* 8位-->32位(有符号二进制补码乘法)
externint32smul16(int16 value1,int16 value2); // 16位*16位-->32位(有符号二进制补码乘法)
externint32smul32_8(int32 value1,int8 value2); // 32位* 8位-->32位(有符号二进制补码乘法)
externint32smul32_16(int32 value1,int16 value2); // 32位*16位-->32位(有符号二进制补码乘法)
externint32smul32(int32 value1,int32 value2); // 32位*32位-->32位(有符号二进制补码乘法)
extern int16sdiv16_8(int16 value1,int8 value2); // 16位/ 8位-->16位(有符号二进制补码除法)
externint16sdiv16(int16 value1,int16 value2); // 16位/16位-->16位(有符号二进制补码除法)
externint32sdiv32_8(int32 value1, int8 value2); // 32位* 8位-->32位(有符号二进制补码乘法)
externint32sdiv32_16(int32 value1,int16 value2); // 32位/16位-->32位(有符号二进制补码除法)
externint32sdiv32(int32 value1,int32 value2); // 32位/32位-->32位(有符号二进制补码除法)
extern int8 smod16_8(int16 value1,int8 value2); // 16位% 8位--> 8位(有符号二进制补码取余数)
extern int16smod16(int16 value1,int16 value2); // 16位%16位-->16位(有符号二进制补码取余数)
extern int8 smod32_8(int32 value1,int8 value2); // 32位% 8位--> 8位(有符号二进制补码取余数)
extern int16smod32_16(int32 value1,int16 value2); // 32位%16位-->16位(有符号二进制补码取余数)
extern int32smod32(int32 value1,int32 value2); // 32位%32位-->32位(有符号二进制补码取余数)
extern int16sdiv16_8m(int16 value1,int8 value2,int8 data *p); // 16位/ 8位-->16位(有符号二进制除法及取余数,8位余数存*p)
extern int16sdiv16m(int16 value1,int16 value2,int16 data *p); // 16位/16位-->16位(有符号二进制除法及取余数,16位余数存*p)
extern int32sdiv32_8m(int32 value1,int8 value2,int8 data *p);// 32位/ 8位--> 8位(有符号二进制除法及取余数,8位余数存*p)
extern int32sdiv32_16m(int32 value1,int16 value2,int16 data *p); // 32位/16位-->16位(有符号二进制除法及取余数,16位余数存*p)
extern int32sdiv32m(int32 value1,int32 value2,int32 data *p); // 32位/32位-->32位(有符号二进制除法及取余数,32位余数存*p)
externvoidld_pdata(int8 addr1, int8 addr2, int8 len); //@PDATA --> @IDATA(len字节PDATA读入片内IDATA RAM)
externvoidst_pdata(int8 addr1, int8 addr2, int8 len); //@IDATA --> @PDATA(len字节片内IDATA RAM存入PDATA)
/*中颖单片机C51定点库内部调用函数
externint32 st_r03_r47(void); //R0R1R2R3 ---> R4R5R6R7
externint16 neg(void); //-(R6R7)---> R6R7
*/
/*中颖单片机C51定点库、浮点库自动调用专用运算库函数,合适有效地插入了中颖SH79/88/89系列的特色----准16位乘除指令,对所有
关联到的无符号、有符号int型,无符号、有符号long型 和 float型变量的乘除运算,均作了运算速度大幅度提升,为方便使用,以外
挂库形式加入,实行对C51内库自动替换,无缝嵌入,其中最具有特色的是float型的除法运算,用中颖SH79/88/89系列的准16位乘除指
令,代替原Keil C51的加减法模拟除法程序,大幅度地提升了原float型的除法的运算速度,解决了原51浮点除法特慢的通病。
extern uint16 imul(uint16 value1,uint16 value2); // 16位*16位-->16位(无符号二进制乘法)
extern uint16uidiv(uint32 value1,uint16 value2); // 16位/16位-->16位(无符号二进制除法)
extern uint32 lmul(uint32 value1,uint32 value2); // 32位*32位-->32位(无符号二进制乘法)
extern uint32uldiv(uint32 value1,uint32 value2); // 32位/32位-->32位(无符号二进制除法)
extern float fpmul(float value1, float value2); // 二进制浮点数快速乘法
extern float fpdiv(float value1, float value2); // 二进制浮点数快速除法
*/
#endif
欢迎各路盆友下载使用~~~ 我顶,这对于算术运算的程序员简直是福音。
不做的人不知道,做过的人都知道。 谢谢highgear老师支持~~~
这个程序库,最难的就是51的浮点数快速除法,今天花了大半天时间,来研究51的浮点数快速除法,充分使用了中颖SH79/88/89系列的特色----准16位乘除指令,对原Keil C51的加减法模拟除法库程序,进行改造,
经过简单的组合运算,成功替代原Keil C51的浮点除法库程序时,还是很兴奋的,程序编写其实很简单,关健是算法的从理论到实践的验证~~~
在8051上,要实现32位快速浮点数除法,并不容易,感谢中颖,感谢中颖51,感谢中颖51单片机的准16位乘除指令,让俺实现了用乘除组合运算,成功替代了原C51用加减法模拟除法的库函数,实际运算速度大幅度提升~~~ 将改写的中颖51快速浮点数乘法、除法哂一晒,供有情人参考~~~
中颖51快速浮点数乘法程序FPMUL.A51
$NOMOD51
NAME ?C?FPMUL
/**********************************************************************************************
* float R4R5R6R7 fpmul(float R4R5R6R7, float R0R1R2R3);
* result = value1 * value2
* R4R5R6R7 = R4R5R6R7 * R0R1R2R3
* 32位*32位-->32位(4字节浮点数快速乘法)
用 途 :中颖SH79/88/89F51系列MCU
作 者 :许意义
21ic ID :LAOXU
中颖论坛 : bbs.21ic.com
日 期 : 2011-09-29
**********************************************************************************************/
?PR?_FPMUL?FPMUL SEGMENT CODE
EXTRN CODE (_FPRET_1)
EXTRN CODE (_FPRET_2)
EXTRN CODE (_FPRET_3)
EXTRN CODE (_FPRET_4)
EXTRN CODE (_FPRET_5)
EXTRN CODE (_FPRET_6)
PUBLIC ?C?FPMUL
RSEG ?PR?_FPMUL?FPMUL
?C?FPMUL: MOV A,R4
ORL A,R5
JZ FMUL01
MOV A,R0
ORL A,R1
JNZ FMUL02
MOV A,R5
RLC A
MOV A,R4
RLC A
INC A
JZ FMUL03
CLR A
MOV R4,A
MOV R7,A
MOV R6,A
MOV R5,A
FMUL04: RET
FMUL01: MOV A,R1
RLC A
MOV A,R0
RLC A
INC A
JNZ FMUL04
FMUL03: LJMP _FPRET_4
FMUL02: LCALL _FPRET_1
ANL A,R0
INC A
JZ FMUL07
CLR A
XCH A,R4
ADD A,#81H
JNC FMUL08
ADD A,R0
JNC FMUL09
FMUL07: LJMP _FPRET_6
FMUL08: ADD A,R0
JC FMUL09
LJMP _FPRET_5
FMUL09: PUSH ACC
ORL 0x86,#0x0c
MOV A,R3
ORL A,R2
JNZ FMUL12
CJNE R1,#0x80,FMUL19
FMUL15: POP ACC
MOV R3,A
LJMP _FPRET_3
FMUL19: MOV A,R7
ORL A,R6
JNZ FMUL14
CJNE R5,#0x80,FMUL20
FMUL21: MOV A,R3
MOV R7,A
MOV A,R2
MOV R6,A
MOV A,R1
MOV R5,A
SJMP FMUL15
FMUL20: MOV 0xF1,#0
MOV A,R1
MOV B,R5
MUL AB
MOV R6,A
MOV A,B
LJMP FMUL16
FMUL18: MOV A,R1
XCH A,R5
MOV R1,A
MOV A,R2
MOV R6,A
MOV A,R3
MOV R7,A
FMUL14: MOV 0xF1,R6
MOV A,R7
MOV B,R1
MUL AB
MOV R4,A
MOV R7,B
MOV A,0xF1
XCH A,R5
MOV 0xF1,#0
MOV B,R1
MUL AB
ADD A,R5
MOV R6,A
CLR A
ADDC A,B
SJMP FMUL16
FMUL12: MOV A,R7
ORL A,R6
JNZ FMUL17
CJNE R5,#0x80,FMUL18
SJMP FMUL21
FMUL17: MOV 0xF1,R6
MOV A,R7
MOV B,R3
MUL AB
MOV R4,B
MOV R0,0xF1
MOV 0xF1,R6
MOV A,R7
MOV B,R2
MUL AB
ADD A,R4
MOV A,B
ADDC A,R0
MOV R4,A
CLR A
ADDC A,0xF1
MOV R0,A
MOV 0xF1,R6
MOV A,R7
MOV B,R1
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R0
MOV R7,A
CLR A
ADDC A,0xF1
MOV R0,A
MOV 0xF1,R2
MOV A,R3
MOV B,R5
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R7
MOV R7,A
MOV A,0xF1
ADDC A,R0
MOV R6,A
CLR A
MOV 0xF1,A
RLC A
XCH A,R5
MOV B,R1
MUL AB
ADD A,R6
MOV R6,A
MOV A,B
ADDC A,R5
FMUL16: MOV R5,A
ANL 0x86,#0xf3
RLC A
POP ACC
MOV R3,A
JNC FMUL22
INC R3
CJNE R3,#0x00,FMUL23
LJMP _FPRET_6
FMUL22: MOV A,R4
ADD A,R4
MOV R4,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
FMUL23: LJMP _FPRET_2
END 中颖51快速浮点数除法程序FPDIV.A51
$NOMOD51
NAME ?C?FPDIV
/**********************************************************************************************
* float R4R5R6R7 fpmul(float R4R5R6R7, float R0R1R2R3);
* result = value1 / value2
* R4R5R6R7 = R4R5R6R7 / R0R1R2R3
* 32位/32位-->32位(4字节浮点数快速除法)
用 途 :中颖SH79/88/89F51系列MCU
作 者 :许意义
21ic ID :LAOXU
中颖论坛 : bbs.21ic.com
日 期 : 2011-09-29
**********************************************************************************************/
?PR?_FPDIV?FPDIV SEGMENT CODE
EXTRN CODE (_FPRET_1)
EXTRN CODE (_FPRET_2)
EXTRN CODE (_FPRET_3)
EXTRN CODE (_FPRET_4)
EXTRN CODE (_FPRET_5)
EXTRN CODE (_FPRET_6)
PUBLIC ?C?FPDIV
DPL1 EQU 0x84
DPH1 EQU 0x85
RSEG ?PR?_FPDIV?FPDIV
FPDIV_4: LJMP _FPRET_6
?C?FPDIV: MOV A,R4
ANL A,R5
INC A
JZ FPDIV_1
MOV A,R0
ANL A,R1
INC A
JNZ FPDIV_2
FPDIV_1: LJMP _FPRET_4
FPDIV_2: LCALL _FPRET_1
ANL A,R0
INC A
JZ FPDIV_1
MOV A,R4
ORL A,R0
JZ FPDIV_1
MOV A,R4
JNZ FPDIV_3
MOV R5,A
MOV R6,A
MOV R7,A
RET
FPDIV_3: XCH A,R0
JZ FPDIV_4
ADD A,#0x81
XCH A,R0
JNC FPDIV_5
CLR C
SUBB A,R0
JZ FPDIV_6
JNC FPDIV_7
FPDIV_6: LJMP _FPRET_5
FPDIV_5: SUBB A,R0
JNC FPDIV_4
FPDIV_7: MOV DPL,A
MOV A,R1
ADD A,R1
ORL A,R3
ORL A,R2
JNZ FPDIV_8
MOV R3,DPL
LJMP _FPRET_3
FPDIV_8: CLR C
MOV A,R7
SUBB A,R3
MOV A,R6
SUBB A,R2
MOV A,R5
SUBB A,R1
JC FPDIV_9
CLR C
MOV A,R5
RRC A
MOV R5,A
MOV A,R6
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
INC DPL
// H0(R0) = ffff / R1
FPDIV_9: ORL 0x86,#0x0c
MOV A,#0xff
MOV 0xF1,A
MOV B,R1
DIV AB
MOV R0,A
PUSH DPL
// N0(R5R6R7R4) = R5R6R7<<8 + (R5R6R7*H0) (放大1字节)
MOV A,R7
MOV 0xF1,R6
MOV B,R0
MUL AB
MOV R4,A
MOV DPL1,A
MOV A,R7
ADD A,B
MOV R7,A
MOV DPH1,A
MOV A,R6
ADDC A,0xF1
MOV R6,A
MOV A,R5
MOV 0xF1,#0
MOV B,R0
MUL AB
ADD A,R6
MOV R6,A
MOV DPL,A
MOV A,B
ADDC A,R5
MOV R5,A
MOV DPH,A // R5R6R7R4 ---> 双DPTR
// D0(R2R3) = R1R2R3 + (R1R2R3*H0>>8)
MOV A,R3
MOV 0xF1,R2
MOV B,R0
MUL AB
MOV A,B
ADD A,R3
MOV R3,A
MOV A,0xF1
ADDC A,R2
MOV R2,A
MOV A,R1
MOV B,R0
MUL AB
ADD A,R2
MOV R2,A
// &(R2R3) = -D0 (2字节)
CLR C
CLR A
SUBB A,R3
MOV R3,A
CLR A
SUBB A,R2
MOV R2,A
// Q = N0 + A + B + C
// A = N0*& (丢3字节) R5R6R7R4(N0) * R2R3 ---> R5R6R7R4(A) | R5=0
LCALL NFPMUL32
LCALL NFPADD32
// B = A*& (丢3字节) R5R6R7R4(A) * R2R3 ---> R5R6R7R4(B) | R5R6=0
LCALL NFPMUL32
LCALL NFPADD32
// C = B*& (丢3字节) R5R6R7R4(B) * R2R3 ---> R5R6R7R4(C) | R5R6R7=0
LCALL NFPMUL32
LCALL NFPADD32
ANL 0x86,#0xf3
POP ACC
DEC A
MOV R3,A
MOV R5,DPH
MOV R6,DPL
MOV R7,DPH1
MOV R4,DPL1
LJMP _FPRET_2
// R5R6R7R4 * R2R3 ---> R5R6R7R4
NFPMUL32: MOV A,R3
MOV 0xF1,R2
MOV B,R4
MUL AB
MOV R1,B
MOV R4,0xF1
MOV A,R3
MOV 0xF1,R2
MOV B,R7
MUL AB
ADD A,R1
MOV A,B
ADDC A,R4
MOV R1,A
CLR A
ADDC A,0xF1
MOV R4,A
MOV A,R5
ORL A,R6
JZ NFPML32_1
MOV A,R3
MOV 0xF1,R2
MOV B,R6
MUL AB
ADD A,R1
MOV A,B
ADDC A,R4
MOV R4,A
CLR A
ADDC A,0xF1
MOV R7,A
MOV A,R5
JZ NFPML32_2
MOV B,A
MOV A,R3
MOV 0xF1,R2
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R7
MOV R7,A
CLR A
MOV R5,A
ADDC A,0xF1
MOV R6,A
RET
NFPML32_1: MOV R7,#0
NFPML32_2: MOV R6,#0
MOV R5,#0
RET
// 双DPTR + R4R5R6R7 ---> 双DPTR
NFPADD32: MOV A,DPL1
ADD A,R4
MOV DPL1,A
MOV A,DPH1
ADDC A,R7
MOV DPH1,A
MOV A,DPL
ADD A,R6
MOV DPL,A
MOV A,DPH
ADDC A,R5
MOV DPH,A
RET
END 中颖51快速浮点数乘除法通用返回处理程序FPRET.A51
$NOMOD51
NAME _FPRET
/**********************************************************************************************
* float R4R5R6R7 fpret(float R4R5R6R7, float R0R1R2R3);
* result = value1 *^/ value2
* R4R5R6R7 = R4R5R6R7 *^/ R0R1R2R3
* 32位*32位-->32位(4字节浮点数乘除法返回处理程序)
用 途 :中颖SH79/88/89F51系列MCU
作 者 :许意义
21ic ID :LAOXU
中颖论坛 : bbs.21ic.com
日 期 : 2011-09-29
**********************************************************************************************/
?PR?_FPRET?FPRET SEGMENT CODE
PUBLIC _FPRET_1
PUBLIC _FPRET_2
PUBLIC _FPRET_3
PUBLIC _FPRET_4
PUBLIC _FPRET_5
PUBLIC _FPRET_6
RSEG ?PR?_FPRET?FPRET
_FPRET_1: MOV A,R1
SETB ACC.7
XCH A,R1
RLC A
MOV A,R0
RLC A
MOV R0,A
MOV PSW.5,C
MOV A,R5
SETB ACC.7
XCH A,R5
RLC A
MOV A,R4
RLC A
MOV R4,A
JNC FPT_01
CPL PSW.5
FPT_01: RET
_FPRET_2: MOV A,R4
JNB ACC.7,_FPRET_3
INC R7
CJNE R7,#0x00,_FPRET_3
INC R6
CJNE R6,#0x00,_FPRET_3
INC R5
CJNE R5,#0x00,_FPRET_3
INC R3
MOV A,R3
JZ _FPRET_6
_FPRET_3: MOV C,PSW.5
MOV A,R3
RRC A
MOV R4,A
MOV A,R5
MOV ACC.7,C
MOV R5,A
RET
_FPRET_4: MOV A,#0xFF
FPT_02: MOV R4,A
MOV R5,A
FPT_03: MOV R6,A
MOV R7,A
RET
_FPRET_5: CLR A
SJMP FPT_02
_FPRET_6: MOV C,PSW.5
MOV A,#0xFF
RRC A
MOV R4,A
MOV R5,#0x80
CLR A
SJMP FPT_03
END
有时间了就钻研钻研 顶出水面 来顶,顶~顶! 顶个先 能不能介绍一下怎么设置和使用的,我添加后编译老是出错 关键这几点设置。
打包给个带工程的DEMO测试文件
extern uint16 imul(uint16 value1,uint16 value2); // 16位*16位-->16位(无符号二进制乘法)
extern uint16uidiv(uint32 value1,uint16 value2); // 16位/16位-->16位(无符号二进制除法)
extern uint32 lmul(uint32 value1,uint32 value2); // 32位*32位-->32位(无符号二进制乘法)
extern uint32uldiv(uint32 value1,uint32 value2); // 32位/32位-->32位(无符号二进制除法)
extern float fpmul(float value1, float value2); // 二进制浮点数快速乘法
extern float fpdiv(float value1, float value2); // 二进制浮点数快速除法
为什么这几个函数不能用? 不是这几个函数不能用,这几个函数和 Keil C51内部库函数重名,也就是说,只要在编译时加入 math_sh88f51.lib ,将自动替代原 Keil C51内部库函数,实现无缝嵌入,在实际使用中,你根本不需要管这些库函数的存在。
例如:inta,b,c;
floatx,y,z;
c = a * b / c;
z = x * y / z;
Keil C51将自动调用上述SH88F51专用库函数,替代原 Keil C51内部库函数,实现无缝嵌入。 噢 看来不会的还很多:L 友情提示:
假如你调用上述库函数,脱离SH88F51的真实运行环境,如用Keil C51软件仿真,或将程序装载到其他厂家的51单片机中运行,将出错,无法得到预期的结果~~~
本库只有在特定的环境中,即在SH88F51的硬件支持下,运行结果才会正确。