哪位高手能通俗地讲一讲单片机端口的“读-修改-写

arch   2009-5-14 08:49 楼主
哪位高手能通俗地讲一讲端口的“读-修改-写”特性及其导致的后及避免方法。

看了很多对这个问题的讲解,都是一知半解,讲的一头雾水。

期待高手出现。

回复评论 (11)

PORTADAT |= 0x01;
PORTADAT = PORTADAT | 0x01;
上边就是读-修改-写,将PA0置1,其它不变(都为输出的情况下)
先把A端口数据读出来,用或的方式修改自己需要的管脚,再写A端口。
好处是不会更改你不想更改的端口。
否则如果你使用PORTADAT = 0x01则将PA0置1,其它A端口置0(都为输出的情况下)

点赞  2009-5-14 09:08
端口也要读-修改-写啊,好像端口一般这样做没有意义吧,硬件电路完成后,端口是输入 还是输出就已经定了,
你要读端口,说明端口是输入,那你把他读了又写东西,就又把他当输出,电路设计不好的话,可能烧芯片的,

要想对一个输出端口也楼上的这种功能,要在内存里设置一个变量,时刻保存端口的输出状态,修改的时候修改内存,然后把内存写到端口上,
点赞  2009-5-14 11:08
引用: 引用 2 楼 pyj0314 的回复:
端口也要读-修改-写啊,好像端口一般这样做没有意义吧,硬件电路完成后,端口是输入 还是输出就已经定了,
你要读端口,说明端口是输入,那你把他读了又写东西,就又把他当输出,电路设计不好的话,可能烧芯片的,

要想对一个输出端口也楼上的这种功能,要在内存里设置一个变量,时刻保存端口的输出状态,修改的时候修改内存,然后把内存写到端口上,


完全不同意!
点赞  2009-5-14 11:19
引用: 引用 3 楼 Veabol 的回复:

完全不同意!
呵呵,我我觉得应该这样啊
点赞  2009-5-14 11:25
引用: 引用 4 楼 pyj0314 的回复:
引用 3 楼 Veabol 的回复:

完全不同意!
呵呵,我我觉得应该这样啊

你可以找一些示例代码,很少会看到像你那样做的
点赞  2009-5-14 11:35
哦,想起来了,不要意思:)
一个输出端口,要想得到它现在的输出状态,直接读相应的寄存器;
我把 读-修改-写 里的读 理解错了,理解成作为输入端口读取输入给单片机的信号了,
点赞  2009-5-14 13:11
PORTADAT |= 0x01;  
|=是啥意思?

另外,端口的“读-修改-写”好像是处理器自己实现的,不用自己再写代码实现了
点赞  2009-5-14 20:05
就是一条指令的操作,比如:
INFC PORTC,1
它需要先读回当前端口PORTC的值,这个读回的值受到外部硬件电路的影响,比如,您的PORTC.1口是接的是一个类似二极管的元件,这个元件把这个1电平拉到只有0.7V左右,可是明明是1电平,当读回时是1还是0呢?(读)

这个读回的值再执行相关操作,如上面的加1. (修改)

然后再写回到PORTC(写)

上面就是一个读修改写的过程
点赞  2009-5-14 20:46
PORTADAT |= 0x01;
PORTADAT = PORTADAT | 0x01;
上边就是读-修改-写,将PA0置1,其它不变(都为输出的情况下)
先把A端口数据读出来,用或的方式修改自己需要的管脚,再写A端口。
好处是不会更改你不想更改的端口。
否则如果你使用PORTADAT = 0x01则将PA0置1,其它A端口置0(都为输出的情况下)
***********************************************************************

感觉好像刚好弄反了?
应该是要尽量避免读-修改-写造成的问题呀。
点赞  2009-5-14 20:49
mark 下
点赞  2009-5-15 00:02
简单的讲,就是修改部分位,保留其余位。
2#楼的说法有问题,可以直接读端口
点赞  2009-5-15 10:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复