STM32中使用类“51”中的位bit做标志——节约资源之道
背景
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中的位操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?