前提:
-
最近由于项目中用了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
看看编译的结果:
结论:
可以看到预测的结果和实际输出的结果完全一致,大家如果有需要这样的功能的话,上面的代码可以放心使用。