0

我有一个代码示例,它是这样说的:

DDRA = (1<<DDA7) |  (1<<DDA6) |  (1<<DDA5) |  (1<<DDA4) |  
   (1<<DDA3) |  (1<<DDA2) |  (1<<DDA1) |  (1<<DDA0);

那个代码是什么意思?的作用是DDA什么?“<<”是按位吗?

4

1 回答 1

1

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

(1 << DDA0)

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

这条语句的最终结果是所有位位置都进行了或运算,得到的值为 11111111 或 0xFF,这意味着将整个 PORTA 端口设置为输出。

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

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 写入逻辑零,则端口引脚被驱动为低电平。

切换引脚 向 PINxn 写入“1”会切换 PORTxn 的值,与 DDRxn 的值无关。SBI 指令可用于切换端口中的单个位。

于 2017-09-08T14:25:52.633 回答