以下代码用于编程微控制器。我想知道下面的代码是做什么的。我知道'|'是OR和'&'但是整条生产线在做什么?
lcd_port = (((dat >> 4) & 0x0F)|LCD_EN|LCD_RS);
答案 0 :(得分:3)
由于我们不知道dat
包含哪些内容,因此很难进入上下文,但我们可以看到:
11111111
变为00001111
。该值与0x0F进行AND运算。这是删除不需要的位的常用技巧,因为b & 1 = 1
和b & 0 = 0
。将您的数字视为一系列位,这是一个2字节的例子:
0011010100111010
&安培;
0000000000001111
0000000000001010
现在LCD_EN
和LCD_RS
标志已被删除。同样,这是一个常见的二进制技巧,因为b | 1 = 1
和b | 0 = b
,所以你可以添加标志但不删除它们。所以,如果说LCD_EN = 0x01
和LCD_RS = 0x02
,
0000000000001010
|
0000000000000011
0000000000001011
希望你能更清楚。
答案 1 :(得分:1)
一些猜测,因为您可能需要找到芯片数据表来证实这一点: -
lcd_port
可能是一个直接映射到memory-mapped hardware的变量 - 可能是一个字母数字LCD显示器。
显示器可能将数据作为四位“半字节”(因此移位/和操作),而端口的高四位是控制信号。
LCD_EN
可能是LCD ENABLE的缩写 - 在端口上使用的控制线。
LCD_RS
可能是LCD READ STROBE(或LCD REGISTER SELECT)的缩写 - 端口上使用的另一个控制线。写入端口时设置这些位可能会告诉端口要执行的操作类型。
如果使用的硬件是Hitachi HD44780或某种衍生产品,我不会感到惊讶。
答案 2 :(得分:0)
它似乎是在lcd_port上设置一些数据和标志。第一部分将掩码0x0F应用于(dat>> 4)(右移4),然后应用LCD_EN标志,然后应用LCD_RS标志。
答案 3 :(得分:0)
它将变量data
向右移动四位,然后用值15屏蔽该值。这导致值范围为0-15(最左边的四位)。此结果是带有LCD_EN
和LCD_RS
标志的二进制ORd。
答案 4 :(得分:0)
此代码将dat 4位向右移位,然后使用& 0x0F以确保它仅获得那4个最低有效位。然后使用OR来查找该值中存在哪些位或LCD_EN或LCD_RS并将该值分配给lcd_port。