最近做了一个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会一直亮 或一直灭
两次唯一的不同就是传递的参数不一样,但为什么显示结果会不正确呢?是编译器的问题还是程序这样写不正确?
那位大侠能帮忙解释下,这个问题困扰小弟好几周了!!! |