问题描述
我是初学者,最近刚开始,所以如果这是一个愚蠢的问题,请耐心等待。
所以在 8051 MCU 中我们使用
MOV P1,#00H
或 MOV P1,#0FFH
分别将端口设置为输入或输出。
我的问题是,如果我没有特别提到端口是输入还是输出,程序还能工作吗?
我正在尝试实现一个查找表,其中 P1 将采用输入 (0-9) 并显示其正方形
在 P2。
ORG 0000H
MOV DPTR,#TBLE
MOV P1,#0FFH
MOV P2,#00H
;Begin Transfer
NEXT: MOV A,P1
MOV R1,A
MOVC A,@A+DPTR
MOV P2,A
CJNE R1,#00H,NEXT
SJMP $
ORG 0100H
TBLE: DB 00H,01H,04H,09H,16H,25H,36H,49H,64H,81H
END
解决方法
因此在 8051 MCU 中,我们使用 MOV P1,#00H
或 MOV P1,#0FF
分别将端口设置为输入或输出。
这已经错了:
您使用 MOV P1,#00H
将端口的所有引脚设置为低电平。如果 P1
的所有引脚都是 outputs 并且想要将所有引脚设置为高电平,您还可以使用 MOV P1,#0FFH
。
在 8051 MCU 上,(几乎)所有引脚都是开漏输出:您可以将输出值为“高”的引脚拉到“低”,因此如果您想使用,可以将“高”输出到引脚它作为输入。
但是,您必须不时将输出引脚设置为“高”;否则引脚总是“低”,这绝对没有意义:
您可以简单地使用电源的负极,而不是使用微控制器!
...如果我没有特别提到端口是输入还是输出...
P0
...P3
的重置值为 0FFH
。
这意味着这些寄存器在启动 MCU 后具有值 0FFH
。如果您不明确写入这些寄存器,它们将保留值 0FFH
。
这也有道理:
如果初始值不是 0FFH
,则在 MOV P1,0FFH
指令之前的几微秒内,某些引脚将处于“低”状态。
如果您有一个输入并且来自外部的值是“高”,并且在执行 P1
之前 MOV P1,0FFH
包含另一个值,那么您将有一个快捷方式。