标题:学过单片机C语言的人可以解释一下吗?
只看楼主
大海2020
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2020-5-30
结帖率:0
已结贴  问题点数:5 回复次数:3 
学过单片机C语言的人可以解释一下吗?
(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)))
搜索更多相关主题的帖子: REG 单片机 C语言 define BIT 
2020-05-30 11:01
JabinZ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:34
专家分:180
注 册:2020-5-7
得分:2 
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编辑过]

2020-05-30 20:41
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:2 
这里的两个主要知识点是预处理和位运算,都不依赖于单片机,当然单片机代码常喜欢这么写。
预处理是编译前处理,#define是稍灵活一点的字符串替换,到正式编译的时候它就功成身退了,消失了。因此不担心没赋值什么的。
位运算么,用位与置零,用位或置一,正是位运算的常规用法。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-05-30 22:39
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:2 
(2)估计目的是修改寄存器的值,这个值跟屏蔽位、还跟一个SETMASK有关(为啥要设计这个东东?读寄存器本来就是个变量了,照理屏蔽位应该算已知),最后再把计算结果写入寄存器

梦想拥有一台龙芯3A-4000
2020-05-31 12:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501871-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.318170 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved