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