我有一个代码示例,它是这样说的:
DDRA = (1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) |
(1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0);
那个代码是什么意思?的作用是DDA
什么?“<<”是按位吗?
我有一个代码示例,它是这样说的:
DDRA = (1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) |
(1<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0);
那个代码是什么意思?的作用是DDA
什么?“<<”是按位吗?
常数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 指令可用于切换端口中的单个位。