分享

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

 鹿港小镇1989 2014-04-14
不会读错了。不过最好还是按规矩来。压倒一切的是稳定
如题~我用想读取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)。。。请电友们赐教~
 
 

 

积分
24114
帖子
6941
本月在线
9小时15分

专家等级:

结帖率:96%

2#
原野之狼 发表于 2009-10-15 22:51:39 |只看该作者 回复 |返回版面
对于传统51的IO口,没有方向寄存器之说,你研究下IO口的模型吧。
在作为输入口的时候,要先把PORT职位高电平才能正确的读取PIN的状态。
积分
84
帖子
28
本月在线
0小时0分

专家等级:

结帖率:0%

3#
想出国打工 发表于 2009-10-15 23:38:24 |只看该作者 回复 |返回版面
可以这么说,置1再读;
积分
426
帖子
142
本月在线
0小时0分

专家等级:

结帖率:100%

4#
Mindist 发表于 2009-10-16 07:36:46 |只看该作者 回复 |返回版面
2# 原野之狼
可是为什么后面那段程序就不用把io口拉高了?还有后面那个问题能不能指点一下?谢了。。。
生活不懂我,但是我得懂生活。
积分
426
帖子
142
本月在线
0小时0分

专家等级:

结帖率:100%

5#
Mindist 发表于 2009-10-16 07:37:14 |只看该作者 回复 |返回版面
3# 想出国打工
后面那段读数据不用再重新拉高?
生活不懂我,但是我得懂生活。
积分
92
帖子
28
本月在线
1小时15分

专家等级:

结帖率:100%

6#
mrbbsp 发表于 2009-10-16 10:16:42 |只看该作者 回复 |返回版面
看反汇编代码才是正解

我理解:在端口上输出1,就等于设置端口为输入口
       只要没有改变端口为输出态,没有必要多次设置了吧...
积分
5783
帖子
1767
本月在线
0小时0分

专家等级:

结帖率:83%

7#
5880527 发表于 2009-10-16 10:31:58 |只看该作者 回复 |返回版面
上电复位后就是FF,所以如果那个脚没有进行过输出的操作,任何时候直接读就可以的,I2C里最能体现这个读了
积分
1343
帖子
354
本月在线
0小时15分

专家等级:

结帖率:60%

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

专家等级:

结帖率:100%

9#
Mindist 发表于 2009-10-16 11:00:01 |只看该作者 回复 |返回版面
6# mrbbsp
反汇编不懂看啊。。。
生活不懂我,但是我得懂生活。
积分
426
帖子
142
本月在线
0小时0分

专家等级:

结帖率:100%

10#
Mindist 发表于 2009-10-16 11:06:09 |只看该作者 回复 |返回版面
7# 5880527
上面两段代码的后一段为什么就不用再上拉IO口的?
生活不懂我,但是我得懂生活。
积分
24114
帖子
6941
本月在线
9小时15分

专家等级:

结帖率:96%

11#
原野之狼 发表于 2009-10-16 14:44:37 |只看该作者 回复 |返回版面
如果已经是输入状态,就不用置1了。
至于是不是输入口,你的程序的执行流程可以反映出来。
如果你不想去缕这个流程,那就保险点,每次都置1
积分
426
帖子
142
本月在线
0小时0分

专家等级:

结帖率:100%

12#
Mindist 发表于 2009-10-16 15:59:14 |只看该作者 回复 |返回版面
8# zyboy
像第二段写数据的函数中,读忙之后p0^7被拉低了哦~那为什么接下来读数据的时候不用再拉高的?小生脑子不大好使,请多多包涵。。。谢谢!
生活不懂我,但是我得懂生活。
积分
426
帖子
142
本月在线
0小时0分

专家等级:

结帖率:100%

13#
Mindist 发表于 2009-10-16 16:00:09 |只看该作者 回复 |返回版面
11# 原野之狼
不好意思,我还是不明白我在12楼提的问题哦。。。谢谢!
生活不懂我,但是我得懂生活。
积分
3003
帖子
761
本月在线
0小时0分

专家等级:

结帖率:92%

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

专家等级:

结帖率:96%

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


那是外部拉低的,不是你的程序操作使它变低的,结合楼上的叙述,请仔细分析IO口结构。
积分
426
帖子
142
本月在线
0小时0分

专家等级:

结帖率:100%

16#
Mindist 发表于 2009-10-16 19:45:36 |只看该作者 回复 |返回版面
15# 原野之狼
好的,那我再仔细看看~谢了~
生活不懂我,但是我得懂生活。
积分
1809
帖子
593
本月在线
0小时0分

专家等级:

结帖率:15%

17#
踢球老越位 发表于 2009-10-16 21:46:10 |只看该作者 回复 |返回版面
想当年大学的时候,做I2C接口,就是忘记先置1再读,结果害菜鸟我郁闷了一个星期。。。
积分
426
帖子
142
本月在线
0小时0分

专家等级:

结帖率:100%

18#
Mindist 发表于 2009-10-16 22:12:32 |只看该作者 回复 |返回版面
17# 踢球老越位
看来我也要长下见识了。。。哈

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多