【学习记录】标志位的一些使用方法(备忘)

#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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值