在编写codevisionavr代码时发现了一些不清楚的东西

时间:2017-09-08 14:14:25

标签: bitwise-operators avr atmega codevisionavr

我有一个代码示例,上面写着:

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

该代码的含义是什么? DDA的功能是什么?并且“&lt;&lt;”是一个按位?

1 个答案:

答案 0 :(得分:1)

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

(1 << DDA0)

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

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

值得注意的是,只需使用以下内容即可简化整个声明:

DDRA = 0xFF;

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

来自ATmega文档:

  

配置Pin   每个端口引脚由三个寄存器位组成:DDxn,PORTxn和PINxn。如寄存器描述所示,DDxn位在DDRx I / O地址,PORTx I / O地址的PORTxn位和PINx I / O地址的PINxn位进行访问。

     

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

     

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

     

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

     

切换Pin   向PINxn写入'1'可切换PORTxn的值,与DDRxn的值无关。 SBI指令可用于在端口中切换一个位。