/***************************************** 1.不用临时变量交换变量值 设交换a、b两个变量的值 *****************************************/ //方法一: a = a ^ b; b = a ^ b; a = a ^ b; //原理 : //New_b = a ^ b ^ b = a ^ 0 = a; //New_a = a ^ b ^ a = a ^ a ^ b = 0 ^ b = b; //方法二 : a = a + b; b = a - b; a = a - b; /***************************************** 2.使用位域定义位变量 优点: 按位定义全局标志变量,减少空间占用率 *****************************************/ typedef union { unsigned char BYTE; //可以按字节寻址 struct { unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1; }BIT; }BITFIELD; #define GET_FIELD(v) ( *((volatile BITFIELD *) (&v)) ) //强制转换 #define BIT(v,b) ( GET_FIELD(v).BIT.bit##b ) //例: unsigned char flag0; #define A_Flag BIT(flag0,0) //flag0的第0位 #define B_Flag BIT(flag0,1) //flag0的第1位 #define C_Flag BIT(flag0,2) //flag0的第2位 #define D_Flag BIT(flag0,3) //flag0的第3位 #define E_Flag BIT(flag0,4) //flag0的第4位 #define F_Flag BIT(flag0,5) //flag0的第5位 #define G_Flag BIT(flag0,6) //flag0的第6位 #define H_Flag BIT(flag0,7) //flag0的第7位 /***************************************** 3.STM8 EERPOM存储变量的定义 优点: 不用每次定义新变量时都需要写地址 *****************************************/ /* 建立头文件"eeprom.h"如下 */ #define SIZE_OF_EEPROM 128 //EEPROM大小 #define EEP_ADDR 0x004000ul //EEPROM数据存储的首地址 #pragma pack(1) typedef volatile struct { vu8 eep_calibration; //校准,0x5A:表示LUX已校对过,产品第一次开机时校对。 vu8 eep_Init_Vol; //起始电压 vu8 eep_Vol_Slope; //电压倍率 vu16 eep_onlux; //... } EEP_Data_TypeDef; #pragma pack() //防止数据定义出错 #if sizeof(EEP_Data_TypeDef) > SIZE_OF_EEPROM #error "EEP_Data_Type的大小已超过该芯片的EEPROM大小!" #endif //声明 extern EEP_Data_TypeDef *EEP_Data; /* 建立源文件"eeprom.C"如下 */ EEP_Data_TypeDef *EEP_Data = ((EEP_Data_TypeDef *) (EEP_ADDR)); /***************************************** 4. *****************************************/