打印

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

[复制链接]
7669|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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口拉高了?还有后面那个问题能不能指点一下?谢了。。。

使用特权

评论回复
5
Mindist|  楼主 | 2009-10-16 07:37 | 只看该作者
3# 想出国打工
后面那段读数据不用再重新拉高?

使用特权

评论回复
6
mrbbsp| | 2009-10-16 10:16 | 只看该作者
看反汇编代码才是正解

我理解:在端口上输出1,就等于设置端口为输入口
       只要没有改变端口为输出态,没有必要多次设置了吧...

使用特权

评论回复
7
5880527| | 2009-10-16 10:31 | 只看该作者
上电复位后就是FF,所以如果那个脚没有进行过输出的操作,任何时候直接读就可以的,I2C里最能体现这个读了

使用特权

评论回复
8
zyboy| | 2009-10-16 10:50 | 只看该作者
引“如果I/O是双向的,当你把IO从输出变为输入的时候,你得先输出1,单向IO输入口就不要输出1了。是防止以前对该端口写过0后,外部电路不能将该端口可靠拉高导致读错。你从没写过0的话就不会读错了。不过最好还是按规矩来。压倒一切的是稳定。”

使用特权

评论回复
9
Mindist|  楼主 | 2009-10-16 11:00 | 只看该作者
6# mrbbsp
反汇编不懂看啊。。。:(

使用特权

评论回复
10
Mindist|  楼主 | 2009-10-16 11:06 | 只看该作者
7# 5880527
上面两段代码的后一段为什么就不用再上拉IO口的?

使用特权

评论回复
11
原野之狼| | 2009-10-16 14:44 | 只看该作者
如果已经是输入状态,就不用置1了。
至于是不是输入口,你的程序的执行流程可以反映出来。
如果你不想去缕这个流程,那就保险点,每次都置1。

使用特权

评论回复
12
Mindist|  楼主 | 2009-10-16 15:59 | 只看该作者
8# zyboy
像第二段写数据的函数中,读忙之后p0^7被拉低了哦~那为什么接下来读数据的时候不用再拉高的?小生脑子不大好使,请多多包涵。。。谢谢!

使用特权

评论回复
13
Mindist|  楼主 | 2009-10-16 16:00 | 只看该作者
11# 原野之狼
不好意思,我还是不明白我在12楼提的问题哦。。。谢谢!

使用特权

评论回复
14
zq1987731| | 2009-10-16 16:29 | 只看该作者
51的P0口是开漏结构且没有上拉电阻的,如果你让该口输出0的话,外部信号不管是1还是0信号都会被拉低(这时候MOS管是导通的),你怎么读都是0...如果输出1的话,内部MOS管截止,这时候就能根据外部1,0的情况正确读取了,记得写1的目的是使内部MOS管截止,不是把该口电平拉高...也就是说...
要读的时候先对端口写个1,然后怎么读,读几次都可以,但只要有哪怕一次输出0的操作,都要重新对端口写1,

使用特权

评论回复
15
原野之狼| | 2009-10-16 17:01 | 只看该作者
8# zyboy  
像第二段写数据的函数中,读忙之后p0^7被拉低了哦~那为什么接下来读数据的时候不用再拉高的?小生脑子不大好使,请多多包涵。。。谢谢! ...
Mindist 发表于 2009-10-16 15:59


那是外部拉低的,不是你的程序操作使它变低的,结合楼上的叙述,请仔细分析IO口结构。

使用特权

评论回复
16
Mindist|  楼主 | 2009-10-16 19:45 | 只看该作者
15# 原野之狼
好的,那我再仔细看看~谢了~

使用特权

评论回复
17
踢球老越位| | 2009-10-16 21:46 | 只看该作者
想当年大学的时候,做I2C接口,就是忘记先置1再读,结果害菜鸟我郁闷了一个星期。。。

使用特权

评论回复
18
Mindist|  楼主 | 2009-10-16 22:12 | 只看该作者
17# 踢球老越位
看来我也要长下见识了。。。哈

使用特权

评论回复
19
ximingri| | 2014-4-14 13:53 | 只看该作者
学习了,谢谢各位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

13

主题

137

帖子

1

粉丝