打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
单片机读IO口数据前要拉高IO口???
不会读错了。不过最好还是按规矩来。压倒一切的是稳定如题~我用想读取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再读;
Mindist
资深技术员
积分426帖子142本月在线0小时0分
专家等级:
结帖率:100%
4#
Mindist 发表于 2009-10-16 07:36:46 |只看该作者回复 |返回版面
2# 原野之狼
可是为什么后面那段程序就不用把io口拉高了?还有后面那个问题能不能指点一下?谢了。。。
生活不懂我,但是我得懂生活。
Mindist
资深技术员
积分426帖子142本月在线0小时0分
专家等级:
结帖率:100%
5#
Mindist 发表于 2009-10-16 07:37:14 |只看该作者回复 |返回版面
3# 想出国打工
后面那段读数据不用再重新拉高?
生活不懂我,但是我得懂生活。
mrbbsp
初级技术员
积分92帖子28本月在线1小时15分
专家等级:
结帖率:100%
6#
mrbbsp 发表于 2009-10-16 10:16:42 |只看该作者回复 |返回版面
看反汇编代码才是正解
我理解:在端口上输出1,就等于设置端口为输入口
只要没有改变端口为输出态,没有必要多次设置了吧...
5880527
高级工程师
积分5783帖子1767本月在线0小时0分
专家等级:
结帖率:83%
7#
5880527 发表于 2009-10-16 10:31:58 |只看该作者回复 |返回版面
上电复位后就是FF,所以如果那个脚没有进行过输出的操作,任何时候直接读就可以的,I2C里最能体现这个读了
zyboy
助理工程师
积分1343帖子354本月在线0小时15分
专家等级:
结帖率:60%
8#
zyboy 发表于 2009-10-16 10:50:56 |只看该作者回复 |返回版面
引“如果I/O是双向的,当你把IO从输出变为输入的时候,你得先输出1,单向IO输入口就不要输出1了。是防止以前对该端口写过0后,外部电路不能将该端口可靠拉高导致读错。你从没写过0的话就不会读错了。不过最好还是按规矩来。压倒一切的是稳定。”
Mindist
资深技术员
积分426帖子142本月在线0小时0分
专家等级:
结帖率:100%
9#
Mindist 发表于 2009-10-16 11:00:01 |只看该作者回复 |返回版面
6# mrbbsp
反汇编不懂看啊。。。
生活不懂我,但是我得懂生活。
Mindist
资深技术员
积分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。
Mindist
资深技术员
积分426帖子142本月在线0小时0分
专家等级:
结帖率:100%
12#
Mindist 发表于 2009-10-16 15:59:14 |只看该作者回复 |返回版面
8# zyboy
像第二段写数据的函数中,读忙之后p0^7被拉低了哦~那为什么接下来读数据的时候不用再拉高的?小生脑子不大好使,请多多包涵。。。谢谢!
生活不懂我,但是我得懂生活。
Mindist
资深技术员
积分426帖子142本月在线0小时0分
专家等级:
结帖率:100%
13#
Mindist 发表于 2009-10-16 16:00:09 |只看该作者回复 |返回版面
11# 原野之狼
不好意思,我还是不明白我在12楼提的问题哦。。。谢谢!
生活不懂我,但是我得懂生活。
zq1987731
中级工程师
积分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口结构。
Mindist
资深技术员
积分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再读,结果害菜鸟我郁闷了一个星期。。。
Mindist
资深技术员
积分426帖子142本月在线0小时0分
专家等级:
结帖率:100%
18#
Mindist 发表于 2009-10-16 22:12:32 |只看该作者回复 |返回版面
17# 踢球老越位
看来我也要长下见识了。。。哈
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
温度传感器DS18B20
<SPAN>LCD1602-DS1302时钟程序</SPAN>
51单片机超声波水位控制器设计资料(源码+PCB+原理图与实物制作)
8255 扩展并口芯片
太深奥了,不知你能否看得懂
单片机IO口直接驱动段式LCD的方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服