C语言如何让一个变量存储多个不同的状态

本文介绍了如何在资源有限的单片机环境中,通过使用一个u32变量代替32个u8数组来存储32个外部按钮的状态。通过编写Bit32Data_Insert和lookValueOfOneBit函数,实现了对每一位的设置和查询。通过代码实例展示了该方法的正确性和效率,节省了宝贵的RAM资源。
摘要由CSDN通过智能技术生成

前提:

  • 最近由于项目中用了4个芯片74HC165芯片(8路输入),构成一个32个输入按钮,因此在单片机中需要定义变量来保存这32个外部按钮输入的状态。

  • 按照以往,我可能会定义32个u8类型的数组,来保存每一个按钮的状态,这样会用掉32个字节。但是在单片机中RAM这么宝贵的资源,保持着能省一点是一点的原则,我想用一个u32变量(4个字节),表示每一个按钮的状态,还得保证按钮状态的存储和查询的方便性。

  • OK,废话不多说直接上代码

#include "stdio.h"

typedef  unsigned          char uint8_t;
typedef unsigned           int uint32_t;

//定义一个 u32类型的全局变量,并初始化
uint32_t g_bit32 = 0x00 ;

/* 函数Bit32Data_Insert 在u32变量的某一位置0,或置1
参数说明 :
bit32           :u32操作对象
insert_value    : 插入的值
insert_position : 插入的位置
*/
void Bit32Data_Insert( uint32_t* bit32 , uint8_t insert_value ,uint8_t insert_position ) ;

/* 函数lookValueOfOneBit 查看u32变量某一位的值
参数说明 :
bit32           : u32操作对象
look_position   : 查看的位置
*/
int lookValueOfOneBit( const uint32_t* bit32 ,uint8_t look_position ) ;

int main()
{
    //               操作对象  赋值 位置
	Bit32Data_Insert(&g_bit32 , 1 , 0);
	Bit32Data_Insert(&g_bit32 , 1 , 1);
	Bit32Data_Insert(&g_bit32 , 1 , 31);
	
	//查看u32变量的某一个的值	
	printf("0 bit = %d\r\n",lookValueOfOneBit(&g_bit32,0));
	printf("1 bit = %d\r\n",lookValueOfOneBit(&g_bit32,1));
	printf("2 bit= %d\r\n",lookValueOfOneBit(&g_bit32,2));
	
	printf("30 bit = %d\r\n",lookValueOfOneBit(&g_bit32,30));
	printf("31 bit = %d\r\n",lookValueOfOneBit(&g_bit32,31));
	
	return 0 ;
} 

void Bit32Data_Insert( uint32_t* bit32 , uint8_t insert_value ,uint8_t insert_position )
{
	uint8_t value ;  // 插入的值,0,或者 1
	uint8_t position = insert_position ;
	
	if( insert_position >= 32 ){ // 防越界
	return ;
	}
	
	if( insert_value ){ 
		value = 1 ;
	}else{
		value = 0 ;
	}
	
	if( value ) (*bit32) |=  0x00000001<< position ;
	else (*bit32) &=  ~( 0x00000001<< position ) ;
	
	// 打印一下u32变量的值 , 观察是否改变
	printf("bit32 = %x \r\n",*bit32);

}

int lookValueOfOneBit( const uint32_t* bit32 ,uint8_t look_position )
{
	uint8_t position = look_position ;
	uint32_t data = *bit32 ;
	if( look_position >= 32 ){ // 防越界
	return -1;
	}
	
	if( data & (0x00000001<< look_position) ){
		return 1 ;  // 当前bit(位) 为 1
	}
	return 0 ;  // 当前bit(位) 为 0
}


预测结果:
当程序执行到下面三行时

 //               操作对象  赋值 位置
	Bit32Data_Insert(&g_bit32 , 1 , 0);
	Bit32Data_Insert(&g_bit32 , 1 , 1);
	Bit32Data_Insert(&g_bit32 , 1 , 31);
  • 应该会输出:

bit32 = 1 // ( 00000000 00000000 00000000 00000001 )
bit32 = 3 // ( 00000000 00000000 00000000 00000011 )
bit32 = 80000003 // ( 10000000 00000000 00000000 00000011 )

运行到接下来这5行时:

//查看u32变量的某一个的值	
printf("0 bit = %d\r\n",lookValueOfOneBit(&g_bit32,0));
printf("1 bit = %d\r\n",lookValueOfOneBit(&g_bit32,1));
printf("2 bit= %d\r\n",lookValueOfOneBit(&g_bit32,2));

printf("30 bit = %d\r\n",lookValueOfOneBit(&g_bit32,30));
printf("31 bit = %d\r\n",lookValueOfOneBit(&g_bit32,31));
  • 应该会输出:

0 bit = 1
1 bit = 1
2 bit = 0
30 bit = 0
31 bit = 1

看看编译的结果:
在这里插入图片描述
结论:
可以看到预测的结果和实际输出的结果完全一致,大家如果有需要这样的功能的话,上面的代码可以放心使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值