注册 登录
编程论坛 C语言论坛

学过单片机C语言的人可以解释一下吗?

大海2020 发布于 2020-05-30 11:01, 2342 次点击
(1)
初学C单片机,下句是给寄存器REG置位对吧,但是BIT没有赋初值,有点不理解,至少BIT=0x01,或者BIT=0x02才可以吧。
#define SET_BIT(REG, BIT)     ((REG) |= (BIT))

(2)下面这句更难,完全看不懂,谁能解释一下。
#define MODIFY_REG(REG, CLEARMASK, SETMASK)  WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))
3 回复
#2
JabinZ2020-05-30 20:41
define 是定义宏, 这里的 REG,BIT 都只是一个标志符号(这里我也不好说具体叫什么。我就按标志符号这么说了),不是变量,所以没有赋值一说


你在使用时是 SET_BIT(xx, yy) , 但是在预处理过后,SET_BIT() 就会被替换为 ((xx) |= (yy))
第二句也是一样
程序代码:

int a = 1;
int b = 0;
SET_BIT(a, b);
// 预处理过后, 就会变成下面的代码
int a = 1;
int b = 0;
((a) |= (b));


用 gcc 的 -E 命令就可以将文件预处理

[此贴子已经被作者于2020-5-30 20:44编辑过]

#3
forever742020-05-30 22:39
这里的两个主要知识点是预处理和位运算,都不依赖于单片机,当然单片机代码常喜欢这么写。
预处理是编译前处理,#define是稍灵活一点的字符串替换,到正式编译的时候它就功成身退了,消失了。因此不担心没赋值什么的。
位运算么,用位与置零,用位或置一,正是位运算的常规用法。
#4
ditg2020-05-31 12:40
(2)估计目的是修改寄存器的值,这个值跟屏蔽位、还跟一个SETMASK有关(为啥要设计这个东东?读寄存器本来就是个变量了,照理屏蔽位应该算已知),最后再把计算结果写入寄存器
1