这种代码在嵌入式系统编程时非常常见,尽管您需要查看头文件和 AVR 文档以了解这些特定标识符的含义。请注意,如果您是新手,它可能会非常复杂,您需要了解如何使用原始二进制和 C 风格的位移/运算符。(如果您需要了解更多相关信息,网上有很多教程。)
不过,我将尝试解释基本原理。
您看到的所有标识符都是预处理器常量(即#define ...
),而不是变量。DDRD
并将TCCR2
指定内存位置。这些位置将映射到某些功能,因此在这些位置设置或清除某些位将改变设备的行为(例如启用时钟分频器,或将 GPIO 引脚设置为高或低等)。
PD7
, WGM21
, WGM20
, COM20
, 和CS20
都是相当小的数字。它们指定您需要将某些位模式偏移多远才能获得某些结果。按位运算符(例如|
和&
)和位移运算符(通常<<
)用于创建写入内存位置的模式。该文档将告诉您要使用哪些模式。
我将使用一个简单的虚构示例来说明这一点。假设有一个寄存器控制一些输出引脚的值。我们将调用寄存器 OUTPUT1。通常,每个位将对应于特定引脚的值。打开引脚 4(但不理会其他引脚)可能如下所示:
OUTPUT1 |= (1 << PIN4);
这个按位或是现有寄存器与打开引脚 4 的模式。再次关闭该引脚可能如下所示:
OUTPUT1 &= ~(1 << PIN4);
这个按位与是现有寄存器,除了打开引脚 4 的模式(这导致清除该位)之外的所有内容。虽然这是一个完全虚构的例子,所以不要实际尝试!
对于许多不同的系统,原理基本相同,所以一旦你在 AVR 上学会了它,你也希望能够适应其他设备。