打印

keil编程中的全局变量

[复制链接]
2795|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
朝阳暮鼓|  楼主 | 2009-11-21 20:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是一个单片机初学者,今天在网站看代码的时候发现了一下
#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语言不一样

相关帖子

沙发
icecut| | 2009-11-21 20:55 | 只看该作者
还是好好看看语法吧。或是debug一下

使用特权

评论回复
板凳
smileagain| | 2009-11-21 22:00 | 只看该作者
呵呵,lz可能是把汇编指令和c语言搞混了,或者说,c的功底不太扎实
在汇编里,若要把ACC左移1位,可以这样表示:RL A
但在c里面,要写成:ACC=ACC<<1,ACC中的内容才会变化。你写ACC<<1,语法上不对通不过编译,所以ACC中的值也不会变化
所以a=temp<<count;b=temp>>(8-count);并没有改变temp的值,因为没有"temp=xxx"之类的赋值语句
刚从汇编转c时我也犯过这样的低级错误,没事的,加油吧:)

使用特权

评论回复
地板
chfirst| | 2009-11-21 22:05 | 只看该作者
a=temp<<count;
    b=temp>>(8-count);
   只是将temp左右移后得到的值赋给了全局变量a,b;temp本身值没有改变,还是0xfe。

使用特权

评论回复
5
朝阳暮鼓|  楼主 | 2009-11-21 22:54 | 只看该作者
谢谢3,4楼见笑了 确实如此 ,自己拐进胡同里面去了。

使用特权

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

本版积分规则

2

主题

4

帖子

1

粉丝