1

下面的代码用于对微控制器进行编程。我想知道下面的代码在做什么。我知道'|' 是 OR 和 '&' AND 但整行在做什么?

lcd_port = (((dat >> 4) & 0x0F)|LCD_EN|LCD_RS);
4

5 回答 5

3

由于我们不知道dat包含什么内容,因此很难将其置于上下文中,但我们可以看到:

  1. 例如,数据右移 4 位,因此11111111变为00001111
  2. 该值与 0x0F 进行“与”运算。这是删除不需要的位的常用技巧,因为b & 1 = 1b & 0 = 0. 将您的数字视为一系列位,这是一个 2 字节的示例:

    0011010100111010

    &

    0000000000001111


    00000000000001010

  3. 现在LCD_ENandLCD_RS标志是 OR'ed。同样,这是一个常见的二进制技巧,因为b | 1 = 1and b | 0 = b,所以您可以添加标志但不能删除它们。所以,如果说LCD_EN = 0x01and LCD_RS = 0x02

    00000000000001010

    |

    0000000000000011


    0000000000001011

希望这对你来说更清楚。

于 2013-04-01T19:05:24.013 回答
1

一些猜测,因为您可能需要找到芯片数据表来确认这一点:-

lcd_port可能是一个直接映射到一块内存映射硬件的变量——可能是一个字母数字 LCD 显示器。

显示器可能将数据作为四位“半字节”(因此移位/和操作),端口的高四位是控制信号。

LCD_EN可能是 LCD ENABLE 的缩写——端口上使用的控制线。

LCD_RS可能是 LCD READ STROBE(或 LCD REGISTER SELECT)的缩写 - 端口上使用的另一条控制线。在写入端口时设置这些位可能会告诉端口要执行的操作类型。

如果使用的硬件是日立 HD44780或其他衍生产品,我一点也不感到惊讶。

于 2013-04-01T19:03:37.243 回答
0

它似乎在 lcd_port 上设置了一些数据和标志。第一部分将掩码 0x0F 应用于 (dat >> 4)(将 dat 右移 4),然后应用 LCD_EN 标志和 LCD_RS 标志。

于 2013-04-01T18:58:09.083 回答
0

它将变量data向右移动四位,然后用值 15 屏蔽该值。这导致值范围为 0-15(最左边的四位)。这个结果是带有LCD_ENandLCD_RS标志的二进制 ORd。

于 2013-04-01T18:59:12.587 回答
0

此代码将 dat 的位向右移动 4 位,然后使用 & 0x0F 确保它仅获得这 4 个最低有效位。然后它使用 OR 来查找该值或 LCD_EN 或 LCD_RS 中存在哪些位,并将该值分配给 lcd_port。

于 2013-04-01T19:01:33.307 回答