不会读错了。不过最好还是按规矩来。压倒一切的是稳定如题~我用想读取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# 踢球老越位
看来我也要长下见识了。。。哈
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。