C语言51单片机左移函数的问题

其中P0^1-P0^7控制二极管发光,0亮,1不亮
我的程序 想用函数实现左移 ,然后挨个返回 值 ,实现LED灯 从右向左 依次亮!
这个结果是 右一先亮 然后后面7个全亮了,为什么?
#include<reg52.h>
int delay(int m)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<2000;j++)
;
}

int zuoyi(void)
{
int i,m;
delay(20);
for(i=0,m==0xfe;i<7;i++)
{
m<<=1;
return(m);//m左移一位后返回m值
delay(20);//延时
}

}
main()
{
int i,a;
while(1)
{
P0=0xfe;
for(;;a++)
{
P0=zuoyi();//m返回值赋给P0,目的是让PO从右8向左依次亮 a=0;
}
}
}

你首先赋值P0=0xfe,就是p0^1亮,其他全灭,而你的zuoyi()函数在执行完后才给P0赋值,而zuoyi()执行完后,返回值是0;追问

你的意思是,zuoyi()函数执行7次之后,才返回一个最终值吗?return()不是在for循环内吗?为什么不是循环一次返回一次?

追答

没看仔细,不好意思。m是局部变量,退出函数后会被丢失。还有m没有赋初值,在第一次调用时都是随机的,

追问

for(i=0,m==0xfe;i<7;i++)

m已经赋值了
还是不太明白 可不可以帮我把函数内部改一下,使能够用函数 实现逐步左移,没多少分 再给你加10分吧

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-08
m==0xfe你这个是什么意思,不对吧
m<<=1这个不对
m<<1左移不是循环移位,左移后最右边可能是补零的追问

噢 对头 应该是m=0xfe

第2个回答  2012-08-08
for(i=0,m==0xfe;i<7;i++)里面的m==0xfe对吗?还有<<=是左移吗?追问

噢 应该是m=0xfe

追答

C程序

#include<reg51.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

//延时

void Delay(uint x)

{

        uchar i;

        while(x--)

        {

                for(i=0;i<120;i++);

        }

}

//主程序

void main()

{

          P0=0x7f;

          while(1)

          {

                  P0=_cror_(P0,1); //P0的值向左循环移动

                  Delay(150);

          }

}

 

protues仿真图