#ifndef MACRO_FUNCTION #define MACRO_FUNCTION //这个头文件里定义了一些宏定义,方便使用 /********************************************************************************* * AssignBit / AssignFlag *说明: * 这个宏用来得到一个变量的某个或某几个位被赋值后的值 *参数: * type 参数flag的类型 * flag 要赋值的变量 * which_bit * 标明flag的哪几个位要被赋值 * val 表示要赋给flag的那几个位的值 *注意: * 1. 对于宏,其参数不要用++i;之类的表达式!也不要直接使用调用函数得到的返回值! * 2. 如果type是寄存器,那么它必须是可读的 *示例: * u8 a = 0xf0; * AssignBit(u8, a, BIT4 | BIT0, BIT0); * 执行完后,a == 0xe1; *备注: * 1. 效率上, 如果参数(除flag外)都是常量, 编译器会自动优化, 如果参数是变量, 就算手动写代码也是这个样子的 * 2. (which_bit) 括号是为了保证 AssignBit(flag, BIT0 | BIT1, 0)之类的用法不会出错 *********************************************************************************/ #define AssignBit(type ,flag , which_bit, val) \ ((((type)which_bit)&((type)val)) | ((flag)&(~((type)which_bit)))) #define AssignFlag AssignBit #define AssignB AssignBit /********************************************************************************* //说明: // 得到一个变量某几位位被置位后的值 //注意: // 1. 如果flag是寄存器,必须是可读的 *********************************************************************************/ #define SetBit(type, flag, which_bit) ((flag) | ((type)which_bit)) #define SetB SetBit //说明: // 清零位,flag变量中which_bit标明的位被清0 //注意: // 1. flag必须是可以正常读写的 #define ClearBit(type, flag, which_bit) ((flag) & (~((type)which_bit))) #define ClearB ClearBit //说明: // 检查flag中的某一位是否被置位, 如果被置位, 则宏的值为非0(不一定是1), 如果没有被置位, 则宏的值为0 //注意: // 1. flag必须是可以读的 #define CheckBit(type, flag, which_bit) ( (flag) & ((type)which_bit) ) #define BIT(x) (0x01L<<(x)) //说明: // 得到一个指定范围的BIT被置位的值 // BitFromTo(3, 0) 会得到 0x0f //备注: // 1. 这个宏是为提高可读性才写的,对于常数参数是表达式的,编译器会自动优化。 #define BitFromTo(h, l) ((h > l)? ((BIT(h) - BIT(l) + BIT(h))): (BIT(l) - BIT(h) + BIT(l)) ) #define BitF2 BitFromTo #define BitFT BitFromTo //这4个宏定义在很多地方用来作为参数, 提高代码的可读性 #define ON 1 //启动 #define OFF 0 //关闭 #define EN 1 //允许 #define DIS 0 //禁止 /************************************有关字符串************************************/ //说明: // 如果变量letter是一个小写字母,使用这个宏可以得到相应的大家字母(不会改变变量的值) #define GetUpper(letter) \ ((((letter) >= 'a') && ((letter) <= 'z')) ? ((letter) - 'a' + 'A') : (letter) ) /************************************有关字符串************************************/ #define mask(x) ( \ (((( 0x##x ) ) & 1 )<<0) | \ (((( 0x##x ) >>4 ) & 1 )<<1) | \ (((( 0x##x ) >>8 ) & 1 )<<2) | \ (((( 0x##x ) >>12 ) & 1 )<<3) | \ (((( 0x##x ) >>16 ) & 1 )<<4) | \ (((( 0x##x ) >>20 ) & 1 )<<5) | \ (((( 0x##x ) >>24 ) & 1 )<<6) | \ (((( 0x##x ) >>28 ) & 1 )<<7) \ ) /* #define PA0 0 mode ... <<0 #define GPIO_Config(port, bit, */ #endif