打印

这流水灯程序怎么了,到底是程序有问题还是编译器问题?

[复制链接]
2599|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxcscm|  楼主 | 2011-4-10 19:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近做了一个32位的花样流水灯,在写程序时遇到一个几乎让我抓狂的问题
先看一下程序段

void sendbyte(unsigned char a)  //HC595扩展IO口
{  
     OE=0;
     SBUF=a;
     while(1)
    {
        if(TI)
       {
             TI=0;  break;
       }
    }
    SLCK=0;
    _nop_();
    SLCK=1;
}

void LEDShow(unsigned int hc,LEDStatus1,LEDStatus2)  //LED显示函数
{   
     sendbyte(hc);    //输出到hc595驱动8个led
     P2 = (LEDStatus1>>8);
     P0 = LEDStatus2;
     P1 = (LEDStatus2>>8);
}

void start()                   //有问题
{   
    if(LEDFlag)               //从中间到两边逐个点亮至全亮
    {
        if(LEDIndex==0)
        {
            LEDShow(0xfffe,0xffff,0xffff);
        }
        else
        {   
            LEDShow(0xfffe<<LEDIndex,0xfffe<<LEDIndex,0x7fff>>(LEDIndex-1));   //这段显示不正常
        }      
    }
    else
    {
        if(LEDIndex==0)
        {
            LEDShow(0x0000,0x0000,0x0001);
        }
        else
        {
            LEDShow(~(0x7fff>>(LEDIndex-1)),~(0x7fff>>(LEDIndex-1)),~(0xfffe<<LEDIndex));  //这段显示也不正常
        }
    }
    LEDIndex++;
    if(LEDIndex>16)
    {
         LEDIndex=0;
         LEDFlag=~LEDFlag;
    }
   
}

void move_bit()   //这段显示就没问题
{
    if(LEDFlag)
    {
        LEDShow(~(0x0001<<LEDIndex),~(0x0001<<LEDIndex),~0x0000); //灯移位亮
        LEDIndex++;
        if(LEDIndex>=16)
        {
            LEDIndex=0;
            LEDFlag=0;
        }
    }   
    else
    {
        LEDShow(~0x0000,~0x0000,~(0x0001<<LEDIndex));
       LEDIndex++;
        if(LEDIndex>=16)
        {
            LEDFlag=1;
            LEDIndex=0;
        }
    }
}


我就很纳闷,同一个函数(LEDShow)
在move_bit()里 LEDShow(~(0x0001<<LEDIndex),~(0x0001<<LEDIndex),~0x0000);    没问题
换到  start() 里 LEDShow(~(0x7fff>>(LEDIndex-1)),~(0x7fff>>(LEDIndex-1)),~(0xfffe<<LEDIndex));  就不能正常显示了,led会一直亮 或一直灭

两次唯一的不同就是传递的参数不一样,但为什么显示结果会不正确呢?是编译器的问题还是程序这样写不正确?
那位大侠能帮忙解释下,这个问题困扰小弟好几周了!!!

相关帖子

沙发
zxcscm|  楼主 | 2011-4-10 21:39 | 只看该作者
难到是定义为int 的原因?

使用特权

评论回复
板凳
ayb_ice| | 2011-4-11 08:33 | 只看该作者
首先把程序搞规范了再说

使用特权

评论回复
地板
xlsbz| | 2011-4-11 12:17 | 只看该作者
一般来讲

先怀疑程序问题
然后怀疑硬件
然后怀疑自己的人品
然后怀疑编译器

所以不要轻易怀疑编译器

使用特权

评论回复
5
潇湘741| | 2011-4-11 14:52 | 只看该作者
有待思考。。。。。

使用特权

评论回复
6
zxcscm|  楼主 | 2011-4-11 16:22 | 只看该作者
现在在怀疑自己的人品 4# xlsbz

使用特权

评论回复
7
yjsstk| | 2011-4-11 16:24 | 只看该作者
可能是类型转换引起的问题吧。sendbyte(unsigned char a) 这是个8位,你传的是16位

使用特权

评论回复
8
zxcscm|  楼主 | 2011-4-11 16:45 | 只看该作者
可能是类型转换引起的问题吧。sendbyte(unsigned char a) 这是个8位,你传的是16位
yjsstk 发表于 2011-4-11 16:24


可能有这个原因,但应该不是元凶,将int 赋值给char顶多就会去掉高8位,也不会引起低8位的错乱啊

使用特权

评论回复
9
1314wankai| | 2011-4-11 21:44 | 只看该作者
哥们,程序不规范呀
你那编译就没提醒??

使用特权

评论回复
10
zxcscm|  楼主 | 2011-4-12 08:15 | 只看该作者
哥们,程序不规范呀
你那编译就没提醒??
1314wankai 发表于 2011-4-11 21:44


哪地方不规范,编译时没有提示啊

使用特权

评论回复
11
sdpz| | 2011-4-12 08:28 | 只看该作者
扫了一眼,人品不怎么行,也就没法看下去了。

使用特权

评论回复
12
xlsbz| | 2011-4-12 08:34 | 只看该作者
移位和取反同时出现时候 一定要强制类型转换 ,否则你这语句在8位机和32位机执行效果不一样!!
LEDShow(~(0x7fff>>(LEDIndex-1)),~(0x7fff>>(LEDIndex-1)),~(0xfffe<<LEDIndex));

使用特权

评论回复
13
xlsbz| | 2011-4-12 08:53 | 只看该作者


你程序没好好看 我猜 小有可能是这样的啊  

至少能有1%的可能性吧:Q

使用特权

评论回复
14
zxcscm|  楼主 | 2011-4-14 10:20 | 只看该作者
13# xlsbz

回楼上,怎么区分8位和32位呢,俺用的是89s52 典型的8位机吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

628

帖子

1

粉丝