首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在编写codevisionavr代码时发现了一些不清楚的地方

在编写codevisionavr代码时发现了一些不清楚的地方
EN

Stack Overflow用户
提问于 2017-09-08 22:14:25
回答 1查看 112关注 0票数 0

我得到了一个代码示例,它是这样的:

代码语言:javascript
复制
DDRA = (1<<DDA7) |  (1<<DDA6) |  (1<<DDA5) |  (1<<DDA4) |  
   (1<<DDA3) |  (1<<DDA2) |  (1<<DDA1) |  (1<<DDA0);

这段代码是什么意思?DDA的功能是什么?“<<”是位的吗?

EN

回答 1

Stack Overflow用户

发布于 2017-09-08 22:25:53

常量DDA0等是指DDRA寄存器中的位位置。该寄存器确定端口A上的八个引脚中的哪些是输入,哪些是输出。位位置中的1表示输出引脚,0 (默认值)表示它是输入引脚。

代码语言:javascript
复制
(1 << DDA0)

DDA0定义为0意味着“将该寄存器向左移位0个位置后,将1放入该寄存器”。所以,是的,按位运算符。换句话说,将最低有效位设为1,其他位将1向左移动不同的位置,如2、4、8等等。

该语句的最终结果是所有位位置一起输出,结果值为11111111或0xFF,这意味着整个端口端口都被设置为ORed。

值得注意的是,可以通过简单地使用以下语句来简化整个语句:

代码语言:javascript
复制
DDRA = 0xFF;

即使这样更短,也不会有代码大小的损失,因为编译器无论如何都会将右侧的长表达式折叠为0xFF。在探索更多内容时,您将看到这两种风格的编程端口。

从ATmega文档中:

配置引脚的

每个端口引脚由三个寄存器位组成: DDxn、PORTxn和PINxn。如寄存器说明所示,DDxn位在DDRx I/O地址访问,PORTxn位在PORTx I/O地址访问,PINxn位在PINx I/O地址访问。

DDRx寄存器中的DDxn位选择该引脚的方向。如果将DDxn写入'1',则将Pxn配置为输出引脚。如果DDxn写入'0',则Pxn被配置为输入引脚。

当引脚配置为输入引脚时,如果PORTxn写入'1‘,则上拉电阻器被激活。要关闭上拉电阻,必须将PORTxn写入'0‘或将引脚配置为输出引脚。当复位条件变为有效时,端口引脚处于三态状态,即使没有时钟在运行。

当引脚配置为输出引脚时,如果PORTxn写入'1‘,则端口引脚被驱动为高电平。当引脚配置为输出引脚时,如果PORTxn写入逻辑0,则端口引脚被驱动为低电平。

将引脚写入'1‘到PINxn将切换PORTxn的值,这与DDRxn的值无关。SBI指令可用于切换端口中的单个位。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46118524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档