卢台长 发表于 2012-8-23 21:03:39

求助帖:一个液晶的忙等待程序,有源码,有一点想请问...

本帖最后由 卢台长 于 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的值如下:


还是我的程序有问题?????

卢台长 发表于 2012-8-23 21:19:23

{:victory:}{:victory:}

gracialee 发表于 2012-8-23 22:31:38

返回的是最高位,行不?

卢台长 发表于 2012-8-24 01:22:51

gracialee 发表于 2012-8-23 22:31 static/image/common/back.gif
返回的是最高位,行不?

你能解释下吗,怎么是最高位啊。

millwood0 发表于 2012-8-24 06:00:37

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.

gracialee 发表于 2012-8-24 12:22:02

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.

这哥们不愧是大师,程序和解释很清晰的。

卢台长 发表于 2012-8-24 14:12:50

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;                         问题来了,液晶最高位不是忙检测吗,下面就想不通了,望能解释啊

gracialee 发表于 2012-8-24 14:39:25

你是不是还没有弄清数据的格式:D7D6D5D4D3D2D1D0 这是8位的数据。

卢台长 发表于 2012-8-24 14:47:15

gracialee 发表于 2012-8-24 14:39 static/image/common/back.gif
你是不是还没有弄清数据的格式:D7D6D5D4D3D2D1D0 这是8位的数据。

老兄,那你说给我听听啊,是怎么一回事。

Lu.Shi 发表于 2012-8-24 15:18:01

本帖最后由 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。

boostchopper 发表于 2012-8-24 15:23:30

。。。。。具体是第几位,或是这个类型转换是怎么转的,你自己哪个51试试看不就知道了嘛

卢台长 发表于 2012-8-24 16:30:23

本帖最后由 卢台长 于 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的值如下:

还是我的程序有问题?????

Lu.Shi 发表于 2012-8-24 17:09:39

卢台长 发表于 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值输出不对,顺便问一下,你的执行是在线调试还是软件仿真呀?
以上观点纯属个人理解,不对还请见谅。

卢台长 发表于 2012-8-24 17:32:10

Lu.Shi 发表于 2012-8-24 17:09 static/image/common/back.gif
我认为这个是程序的问题,记得我刚开始使用51的时候,比如对某一个端口赋初值:
P0=0x00;
P0=0x01;


我是用keil 3 调试的,你可以把我上面写的代码复制下去调试下

Lu.Shi 发表于 2012-8-27 11:34:10

卢台长 发表于 2012-8-24 17:32 static/image/common/back.gif
我是用keil 3 调试的,你可以把我上面写的代码复制下去调试下

我把你的这段代码调试了一下,确实是你说的问题,它在check的调用函数中只要执行到大于两遍value = ( bit )( P0 & 0x80)后,a就一直为零,我想了一下,还是不明白,所以还是再等等有没有高人解答。

卢台长 发表于 2012-8-28 00:19:53

Lu.Shi 发表于 2012-8-27 11:34 static/image/common/back.gif
我把你的这段代码调试了一下,确实是你说的问题,它在check的调用函数中只要执行到大于两遍value = ( bit ...

是的,学习就是需要不断探索,解决一个一个问题。{:smile:} 呵呵。

夏日么么茶 发表于 2012-8-28 21:42:48

不要强制转换了,直接与过返回不是更方便么
页: [1]
查看完整版本: 求助帖:一个液晶的忙等待程序,有源码,有一点想请问...