#include <stdio.h>
typedef unsigned char uint8_t;
uint8_t Door_Flag=0;//定义一个含有8位的标志buffer
#define Door_0_Setup Door_Flag= Door_Flag|0x01
#define Door_0_Reset Door_Flag= Door_Flag&0xFE
#define Door_1_Setup Door_Flag= Door_Flag|(0x01<<1)
#define Door_1_Reset Door_Flag= Door_Flag&0xFD
#define Door_2_Setup Door_Flag= Door_Flag|(0x01<<2)
#define Door_2_Reset Door_Flag= Door_Flag&0xFB
#define Door_3_Setup Door_Flag= Door_Flag|(0x01<<3)
#define Door_3_Reset Door_Flag= Door_Flag&0xF7
#define Door_4_Setup Door_Flag= Door_Flag|(0x01<<4)
#define Door_4_Reset Door_Flag= Door_Flag&0xEF
#define Door_5_Setup Door_Flag= Door_Flag|(0x01<<5)
#define Door_5_Reset Door_Flag= Door_Flag&0xDF
#define Door_6_Setup Door_Flag= Door_Flag|(0x01<<6)
#define Door_6_Reset Door_Flag= Door_Flag&0xBF
#define Door_7_Setup Door_Flag= Door_Flag|(0x01<<7)
#define Door_7_Reset Door_Flag= Door_Flag&0x7F
int Chack_Flag(uint8_t flag, int bit) {//标志位检查函数,bit范围0-7
if(flag & (1 << bit))
return 1;
else
return 0;
}
void main()
{
Door_0_Setup;
Door_1_Setup;
Door_2_Setup;
Door_3_Setup;
printf("Door_Flag = %x\n",Door_Flag);
Door_3_Reset;
printf("Door_Flag = %x\n", Door_Flag);
printf("FlagChack = %d\n", Chack_Flag(Door_Flag,0));
printf("FlagChack = %d\n", Chack_Flag(Door_Flag, 1));
printf("FlagChack = %d\n", Chack_Flag(Door_Flag, 2));
printf("FlagChack = %d\n", Chack_Flag(Door_Flag, 3));
printf("FlagChack = %d\n", Chack_Flag(Door_Flag, 4));
printf("FlagChack = %d\n", Chack_Flag(Door_Flag, 5));
printf("FlagChack = %d\n", Chack_Flag(Door_Flag, 6));
}
该程序运行结果
补充:最近我发现这么搞太麻烦了,换个标志位就要重新写那些宏定义,然后就稍微改进了一下可以使用下面这个函数直接修改,省去那么多宏定义的麻烦
//flag传入的标志位的地址(例如:&Door_Flag),bit要修改的位(0-7),num要修改的数值(0或者1)
void Flag_set(uint8_t * flag, uint8_t bit, uint8_t num) {
if (num == 1) {//setup bit
*flag = *flag | (0x01 << bit);
}
else//reset bit
{
*flag = *flag & ~(0x01 << bit);
}
}
补充:最近在遇到多个标志位的时候这么写还是十分麻烦,于是我就把这个拓展了一下。最大理论上可以无限位标志位,代码如下:
typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
uint8_t Discrete_input_register[160] = { 0 };//标志位举例,这里一共有160*8=1280个标志位
//标志位检查函数,bit范围0-7
static int Chack_Flag(uint8_t* flag, int bit) {
bit = 7 - bit;//这里是从左到右,位数由低到高
if (*flag & (1 << bit))
return 1;
else
return 0;
}
//flag传入的标志位的地址,bit要修改的位(0-7),num要修改的数值(0或者1)
static void Flag_set( uint8_t* flag, uint32_t bit, uint8_t num) {
bit = 7 - bit;//这里是从左到右,位数由低到高
if (num == 1) {//setup bit
*flag = *flag | (0x01 << bit);
}
else//reset bit
{
*flag = *flag & ~(0x01 << bit);
}
}
//检查寄存器某一位的值,flag寄存器的首地址(这里一般是检查Discrete_input_register)location要检查的位最大1280位
//列如:Discrete_register_FlagChack(Discrete_input_register, 20)
int Discrete_register_FlagChack(uint8_t* flag, int location) {
if (location < 0) return -1;
if (location > 1280) return -1;
return Chack_Flag(flag + location / 8, location % 8);
}
//设置寄存器的某一位num 写1为置1,0为0
//列如:Discrete_register_Set(Discrete_input_register,20,1);
void Discrete_register_Set(uint8_t* flag, uint32_t bit, uint8_t num) {
if (bit > 1280) return;
Flag_set(flag + bit / 8, bit % 8, num);
}