【发布时间】: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