一些宏定义

一些宏定义

/************************************************************
Copyright (C), 2013-2021
FileName: my_type.h
Author  : 祥子  QQ:570525287
Version : 2.0
Date    : 2021-1-5
Description: 
Function List:
History    : 
<author> <time> <version > <desc>
2021.9.7 增加宏定义命令
2021.12.09 加入新的宏定义
***********************************************************/

#ifndef __MY_TYPE_H_
#define __MY_TYPE_H_

#define MCU_C51     0   //C51 单片机
#define MCU_ARM     1   //ARM 单片机

// typedef   bit     BOOL;
//#define 	FALSE   0      
//#define 	TRUE    !FALSE
//typedef enum {FALSE = 0, TRUE = !FALSE}BOOL;
#define BOOL BitStatus
//#define FALSE  RESET
//#define TRUE   SET

//--------------------数据类型-----------------------------------
#if(MCU_ARM) //32位单片机
typedef   signed           char s8;
typedef   signed short     int s16;
typedef   signed           int s32;
//typedef   signed       __INT64 s64;

typedef unsigned           char u8;
typedef unsigned short     int u16;
typedef unsigned           int u32;
//typedef unsigned       __INT64 u64;

typedef float     float32_t;  
#endif

//8位单片机
#if(MCU_C51)
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

typedef signed char s8;
typedef signed int s16;
typedef signed long s32;
#endif

//--------------------字节操作-----------------------------------
#define GetHigByte(X)   ((u8)((X)>>8)) //取高8位
#define GetLowByte(X)   ((u8)(X))	//取低8位

#define Get_HB(X)       ((u8)((X)>>8)) //取高8位
#define Get_LB(X)       ((u8)(X))	    //取低8位

#define MakeToInt(HBYTE,LBYTE)	(((u16)(HBYTE) << 8) | (LBYTE)) //将两个字节合并成字
#define Make_u16(HBYTE,LBYTE)	(((u16)(HBYTE) << 8) | (LBYTE)) //将两个字节合并成字
#define Make_u32(HH,HM,ML,LL)   ((u32)(HH)<<24|(u32)(HM)<<16|(u32)(ML)<<8|LL)//4个字节合并成双字

#define ToChar(X)	((u8)(X))		//转到字节
#define ToInt(X)	((u16)(X))
#define To_u8(X)	((u8)(X))		//转到字节
#define To_u6(X)	((u16)(X))
#define To_u32(X)   ((u32)(X))      //

//-------------------地址访问-----------------------------------
#define MEM_u8(ADDR)           (*((u8 *)(ADDR)))    //得到指定地址上的一个字节
#define MEM_u16(ADDR)          (*((u16 *)(ADDR)))    //得到指定地址上的一个字
#define MEM_u32(ADDR)          (*((u32 *)(ADDR)))    //得到指定地址上的一个双字

#define PTR_u8(var)             ((u8*)(void *)&(var))   //得到一个变量的地址(u8宽度)
#define PTR_u16(var)            ((u16*)(void *)&(var))   //得到一个变量的地址(u16宽度)
#define PTR_u32(var)            ((u32*)(void *)&(var))   //得到一个变量的地址(u32宽度)

//-----------------------位操作-----------------------------------
#define SETBIT(X)           (0x01 << (X)) //
#define BIT8(X)             (0x01 << (X)) //
#define BIT16(X)            (0x0001 << (X)) //
#define BIT32(X)            (0x00000001 << (X))//

#define BIT8_SET(DAT,N)         DAT|=(0x01<<(N))    //置位第N位
#define BIT16_SET(DAT,N)        DAT|=(0x0001<<(N))
#define BIT32_SET(DAT,N)        DAT|=(0x00000001<<(N))
#define BIT8_CLR(DAT,N)         DAT&=~(0x01<<(N))   //清除第N位
#define BIT16_CLR(DAT,N)        DAT&=~(0x0001<<(N))
#define BIT32_CLR(DAT,N)        DAT&=~(0x00000001<<(N))

//-------------------------------------------------------------
//#define SEND_OS_MSG(X)	(X)=TRUE	//发送信号
//#define CLEAR_OS_MSG(X)	(X)=FALSE	//清除信号

//----------------------数组操作--------------------------------
#define ARR_Member(arr)             (sizeof(arr) / sizeof((arr[0])))//计算数组内的成员个数
#define ARR_FILL(arr,n)             {u16 i=sizeof(arr);while(i--){arr[i]=n;}}    //用n填充数组

//----------------------结构体操作------------------------------
#define STRUCT_FPOS(TYPE,FIELD)   ((u32)&((TYPE*)0)->FIELD)   //得到一个field在结构体(struct)中的偏移量
#define STRUCT_FSIZE(TYPE,FIELD)    sizeof(((TYPE*)0)->FIELD)   //得到一个结构体中field所占用的字节数

//----------------------数值操作---------------------------------
#define MAX(A,B)    ((A)>(B)?(A):(B)) //比较两个数的大小,返回最大的数 
#define MIN(A,B)    ((A)<(B)?(A):(B)) //比较两个数的大小,返回最小的数   

#define INC_SAT(num)     (num=((num)+1>(num))?(num)+1:(num))   //数值加1并防止溢出  
#define DEC_SAT(num)     (num=((num)-1<(num))?(num)-1:(num))   //数值减1并防止溢出
#define INC_LOOP(num,max,min)   ((num)=((num)+1>(max))?(min):(num)+1)   //数值加1,若大于max,则回到min
#define DEC_LOOP(num,max,min)   ((num)=((num)>(min))?(num)-1:(max))

#define SWAP(A,B,TYPE);        {TYPE T;T=A;A=B;B=T;}//交换两个数,TYPE是数据类型,例如u8, char...


//----------------------兼容保留-----------------------------------
#define MT_NumOfArray(X)        (sizeof(X)/sizeof(*(X)))  //计算数组内的成员个数
#define MT_MAX(X,Y)             ((X)>(Y)?(X):(Y)) //比较两个数的大小
#define MT_MakeU16(H,L)           ((u16)(H)<<8 | L)   //合并成16位数
#define MT_MakeU32(HH,HM,ML,LL)   ((u32)(HH)<<24|(u32)(HM)<<16|(u32)(ML)<<8|LL)//4个字节合并成双字
#define MT_BIT(N)                 (0x01<<N)//第N位置1
#define MT_SWAP(A,B,TYPE);        {TYPE T;T=A;A=B;B=T;}//交换两个数,TYPE是数据类型,例如u8, char...
//示例: MT_SWAP(a,b,u8);

//--------------------#的用法-------------------
//1.替换空格

/*---------------常用预定义的宏-----------------------------
__FILE__:当前源代码文件名的字符串文字
__LINE__:当前源代码中的行号的整数常量
__DATE__:进行预处理的日期(“Mmm dd yyyy”形式的字符串文字)
__TIME__:源文件编译时间,格式为“hh:mm:ss”
__func__:当前所在函数名,在C++中为__FUNCTION__
_STDC_

__VA_ARGS__:变长参数操作,即可以接受不定个数的参数,如:
#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
使用:debug ("a test string is printed out along with %x %x %x\n", 12, 14, 20);

*/
#endif 
//----------------END OF FILE--------------------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值