1

将整个字节分配给 SFR 或对其值应用 AND 或 OR 是否有区别?

换句话说,如果我将一些位设置为与以前相同的值,或者这会触发一些硬件反应,这是否重要?

例如我从:

MOV UARTCON, 0x9b

然后我可以用相同的最终值

ORL UARTCON, 0x40

或者

MOV UARTCON, 0xdb

甚至

SETB UARTCON.6

有什么区别吗?

我在这里不是特别谈论 UARTCON,而是谈论 SFR 的一般机制。是一组位重要还是只是那个位的变化?

UPD我可以缩小问题的范围:即使使用CLR,SETB和?ORLAND

4

1 回答 1

0

可能有一些位在读取和写入时具有不同的含义,例如端口引脚。写入时设置锁存器和输出,读取时返回输入。要配置输入引脚,请向其写入 1。假设您已设置P1.0为输入并且它被外部拉低,即它将被读取为 0。现在如果您也想设置P1.1为输入,您可以这样做SETB P1.1,并且可以正常工作。但是,如果您读取 的值P1,修改该值,然后将其写回,则它将不起作用:

MOV P1, #1 ; set P1.0 to input
MOV A, P1  ; reads 0
ORL A, #2
MOV P1, A  ; P1.0 no longer input

请注意ORL P1, #2,虽然它在逻辑上执行相同的操作,但之所以有效,是因为处理器具有特殊支持并且知道读取端口锁存器而不是引脚输入。

您提到的另一种可能性是写入触发了某些东西。一个这样的例子是SBUF。即使您在那里写入相同的值,它也会触发传输。但是,这与您的问题并不真正相关,因为它不是可寻址的。在标准 8051 的上下文中,我想不出另一个表现出类似行为的 SFR。

于 2012-11-06T16:23:53.457 回答