【问题标题】:modify several bits at once without wrecking operation - 8051 ports一次修改多个位而不会破坏操作 - 8051 端口
【发布时间】:2017-10-13 03:38:02
【问题描述】:

我想知道是否有一种简单的方法可以一次修改 8051 端口的多个位。

我会用更具体的方式重新解释我的困境。

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

FA 依赖低 3 位的输出值,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

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

我阅读了有关 read-modify-write 的信息,互联网告诉我 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 只修改端口的某些位而不干扰其余位吗?还是我坚持使用 setb 和 clr 等位操作命令?

【问题讨论】:

    标签: input output bit bits 8051


    【解决方案1】:

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

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

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

    如果我们改为 MOV A, P2 然后执行 anl P2,#F8h "Or is this more correct?:" 将是正确的。

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

    【讨论】:

    • 如果我将自定义值放在 R7 的高半字节中并希望将其作为端口 2 实际输出的高半字节,同时保留端口的低半字节,那么我必须最好使用这种编码方法2 未更改:MOV R7,#70h MOV A,P2 ANL A,#0Fh ORL A,R7 MOV P2,A。我在正确的轨道上吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多