单片机读IO口数据前要拉高IO口???

[复制链接]
 楼主| Mindist 发表于 2009-10-15 22:27 | 显示全部楼层 |阅读模式
本帖最后由 Mindist 于 2009-10-15 22:31 编辑

如题~我用想读取lcd12864的并行口数据,发现有的程序把IO口拉高了,有的没有耶~
代码如下:

(BF=P0^7)
//************ 读忙信号 **************
bit busy()      
{
bit isbusy;
P0 = 0xff;
LCD_RS = 0;
LCD_RW=1;
LCD_EN=0;
LCD_EN=1;
_nop_();
_nop_();
isbusy=BF;
LCD_EN=0;
return isbusy;
}

//************* 读数据 **************
//*** LCD_RS = 1,LCD_RW = 1,LCD_EN = 1 ***
uchar lcd_read()
{
uchar dat;
while(busy());
LCD_RS = 1;
LCD_RW = 1;
LCD_EN = 1;
_nop_();
_nop_();
dat = P0;
LCD_EN = 0;
return dat;
}

前一个读忙前是拉高了,后一个读数据前有读忙,但是读忙后那一位忙标志不就又被拉低了,这样不用再重新拉高吗?

还有一个问题,其实测忙是不是可以不用这么麻烦,直接while(BF==1)这样不就行了吗?(BF=P0^7)。。。请电友们赐教~
原野之狼 发表于 2009-10-15 22:51 | 显示全部楼层
对于传统51的IO口,没有方向寄存器之说,你研究下IO口的模型吧。
在作为输入口的时候,要先把PORT职位高电平才能正确的读取PIN的状态。
想出国打工 发表于 2009-10-15 23:38 | 显示全部楼层
可以这么说,置1再读;
 楼主| Mindist 发表于 2009-10-16 07:36 | 显示全部楼层
2# 原野之狼
可是为什么后面那段程序就不用把io口拉高了?还有后面那个问题能不能指点一下?谢了。。。
 楼主| Mindist 发表于 2009-10-16 07:37 | 显示全部楼层
3# 想出国打工
后面那段读数据不用再重新拉高?
mrbbsp 发表于 2009-10-16 10:16 | 显示全部楼层
看反汇编代码才是正解

我理解:在端口上输出1,就等于设置端口为输入口
       只要没有改变端口为输出态,没有必要多次设置了吧...
5880527 发表于 2009-10-16 10:31 | 显示全部楼层
上电复位后就是FF,所以如果那个脚没有进行过输出的操作,任何时候直接读就可以的,I2C里最能体现这个读了
zyboy 发表于 2009-10-16 10:50 | 显示全部楼层
引“如果I/O是双向的,当你把IO从输出变为输入的时候,你得先输出1,单向IO输入口就不要输出1了。是防止以前对该端口写过0后,外部电路不能将该端口可靠拉高导致读错。你从没写过0的话就不会读错了。不过最好还是按规矩来。压倒一切的是稳定。”
 楼主| Mindist 发表于 2009-10-16 11:00 | 显示全部楼层
6# mrbbsp
反汇编不懂看啊。。。:(
 楼主| Mindist 发表于 2009-10-16 11:06 | 显示全部楼层
7# 5880527
上面两段代码的后一段为什么就不用再上拉IO口的?
原野之狼 发表于 2009-10-16 14:44 | 显示全部楼层
如果已经是输入状态,就不用置1了。
至于是不是输入口,你的程序的执行流程可以反映出来。
如果你不想去缕这个流程,那就保险点,每次都置1。
 楼主| Mindist 发表于 2009-10-16 15:59 | 显示全部楼层
8# zyboy
像第二段写数据的函数中,读忙之后p0^7被拉低了哦~那为什么接下来读数据的时候不用再拉高的?小生脑子不大好使,请多多包涵。。。谢谢!
 楼主| Mindist 发表于 2009-10-16 16:00 | 显示全部楼层
11# 原野之狼
不好意思,我还是不明白我在12楼提的问题哦。。。谢谢!
zq1987731 发表于 2009-10-16 16:29 | 显示全部楼层
51的P0口是开漏结构且没有上拉电阻的,如果你让该口输出0的话,外部信号不管是1还是0信号都会被拉低(这时候MOS管是导通的),你怎么读都是0...如果输出1的话,内部MOS管截止,这时候就能根据外部1,0的情况正确读取了,记得写1的目的是使内部MOS管截止,不是把该口电平拉高...也就是说...
要读的时候先对端口写个1,然后怎么读,读几次都可以,但只要有哪怕一次输出0的操作,都要重新对端口写1,
原野之狼 发表于 2009-10-16 17:01 | 显示全部楼层
8# zyboy  
像第二段写数据的函数中,读忙之后p0^7被拉低了哦~那为什么接下来读数据的时候不用再拉高的?小生脑子不大好使,请多多包涵。。。谢谢! ...
Mindist 发表于 2009-10-16 15:59


那是外部拉低的,不是你的程序操作使它变低的,结合楼上的叙述,请仔细分析IO口结构。
 楼主| Mindist 发表于 2009-10-16 19:45 | 显示全部楼层
15# 原野之狼
好的,那我再仔细看看~谢了~
踢球老越位 发表于 2009-10-16 21:46 | 显示全部楼层
想当年大学的时候,做I2C接口,就是忘记先置1再读,结果害菜鸟我郁闷了一个星期。。。
 楼主| Mindist 发表于 2009-10-16 22:12 | 显示全部楼层
17# 踢球老越位
看来我也要长下见识了。。。哈
ximingri 发表于 2014-4-14 13:53 | 显示全部楼层
学习了,谢谢各位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:生活不懂我,但是我得懂生活。

13

主题

136

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:生活不懂我,但是我得懂生活。

13

主题

136

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部