打印

请教有管static的问题

[复制链接]
1099|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sinianzain|  楼主 | 2012-9-26 12:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sinianzain 于 2012-9-26 12:31 编辑

#include<reg52.h>
#include"delay1ms.h" //包含自定义延时函数的头文件
#define uchar unsigned char
#define WALK 4
sbit LATCH1=P2^2;   //数码管段锁存位
sbit LATCH2=P2^3;   //数码管位锁存位
sbit KEY_ADD=P3^0;//随便定义的一个加速的按键位
sbit KEY_DEC=P3^1; //随便定义的一个减速的按键位
uchar code EM[]={0x08,0x04,0x02,0x01}; //顺时针旋转相序(P1^0-P1^3)
uchar code DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的段码值
uchar code WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                    //1-8数码管的位码值
void display(uchar site,uchar digit);  //数码管显示函数
void INIT_T0(void);
uchar ADD_DEC(void); //按键操作函数
uchar temp[8];            //临时数组
void main(void)
{
    static uchar i,speed;
    INIT_T0();

    while(1)
    {
        speed=ADD_DEC();
        for(i=0;i<WALK;i++)      //步进电机单步4拍方式顺时针转动
       {
            P1=EM;
            delay1ms(2+speed); //调节速度
        }

        temp[7]=DM[(5-speed)%10];  //只显示数码管的最后一位
    }
}

uchar ADD_DEC(void)             //自定义按键操作函数
   
{
    static uchar speed_key=5;//这个赋初值5为了让最开始时从速度0显示

    if(!KEY_ADD)                       //按键判断(加速)   
    {
        delay1ms(10);
        if(!KEY_ADD)
       {
            if(speed_key==0)
                speed_key=5;       //减小speed,增加步进电机速度
            else
                speed_key--;
        }
        while(!KEY_ADD);         //等待按键释放
     }

    if(!KEY_DEC)                    //按键判断(减速)
    {
        delay1ms(10);
        if(!KEY_DEC)
        {
            speed_key++;        //增加speed,降低步进电机速度
            if(speed_key==6)
            speed_key=0;
        }
        while(!KEY_DEC);       //等待按键释放
    }
    return speed_key;
}

void display(uchar site,uchar digit)
{
    static uchar dex;
    P0=0;                     //清空数码管
    LATCH1=1;
    LATCH1=0;

    P0=WM[dex+site]; //保存选择位
    LATCH2=1;
    LATCH2=0;

    P0=temp[dex];      //保存选择段码
    LATCH1=1;
    LATCH1=0;

    dex++;
    if(dex==digit)
        dex=0;
}

void INIT_T0(void)
{
    TMOD|=0x01;
    TH0=(65536-2000)/256;
    TL0=(65536-2000)%256;

    EA=1;
    ET0=1;
    TR0=1;
}

void INTERRUPT_T0(void) interrupt 1
{
    TH0=(65536-2000)/256;
    TL0=(65536-2000)%256;
    display(0,8);
}
上面是我写的一个小程序,用两个按键控制步进电机的速度。有两个问题请教,请教前辈指点,谢谢!:1.最开始我将uchar ADD_DEC(void)里面的局部变量speed_key直接声明为uchar speed_key,但是只要一给这个变量初始化,调试的时候按键按下数字就只是闪一下,不改变,但是当把这个声明为static uchar speed_key时问题解决了(最后我直接将所有局部变量全部用static修饰了),初学,没用过static,所以理解不好,请就此题帮我分析分析。2.uchar ADD_DEC(void)里面的局部变量speed_key直接声明为uchar speed_key且不初始话的时候,它默认应该为0(但是我又记得c书上有一句话:自动存储时期的变量未初始化时具有一个无效值,静态存储时期变量未初始化时,编译器会将其存储为0,如果按这样理解,那是否默认的就为静态存储时期?),但是程序最开始显示的却是0(个人理解应该是5)。

相关帖子

沙发
sinianzain|  楼主 | 2012-9-26 12:32 | 只看该作者
改不了字体,重发问题。
上面是我写的一个小程序,用两个按键控制步进电机的速度。有两个问题请教,请教前辈指点,谢谢!:
1.最开始我将uchar ADD_DEC(void)里面的局部变量speed_key直接声明为uchar speed_key,但是只要一给这个变量初始化,调试的时候按键按下数字就只是闪一下,不改变,但是当把这个声明为static uchar speed_key时问题解决了(最后我直接将所有局部变量全部用static修饰了),初学,没用过static,所以理解不好,请就此题帮我分析分析。
2.uchar ADD_DEC(void)里面的局部变量speed_key直接声明为uchar speed_key且不初始话的时候,它默认应该为0(但是我又记得c书上有一句话:自动存储时期的变量未初始化时具有一个无效值,静态存储时期变量未初始化时,编译器会将其存储为0,如果按这样理解,那是否默认的就为静态存储时期?),但是程序最开始显示的却是0(个人理解应该是5)。

使用特权

评论回复
板凳
阿南| | 2012-9-26 14:08 | 只看该作者
1.static后,变量为静态的,且为分配RAM空间给它所调用函数中的该变量,在你的函数中修改后值会保存在RAM中,下次再调用该函数时,该值就是上次修改的值,这次是在上次的基础上再修改,先决条件是在调用函数中定义在变量时不要初始化它。如果没有static修释,那么编译器可能不会给它单独分配RAM空间,它可能和其它变量共用RAM空间,在你离开被调函数时,变量也就会被释放。
2。默认的是动态的

使用特权

评论回复
地板
阿南| | 2012-9-26 14:09 | 只看该作者
你也可以定义全局变量

使用特权

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

本版积分规则

0

主题

17

帖子

0

粉丝