prince2010 发表于 2013-1-7 07:58:26

请教玩51的朋友们:C语言如何区分读锁存器和读引脚?

请教玩51的朋友们:C语言如何区分读锁存器和读引脚?

一直困惑这个问题。

xiaodao35 发表于 2013-1-7 08:00:02

你看看编译后的汇编语言!

3htech 发表于 2013-1-7 08:01:53

虽然知道这个问题的存在,但我一直没在意。同问。

prince2010 发表于 2013-1-7 08:04:22

呵呵,欢迎大家一起讨论,一起解决这个问题!

ibichao 发表于 2013-1-7 08:06:09

51的P0口是数据、地址复用的,所所当用外设的时候,读引脚先置低,此时地址信号经P0、P2口给出,这时ALE就会来一个脉冲,这样地址就被设保存起来,最后把数据经P0口送出,不知说的是否是你想要的?

prince2010 发表于 2013-1-7 08:13:54

ibichao 发表于 2013-1-7 08:06 static/image/common/back.gif
51的P0口是数据、地址复用的,所所当用外设的时候,读引脚先置低,此时地址信号经P0、P2口给出,这时ALE就 ...

呵呵,不是。
我是说:51汇编语言中区分读锁存器和读引脚,很明确,但是C51中是怎么区分的?

ibichao 发表于 2013-1-7 08:26:13

prince2010 发表于 2013-1-7 08:13 static/image/common/back.gif
呵呵,不是。
我是说:51汇编语言中区分读锁存器和读引脚,很明确,但是C51中是怎么区分的? ...

你是不是想用C控制RD与ALE?就像MOV MOVX 那样?

mcu_lover 发表于 2013-1-7 10:43:18

51汇编中,如果某个pin脚复用,则就存在读锁存与读引脚区别。用逻辑指令保存锁存器的值,如 anl c p1.0 则c中保存的就是锁存器的值。如果要读引脚,则写锁存为1后截止下拉mos,此时再读pin脚就是外部引脚实际电平

mcu_lover 发表于 2013-1-7 10:52:11

如果用c51读锁存的话,可以用&指令读取到c中。

acmilannast 发表于 2013-1-7 14:53:31

靠地址区分。翻译成不同的寻址方式

prince2010 发表于 2013-1-7 17:51:55

ibichao 发表于 2013-1-7 08:26 static/image/common/back.gif
你是不是想用C控制RD与ALE?就像MOV MOVX 那样?

不是。我说的是读P0、P1、P2等的锁存器及引脚。

prince2010 发表于 2013-1-7 17:53:10

acmilannast 发表于 2013-1-7 14:53 static/image/common/back.gif
靠地址区分。翻译成不同的寻址方式

可否详细说一下?

prince2010 发表于 2013-1-7 17:54:10

mcu_lover 发表于 2013-1-7 10:52 static/image/common/back.gif
如果用c51读锁存的话,可以用&指令读取到c中。

谢谢,能不能举个例子说明?

mcu_lover 发表于 2013-1-7 18:20:33

prince2010 发表于 2013-1-7 17:54 static/image/common/back.gif
谢谢,能不能举个例子说明?

sbit testport = P1^0;


CY &= testport;

CY里面存放的就是P1^0端口的锁存器值。

prince2010 发表于 2013-1-7 18:51:47

mcu_lover 发表于 2013-1-7 18:20 static/image/common/back.gif
sbit testport = P1^0;




呵呵,谢谢您,我试了一下,好像还是读引脚。{:cry:}

另外,如果单片机让某IO口输出1,但外部电路将引脚拉低,那么对应的SFR状态是保持1,还是变为0?锁存器状态又会如何?

mcu_lover 发表于 2013-1-7 19:03:10

有些概念要清楚。就是51单片机的端口结构。
51单片机上电复位之后,端口锁存器值为1,这个时候是可以直接读取外部引脚状态的。

如果某个既存在输入又存在输出,即端口复用的情况。如很多人在扫描数码管时候,还用来读取按键值。在这种情况下就有必要分清楚读引脚还是锁存器。
在复用的情况下,如果要知道上次输出的值(即端口锁存器的值),需要用逻辑指令去读取端口状态。如果要知道当前IO口的值,则先将端口锁存器的值保存起来。然后将端口锁存器置1,再读引脚,此时读到的就是外部真实值。
页: [1]
查看完整版本: 请教玩51的朋友们:C语言如何区分读锁存器和读引脚?