将整个字节分配给SFR或对其值应用AND或OR是否有区别?
换句话说,如果我将某些位设置为与之前相同的值,或者这会引发某些硬件反应,这是否重要?
例如我从:
开始MOV UARTCON, 0x9b
然后我可以做同样的最终值
ORL UARTCON, 0x40
或
MOV UARTCON, 0xdb
甚至
SETB UARTCON.6
有什么不同吗?
我在这里不是特别谈论UARTCON,而是关于SFR的一般机制。有点重要还是仅仅改变那一位?
UPD 我可以缩小这个问题:即使使用CLR
,SETB
,{{1}等指令,位内部也可以通过位或整个字节更改位可寻址SFR }和ORL
?
答案 0 :(得分:0)
读取和写入时可能会有一些具有不同含义的位,例如端口引脚。写入时,它们设置锁存器和输出,读取时返回输入。要为引脚配置引脚,请为其写入1。假设您已将P1.0
设置为输入并且从外部拉低,即它将被读为0.现在,如果您还要将P1.1
设置为输入,则可以执行{{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
。即使你在那里写相同的值,它也会触发传输。然而,这与您的问题无关,因为它不是位可寻址的。在标准8051的背景下,我想不出另一个表现出类似行为的SFR。