1

我是初学者,最近才开始,所以如果这是一个愚蠢的问题,请多多包涵。所以在 8051 单片机中我们使用 MOV P1, #00HMOV 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
4

1 回答 1

2

所以在 8051 单片机中我们使用MOV P1, #00HMOV P1, #0FF将端口分别设置为输入或输出。

这已经是错误的了:

您用于MOV P1, #00H将端口的所有引脚设置为低电平。如果 的所有引脚P1输出并且想要将所有引脚设置为高电平,您也可以使用MOV P1, #0FFH.

在 8051 MCU 上,(几乎)所有引脚都是开漏输出:您可以将输出值为“高”的引脚拉至“低”,因此如果您希望将其用作输入,则将“高”输出到引脚.

但是,您必须不时将输出引脚设置为“高”;否则引脚将始终为“低”,这绝对没有意义:

您可以简单地使用电源的负极而不是使用微控制器!

...如果我没有特别提到端口是输入还是输出...

P0...P3的复位值为0FFH

这意味着这些寄存器0FFH在启动 MCU 后都有值。如果您没有明确写入这些寄存器,它们将保留 value 0FFH

这也是有道理的:

如果初始值不是0FFH,则某些引脚会在MOV P1, 0FFH指令前几微秒内“低”。

如果您有一个输入并且来自外部的值是“高”,那么如果在执行P1之前包含另一个值,您将有一个快捷方式MOV P1, 0FFH

于 2021-03-20T06:49:52.777 回答