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等等其它的。??
我决定在问大家问题前,我尽量自己找资料决解,以免问出没水平的问题。
从阿莫
william hill官网
里有大神对相同的问题回答道:
P0口作为I/O时, 系统自动关闭内部的上拉场效应管,内部多路开关使得内部锁存器的负Q端与下拉场效应管接通, 因此,
当P0口作为输入口使用时,应先向口地址写入1,使得内部内部负Q端输出低电平,以截至下拉场效应管,保证外部高电平能够输入到P0引脚上,从而程序能读到外部器件输出的高电平. 这就是为什么要读1602的状态需先输出0FF的原因. 不仅P0口,所有其它3个口,在作为输入口使用时,都应先输出1(可以在程序初始化部分设置一次,只要那个口不是交替做为输入和输出口就可以).
经阿莫william hill官网
里有大神这样说道 ,经
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还能检测高电平?我不懂。求大神指导,这里或许是内部原理问题了,那就不深入了自行研究了,让大神答吧。