在不破坏操作的情况下一次修改几个位 - 8051端口

时间:2017-10-13 03:38:02

标签: input output bit bits 8051

我正在试图弄清楚是否有一种简单的方法可以同时修改8051端口的几个位。

我将重新解释我的困境更具体的风格。

我的应用程序将端口2划分为两个功能。我们称他们为FA和FB。

FA依赖于低三位的输出值,FB依赖于剩余的5位,但它们可以是I / O.

因为FB中的一位是控制时钟的输出位,所以当我修改FA时我不想修改FB的任何部分,反之亦然。

以下类型的命令对我不起作用:

mov P2,#07h
mov P2,#80h

这是因为这些命令会覆盖两个函数的值,可能会在错误的时间触发一个函数。

我可以通过以下方式逃脱:

setb P2.7
setb P2.6
clr P2.5
clr P2.4
setb P2.3
setb P2.2
clr P2.1
clr P2.0

因为我知道这些命令可以逐个设置各个位而不影响其余位,但我想尝试一次设置多个位。

我读到了读 - 修改 - 写,互联网告诉我MOV与端口引脚上的逻辑操作不同,所以我打算在这里猜一下,看看我是不是基于我的例子:

假设FB我想输出所有逻辑高电平,而对于FA我想输出除最低位= 1之外的所有逻辑低电平。我想一次操作一个函数。

我知道这不起作用,因为它会立即设置所有内容:

mov P2, #0F9h

但不知何故,我认为在端口上使用逻辑可能会有效,但我想知道我的想法是否正确。让我们假设在下面两种情况下P2通过mov命令将值设置为#0A1h,P2的引脚都接地。

这是对的吗?:

anl P2,#F8h ;value of P2 = #0A1h AND #F8h = #0A0h
orl P2,#F9h ;value of P2 = #0A0h OR #F9h = #0F9h
anl P2,#F0h ;value of P2 = #0F9h AND #F0h = #0F0h

或者这更正确吗?:

anl P2,#F8h ;value of P2 = #00h AND #F8h = #00h
orl P2,#F9h ;value of P2 = #00h OR #F9h = #0F9h
anl P2,#F0h ;value of P2 = #00h AND #F0h = #00h

在第二个例子中,我用#00h启动了方程,因为如果我使用MOV A,P2然后想要A的值,那么P2将产生值,但是我不确定该值是否会用于anl和orl计算。

总的来说,我的问题是,我是否可以使用anl和orl仅修改端口的某些位而不会干扰其余的位?还是我坚持使用像bitb和clr这样的位操作命令?

1 个答案:

答案 0 :(得分:1)

首先,我想添加以下方面。涉及SETB和CLR指令的方法将需要更多的机器周期来执行,并且在某些情况下可能是不可行的(即时钟生成,同步问题)。

与现代MCU相比,8051端口相当原始。 '端口'有一个锁存器,用于存储引脚状态,锁存器试图调节输出。这并不一定意味着端口处于期望状态。例如,如果它在外部被驱动为低,则锁存器可以是高但端口将是低的。这正是我们将端口设置为输入的方式。

当我们将数据传送到端口时,我们写入锁存器,当我们从端口MOVe进入寄存器时,无论锁存器的状态如何,我们都会读取实际状态。读 - 修改 - 写操作是一个例外,因为它们专门读取锁存器,执行所需的操作并写回锁存器。因此,在“这是正确的吗?:”下给出的情景是正确的。

如果我们改为MOV A,P2然后执行anl P2,#F8h“或者这更正确吗?:”是正确的。

因此,我们可以使用逻辑运算来修改此问题中给出的案例的端口。

相关问题