最后更新~~~
本《中颖MCU专用8-32位混合运算》库,增加了若干非常实用的,无符号、有符号定点多字节乘法、除法子程序库,还有一个特色就是,增加了无符号、有符号定点多字节除法同时取商和余数子程序库,对同时需要用到这两个参数的场合,极大地提高了运行速度,使用时只需在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
作 者 :许意义
21ic ID :LAOXU
中颖论坛 : bbs.21ic.com
****************************************************************************************/
#ifndef _GLOBAL_H
#define _GLOBAL_H
#pragma MODDP2 // 打开中颖单片机双DPTR功能,加速数据传送
//#pragma NOMODDP2 // 关闭中颖单片机双DPTR功能
/*--------------------------------------------------------------------------------------*/
/* Resource - math.asm */
/*--------------------------------------------------------------------------------------*/
extern uint8 ascii_hex(uint8 value1); // 1位 ASCII --> 1位 HEX(低半字节)
extern uint8 hex_ascii(uint8 value1); // 1位 HEX(低半字节)--> 1位 ASCII
extern uint8 bcd8_hex(uint8 value1); // 8位 BCD --> 8位 HEX
extern uint16 bcd16_hex(uint16 value1); // 16位 BCD -->16位 HEX
extern uint32 bcd32_hex(uint32 value1); // 32位 BCD -->32位 HEX
extern uint16 hex8_bcd(uint8 value1); // 8位 HEX -->16位 BCD
extern uint32 hex16_bcd(uint16 value1); // 16位 HEX -->32位 BCD
extern uint32 hex32_bcd(uint32 value1); // 32位 HEX -->32位 BCD
extern uint32 mul16_8(uint16 value1,uint8 value2); // 16位* 8位-->32位(无符号二进制乘法)
extern uint32 mul16(uint16 value1,uint16 value2); // 16位*16位-->32位(无符号二进制乘法)
extern uint32 mul32_8(uint32 value1,uint8 value2); // 32位* 8位-->32位(无符号二进制乘法)
extern uint32 mul32_16(uint32 value1,uint16 value2); // 32位*16位-->32位(无符号二进制乘法)
extern uint32 mul32(uint32 value1,uint32 value2); // 32位*32位-->32位(无符号二进制乘法)
extern uint16 div16_8(uint16 value1,uint8 value2); // 16位/ 8位-->16位(无符号二进制除法)
extern uint16 div16(uint16 value1,uint16 value2); // 16位/16位-->16位(无符号二进制除法)
extern uint32 div32_8(uint32 value1,uint8 value2); // 32位/ 8位-->32位(无符号二进制除法)
extern uint32 div32_16(uint32 value1,uint16 value2); // 32位/16位-->32位(无符号二进制除法)
extern uint32 div32(uint32 value1,uint32 value2); // 32位/32位-->32位(无符号二进制除法)
extern uint8 mod16_8(uint16 value1,uint8 value2); // 16位% 8位--> 8位(无符号二进制取余数)
extern uint16 mod16(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 uint16 div16_8m(uint16 value1,uint8 value2,uint8 data *p); // 16位/ 8位-->16位(无符号二进制除法及取余数,8位余数存*p)
extern uint16 div16m(uint16 value1,uint16 value2,uint16 data *p); // 16位/16位-->16位(无符号二进制除法及取余数,16位余数存*p)
extern uint32 div32_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)
extern int32 smul16_8(int16 value1,int8 value2); // 16位* 8位-->32位(有符号二进制补码乘法)
extern int32 smul16(int16 value1,int16 value2); // 16位*16位-->32位(有符号二进制补码乘法)
extern int32 smul32_8(int32 value1,int8 value2); // 32位* 8位-->32位(有符号二进制补码乘法)
extern int32 smul32_16(int32 value1,int16 value2); // 32位*16位-->32位(有符号二进制补码乘法)
extern int32 smul32(int32 value1,int32 value2); // 32位*32位-->32位(有符号二进制补码乘法)
extern int16 sdiv16_8(int16 value1,int8 value2); // 16位/ 8位-->16位(有符号二进制补码除法)
extern int16 sdiv16(int16 value1,int16 value2); // 16位/16位-->16位(有符号二进制补码除法)
extern int32 sdiv32_8(int32 value1, int8 value2); // 32位* 8位-->32位(有符号二进制补码乘法)
extern int32 sdiv32_16(int32 value1,int16 value2); // 32位/16位-->32位(有符号二进制补码除法)
extern int32 sdiv32(int32 value1,int32 value2); // 32位/32位-->32位(有符号二进制补码除法)
extern int8 smod16_8(int16 value1,int8 value2); // 16位% 8位--> 8位(有符号二进制补码取余数)
extern int16 smod16(int16 value1,int16 value2); // 16位%16位-->16位(有符号二进制补码取余数)
extern int8 smod32_8(int32 value1,int8 value2); // 32位% 8位--> 8位(有符号二进制补码取余数)
extern int16 smod32_16(int32 value1,int16 value2); // 32位%16位-->16位(有符号二进制补码取余数)
extern int32 smod32(int32 value1,int32 value2); // 32位%32位-->32位(有符号二进制补码取余数)
extern int16 sdiv16_8m(int16 value1,int8 value2,int8 data *p); // 16位/ 8位-->16位(有符号二进制除法及取余数,8位余数存*p)
extern int16 sdiv16m(int16 value1,int16 value2,int16 data *p); // 16位/16位-->16位(有符号二进制除法及取余数,16位余数存*p)
extern int32 sdiv32_8m(int32 value1,int8 value2,int8 data *p); // 32位/ 8位--> 8位(有符号二进制除法及取余数,8位余数存*p)
extern int32 sdiv32_16m(int32 value1,int16 value2,int16 data *p); // 32位/16位-->16位(有符号二进制除法及取余数,16位余数存*p)
extern int32 sdiv32m(int32 value1,int32 value2,int32 data *p); // 32位/32位-->32位(有符号二进制除法及取余数,32位余数存*p)
extern void ld_pdata(int8 addr1, int8 addr2, int8 len); // @PDATA --> @IDATA(len字节PDATA读入片内IDATA RAM)
extern void st_pdata(int8 addr1, int8 addr2, int8 len); // @IDATA --> @PDATA(len字节片内IDATA RAM存入PDATA)
/* 中颖单片机C51定点库内部调用函数
extern int32 st_r03_r47(void); // R0R1R2R3 ---> R4R5R6R7
extern int16 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 uint16 uidiv(uint32 value1,uint16 value2); // 16位/16位-->16位(无符号二进制除法)
extern uint32 lmul(uint32 value1,uint32 value2); // 32位*32位-->32位(无符号二进制乘法)
extern uint32 uldiv(uint32 value1,uint32 value2); // 32位/32位-->32位(无符号二进制除法)
extern float fpmul(float value1, float value2); // 二进制浮点数快速乘法
extern float fpdiv(float value1, float value2); // 二进制浮点数快速除法
*/
#endif |