1602读状态时为什么要输出0xff的解答及其求大神回答后面问题

2019-07-15 19:03发布

51单片机的书并没有很好的说明1602读状态的内容,导致有些人甚至不知道读状态有什么用,这里我就不说读状态有什么用了,对于程序中为什么要发0xff很是不解,小弟我找了好久,终于解决了一点问题。
先列个程序


#define LCD_DATA P0        //LCD数据口
sbit 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还能检测高电平?我不懂。求大神指导,这里或许是内部原理问题了,那就不深入了自行研究了,让大神答吧。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。