完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
51单片机的书并没有很好的说明1602读状态的内容,导致有些人甚至不知道读状态有什么用,这里我就不说读状态有什么用了,对于程序中为什么要发0xff很是不解,小弟我找了好久,终于解决了一点问题。
先列个程序 #define LCD_DATA P0 //LCD数据口 ***it LCD_BUSY=LCD_DATA^7; //LCD忙信号位 void LCD_check_busy(void) 检测是否在忙 { while(1) { LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_DATA=0xff; LCD_EN=1; if(!LCD_BUSY)break; } LCD_EN=0; } 1.为何在检测程序时,EN=0与EN=1之间要发一个 LCD_DATA=0xff;?这是为何?发其它的行不行,如0x00,0x51等等其它的。?? 我决定在问大家问题前,我尽量自己找资料决解,以免问出没水平的问题。 从阿莫论坛里有大神对相同的问题回答道: P0口作为I/O时, 系统自动关闭内部的上拉场效应管,内部多路开关使得内部锁存器的负Q端与下拉场效应管接通, 因此,当P0口作为输入口使用时,应先向口地址写入1,使得内部内部负Q端输出低电平,以截至下拉场效应管,保证外部高电平能够输入到P0引脚上,从而程序能读到外部器件输出的高电平. 这就是为什么要读1602的状态需先输出0FF的原因. 不仅P0口,所有其它3个口,在作为输入口使用时,都应先输出1(可以在程序初始化部分设置一次,只要那个口不是交替做为输入和输出口就可以). 经阿莫论坛里有大神这样说道 ,经proteus仿真,果然0x00是不行的,0x80是可以的! 这说明,最高位要先写入1才可读取忙标记!问题解决。就是说,对于读忙标记,0xff可以,0x80,0x90也行,因为只要读取到最高位就行了。那个大神说道:对于不仅P0口,所有其它3个口,在作为输入口使用时,都应先输出1。我知道P0是有点特别的,说不定有点不同,于是我在proteus试验一下,把P0口更换在P3口,果然如他所言,要先输出1才可以。 对于大神的回答,涉及到了内部原理,什么在作为输入口使用时,都应先输出1,,都已经输出1了,这还能检测高电平吗?作为新手的我暂时不想研究(其实我在proteus做了好多试验,没法验证出来 ,,自认新手,能力有限,放弃了),是不是要看微机原理之类的书呀?不想看,等我哪天有心情才回来看。 后来,我花了一点时间去搞keil与proteus的联调,希望能从中找到我想要的东西。呃,跑了程序一下,设了停留点,发现,先是输出0xff,到检测忙的时候是0x80,然后重新在while里走一下,然后第二次检测前再输出0xff,到检测忙时成了0x00,成功跳出来,但似乎也没找到我的问题答案,为什么输出0xff还能检测高电平?我不懂。求大神指导,这里或许是内部原理问题了,那就不深入了自行研究了,让大神答吧。 |
|
相关推荐
2个回答
|
|
坐等大神解释。。。。。
|
|
|
|
现在回答是不是晚了点呢,其实是单片机io口特性决定的,先拉高再读取才能正确,单片机数据手册上写了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12013 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 04:41 , Processed in 0.463686 second(s), Total 43, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号