求助帖:一个液晶的忙等待程序,有源码,有一点想请问...
本帖最后由 卢台长 于 2012-8-24 16:36 编辑关于1602忙信号检查调试结果:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned char
bit a,b;
bit check(uchar dat)
{
uchar value;
P0=dat;
value=(bit)(P0&0x80);
return value;
}
void main()
{
while(1)
{
a=check(0x80);
b=check(0x00);
}
}
可是我还发现了一个问题,当我第二次又去执行的时候,a和b的值如下:
还是我的程序有问题?????
{:victory:}{:victory:} 返回的是最高位,行不? gracialee 发表于 2012-8-23 22:31 static/image/common/back.gif
返回的是最高位,行不?
你能解释下吗,怎么是最高位啊。 bit lcd_check_busy()
...
return (bit)(P0&0x80);
}a better approach, in my view, is to return a char, rather than a bit:unsigned char lcd_check_busy()
{
...
return (P0&0x80)?1:0;
}你能解释下吗,怎么是最高位啊。
P0.7 is connected to D7.
millwood0 发表于 2012-8-24 06:00 static/image/common/back.gif
a better approach, in my view, is to return a char, rather than a bit:
P0.7 is connected to D7.
这哥们不愧是大师,程序和解释很清晰的。 millwood0 发表于 2012-8-24 06:00 static/image/common/back.gif
a better approach, in my view, is to return a char, rather than a bit:
P0.7 is connected to D7.
谢谢啊,你下面写的很好,程序理解的也很清晰。
不过我还是搞不明白,value=(bit)(P0&0x80); 我的理解是,P0&0x80按位与的结果,进行强制类型转换,把最后一位传给value,我理解的是按值传递的方法。
returnvalue; 问题来了,液晶最高位不是忙检测吗,下面就想不通了,望能解释啊 你是不是还没有弄清数据的格式:D7D6D5D4D3D2D1D0 这是8位的数据。 gracialee 发表于 2012-8-24 14:39 static/image/common/back.gif
你是不是还没有弄清数据的格式:D7D6D5D4D3D2D1D0 这是8位的数据。
老兄,那你说给我听听啊,是怎么一回事。 本帖最后由 Lu.Shi 于 2012-8-24 17:11 编辑
卢台长 发表于 2012-8-24 14:12 static/image/common/back.gif
谢谢啊,你下面写的很好,程序理解的也很清晰。
不过我还是搞不明白,value=(bit)(P0&0x80); ...
我和你的理解不一样,value = (bit) ( P0 & 0x80 ),它先是按位相与,然后得到的值是0x00或0x80,所以只是对P0^7的检测,然后再强制类型转换,转换成bit型,所以为0x00时value = 0,为0x80时value = 1,在这里应该强制类型转换时非零为1,零为0。 。。。。。具体是第几位,或是这个类型转换是怎么转的,你自己哪个51试试看不就知道了嘛 本帖最后由 卢台长 于 2012-8-24 16:31 编辑
Lu.Shi 发表于 2012-8-24 15:18 static/image/common/back.gif
我和你的理解不一样,value = (bit) ( P0 & 0x80 ),它先是按位相与,然后得到的值是0x00或0x80,然后再 ...
说得好,我刚刚去调试了下
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned char
bit a,b;
bit check(uchar dat)
{
uchar value;
P0=dat;
value=(bit)(P0&0x80);
return value;
}
void main()
{
while(1)
{
a=check(0x80);
b=check(0x00);
}
}
可是我还发现了一个问题,当我第二次又去执行的时候,a和b的值如下:
还是我的程序有问题?????
卢台长 发表于 2012-8-24 16:30 static/image/common/back.gif
说得好,我刚刚去调试了下
#include
#define uchar unsigned char
我认为这个是程序的问题,记得我刚开始使用51的时候,比如对某一个端口赋初值:
P0=0x00;
P0=0x01;
中间没有延时函数,这时赋初值就不是我们表面上看的这样P0^0=0,紧接着P0^0=1,具体的原因应该datasheet上有,所以这个地方可能a,b值输出不对,顺便问一下,你的执行是在线调试还是软件仿真呀?
以上观点纯属个人理解,不对还请见谅。 Lu.Shi 发表于 2012-8-24 17:09 static/image/common/back.gif
我认为这个是程序的问题,记得我刚开始使用51的时候,比如对某一个端口赋初值:
P0=0x00;
P0=0x01;
我是用keil 3 调试的,你可以把我上面写的代码复制下去调试下 卢台长 发表于 2012-8-24 17:32 static/image/common/back.gif
我是用keil 3 调试的,你可以把我上面写的代码复制下去调试下
我把你的这段代码调试了一下,确实是你说的问题,它在check的调用函数中只要执行到大于两遍value = ( bit )( P0 & 0x80)后,a就一直为零,我想了一下,还是不明白,所以还是再等等有没有高人解答。 Lu.Shi 发表于 2012-8-27 11:34 static/image/common/back.gif
我把你的这段代码调试了一下,确实是你说的问题,它在check的调用函数中只要执行到大于两遍value = ( bit ...
是的,学习就是需要不断探索,解决一个一个问题。{:smile:} 呵呵。 不要强制转换了,直接与过返回不是更方便么
页:
[1]