| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1930 人关注过本帖
标题:学过单片机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: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1685
专家分:4252
注 册: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
快速回复:学过单片机C语言的人可以解释一下吗?
数据加载中...
 
   



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

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