下面说一下为什么读之前需要先写1.
写1,写的是输出锁存器,读取,读得是端口的状态,或者说是外部输入。这两个 *** 作访问的硬件是不一样的。
输出锁存器输出1的时候,外部电路可以把端口的高电平拉成低电平,因为51是弱上拉。反之,输出锁存器输出0的时候,外部电路是很难把端口的低电平拉成高电平的,拉成高电平就意味着芯片的管脚损坏。
所以,读之前,输出必须写1,这样外部输入可以是高,也可以是低,不会损坏芯片的管脚。反之,如果写0,那么外部电路只能是低电平,如果是高电平,要么读不到,要么管脚损坏。
当然,具体管脚上的硬件要比这里说的复杂,但原理上大概是这样。
回到你的问题,
P1=0xFF是写P1的输出,让输出维持高电平,或者说弱上拉状态。
P1&0x80并不是你想的0xFF&0x80,而是取P1的当前输入的状态与0x80进行与运算。
void busy_test()//检测lcd是否忙{
u8 st //忙状态标志 0:不忙,0x80:忙
if(f_init==0) //如果某个东西没有初始化
{
return // 退出忙判断,不执行下面的代码
}
lcd=0xff // 先往数据端口赋高电平,便于读数据
rs=0 // 读忙设置
rw=1//读
do
{
e=1 // 数据端口读写使能
st=lcd // 读数据端口的值
e=0 // 禁止数据端口读写
}
while(st&0x80) // 如果忙位BF为1,就一直读端口数据,直到为0才退出忙判断。
// BF:忙标志位,为数据端口的BIT7位。所以为0x80
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)