请教关于PIC的IO口读-修改-写问题和对付方案

2020-02-06 10:15发布

          目前在用PIC16F877。IO口操作寄存器只有方向寄存器TRISx和PORTx。  在张明峰的书上有明确讲了这个问题读-修改-写,这次我是遇到了。
          现在的条件是这样子的,我用了两个IO口,RD4,RD5去模拟IIC,初始化RD4,RD5为0,外接上拉电阻,通过改变TRISD4和TRISD5来改变IO的高低电平来模拟IIC。 也就是说。TRISD4,TRISD5为1时,为输入口,由于外部上拉电阻,外部输出高电平,TRISD4,TRISD5为0时,为输出口,由于初始化为0,外部输出低电平。平时无动作时,为输入口,空闲状态外部高电平
        然后我有另一个使用到RD0,RD1,RD2,好了,问题就在这里,我改变RD0,RD1,RD2,相当于要读PORTD,这时,RD4,RD5肯定读为1,修改完再写回去时,我的RD4,RD5就被写成1了。。。。这就使得我IIC不能用了。
        高端一点PIC的MCU还好,有LATx口,PIC16F877没有。。。难道要使用其它方法。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
slzm40
1楼-- · 2020-02-06 10:32
IIC还好,我用硬件的,但是这个还不是IIC,时序差有点大。真是坑啊
zhu_huijia0001
2楼-- · 2020-02-06 15:31
 精彩回答 2  元偷偷看……
alias
3楼-- · 2020-02-06 19:09
>>高端一点PIC的MCU还好,有LATx口,PIC16F877没有。。。难道要使用其它方法。。。

在记忆内自定义一个 PORTD_Latch,程式中所有的 PORTD 位元改变都只对这执行,完事后把 PORTD_Latch 内容送至 PORTD。
slzm40
4楼-- · 2020-02-07 00:43
alias 发表于 2014-6-19 14:27
>>高端一点PIC的MCU还好,有LATx口,PIC16F877没有。。。难道要使用其它方法。。。

在记忆内自定义一个 PO ...

你说的应该是影子寄存器那种方法。 也是可以的,但不治本。   
只能换个高级点的MCU。 或把这两个口放在E口,只有三个脚,另一个IO就空着不用了。
EMC菜鸟
5楼-- · 2020-02-07 04:08
我觉得楼主的问题根本不是问题啊:你只要保证在对 I2C 进行操作的中间,不会去操作同一个端口的其他IO就行了(要注意中断里也不能操作同端口的IO),怎么会有影响呢?

PIC16系列的片子那么多人在用,难道大家都不用 I2C 吗?很显然不会的呀!
mowin
6楼-- · 2020-02-07 08:23
这根本不是问题,你应该每次设定输出之前,手动修改port值。别老想一劳永逸

一周热门 更多>