我是一个单片机初学者,今天在网站看代码的时候发现了一下
#include <reg52.h>
sbit BY1=P3^4; //定义按键的输入端S2键
unsigned char count; //按键计数,每按一下,count加1
unsigned char temp;
unsigned char a,b;
void delay10ms(void) //延时程序
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
key() //按键判断程序
{
if(BY1==0) //判断是否按下键盘
{
delay10ms(); //延时,软件去干扰
if(BY1==0) //确认按键按下
{
count++; //按键计数加1
if(count==8) //计8次重新计数
{
count=0; //将count清零
}
}
while(BY1==0);//按键锁定,每按一次count只加1.
}
}
move() //广告灯向左移动移动函数
{
a=temp<<count;
b=temp>>(8-count);
P1=a|b;
}
main()
{
count=0; //初始华参数设置
temp=0xfe;
P1=0xff;
P1=temp;
while(1) //永远循环,扫描判断按键是否按下
{
key(); //调用按键识别函数
move(); //调用广告灯移动函数
}
}
觉得代码有问题因为 其中的temp之前已经设置成了全局变量
那么这条
move() //广告灯向左移动移动函数
{
a=temp<<count;
b=temp>>(8-count);
P1=a|b;
}
不就不能实现了吗(因为temp是全局变量,进入子函数以后改变量是会保存的),第一次是 temp=0xfe;第一次以后 就是0x01了 因为这条 b=temp>>(8-count); 在进入while循环 还是不能改变;
结果实际测试的时候,我认为错误的代码测试结果完全正常。不知道这是为什么,所以上来问一下。
难道这是keil软件编译的原因还是说c51和单纯的c语言不一样 |