STM32中使用类“51”中的位bit做标志——节约资源之道

21 篇文章 0 订阅

背景

1:用习惯了51的位bit,像二进制信号量一样只有0和1两种状态,我认为这两种状态还是利用得最为广泛的两种状态,就比如说WIFI的连接状态 -1已经连接 -0 未连接,控制信号开关 0-关闭 1-开启。而我在LCD屏幕刷新时,需要记录变量是否改变再刷新,做判断的时间总比做刷新的时间短的多!甚至这种简单的判断所消耗的时间可以忽略不及。当然对LCD来说,若是追求快速刷新,流畅的玩家完全可以用LCD+DMA的方式做硬件加速。

2:早些接触时就念念不忘51里的bit,接触32因为其资源丰富我也不也怎么管,变量,全局变量使劲造就完事了。32里最小数据类型为8位。

3:为保持勤俭节约的中华民族的美德,于是就有了本篇文章,以此不忘那曾资源紧张的岁月。

原理

原理实际上很简单,用C中位加宏的方式就能实现。

关键代码

 //从0开始 0-15位
 typedef unsigned short u16;
 u16 flag = 0x0000;  //造个变量做拆分
#define LCD_SET(X) flag|=1<<X  
#define LCD_RESET(X) flag&=~(1<<X)
#define LCD_GetBit(X) (flag&(1<<X))>>X //得到某一位为1还是0

#define WIFICONNECT  LCD_SET(7)
#define WIFIDISCONNECT  LCD_RESET(7)
#define WIFISTATE    LCD_GetBit(7)

所有测试代码:

 //从0开始 0-15位
 typedef unsigned short u16;
 u16 flag = 0x0000;
#define LCD_SET(X) flag|=1<<X  
#define LCD_RESET(X) flag&=~(1<<X)
#define LCD_GetBit(X) (flag&(1<<X))>>X //得到某一位为1还是0

#define WIFICONNECT  LCD_SET(7)
#define WIFIDISCONNECT  LCD_RESET(7)
#define WIFISTATE    LCD_GetBit(7)

 
int main() {
    LCD_SET(1);
    printf("%d\r\n", flag);
    LCD_RESET(1);
    printf("%d\r\n", flag);
    LCD_SET(2);
    printf("%d\r\n", flag);
    LCD_SET(1);
    printf("%d\r\n", flag);
    LCD_SET(3);
    printf("%d\r\n", flag);
    LCD_SET(4);
    printf("%d\r\n", flag);


    printf("打印相应的位");
    printf("%d\r\n", LCD_GetBit(1));

    printf("打印相应的位");
    printf("%d\r\n", LCD_GetBit(2));
    printf("打印相应的位");
    printf("%d\r\n", LCD_GetBit(3));


    printf("打印相应的位");
    LCD_RESET(2);
    printf("%d\r\n", LCD_GetBit(2));
    printf("打印相应的位");
    LCD_RESET(3);
    printf("%d\r\n", LCD_GetBit(3));

    LCD_SET(8);
    if (LCD_GetBit(8) == 1) printf("yes\r\n");

    WIFICONNECT;
    printf("WIFI STATE %d\r\n", WIFISTATE);
    WIFIDISCONNECT;
    printf("WIFI STATE %d\r\n", WIFISTATE);

}

省,实在是省,一个16位的数据拆分为16个二值flag(0和1) ,这是我本篇文章中所说的类51中的位操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值