哪位高手能通俗地讲一讲端口的“读-修改-写”特性及其导致的后及避免方法。
看了很多对这个问题的讲解,都是一知半解,讲的一头雾水。
期待高手出现。
PORTADAT |= 0x01;
PORTADAT = PORTADAT | 0x01;
上边就是读-修改-写,将PA0置1,其它不变(都为输出的情况下)
先把A端口数据读出来,用或的方式修改自己需要的管脚,再写A端口。
好处是不会更改你不想更改的端口。
否则如果你使用PORTADAT = 0x01则将PA0置1,其它A端口置0(都为输出的情况下)
端口也要读-修改-写啊,好像端口一般这样做没有意义吧,硬件电路完成后,端口是输入 还是输出就已经定了,
你要读端口,说明端口是输入,那你把他读了又写东西,就又把他当输出,电路设计不好的话,可能烧芯片的,
要想对一个输出端口也楼上的这种功能,要在内存里设置一个变量,时刻保存端口的输出状态,修改的时候修改内存,然后把内存写到端口上,
哦,想起来了,不要意思:)
一个输出端口,要想得到它现在的输出状态,直接读相应的寄存器;
我把 读-修改-写 里的读 理解错了,理解成作为输入端口读取输入给单片机的信号了,
PORTADAT |= 0x01;
|=是啥意思?
另外,端口的“读-修改-写”好像是处理器自己实现的,不用自己再写代码实现了
就是一条指令的操作,比如:
INFC PORTC,1
它需要先读回当前端口PORTC的值,这个读回的值受到外部硬件电路的影响,比如,您的PORTC.1口是接的是一个类似二极管的元件,这个元件把这个1电平拉到只有0.7V左右,可是明明是1电平,当读回时是1还是0呢?(读)
这个读回的值再执行相关操作,如上面的加1. (修改)
然后再写回到PORTC(写)
上面就是一个读修改写的过程
PORTADAT |= 0x01;
PORTADAT = PORTADAT | 0x01;
上边就是读-修改-写,将PA0置1,其它不变(都为输出的情况下)
先把A端口数据读出来,用或的方式修改自己需要的管脚,再写A端口。
好处是不会更改你不想更改的端口。
否则如果你使用PORTADAT = 0x01则将PA0置1,其它A端口置0(都为输出的情况下)
***********************************************************************
感觉好像刚好弄反了?
应该是要尽量避免读-修改-写造成的问题呀。
简单的讲,就是修改部分位,保留其余位。
2#楼的说法有问题,可以直接读端口