zoukankan      html  css  js  c++  java
  • 单片机之静态局部变量static

    HL-1慧静电子

    上程序:

    main.c

    #include <reg52.h>
    #include "Timer.h"

    /********P1口低有效******************/

    void main(void)
    {
    init();//中断初始化

    while(1)
    {

    }
    }

    Timer.h

    #ifndef _TIMER_H_
    #define _TIMER_H_

    extern void init(void);

    #endif

    Timer.c

    #include <reg52.h>

    int k=0;//占空比
    unsigned int count=0;//计数
    unsigned int BOOL=0;//由暗到亮,BOOL=1,由亮到暗


    #define max 99
    #define min 0
    #define led_state P1

    void init(void)
    {
    TMOD=1; //定时器0,工作方式1
    TH0=0xff; //装入初值200us
    TL0=0x47;
    TR0=1; //开始定时
    ET0=1;
    EA=1;//CPU开放中断
    }


    void inter(void) interrupt 1
    {
    static int temp_k=0;/*如果定义成局部变量,则
    必须定义成静态局部变量,静态局部变量是在编译时
    赋初值的,只赋初值一次,以后每次调用函数时
    不再重新赋初值而只是保留上次函数调用结束时的值。*/
    TH0=0xff;
    TL0=0x47;

    if(++count>=100) //0-99次不成立,共100次
    {
    count=0;
    if((k<=max)&&(0==BOOL))
    {
    k++;
    if(k>max)
    {
    BOOL=1;
    k=max;
    }
    }

    if((k>=min)&&(1==BOOL))
    {
    k--;
    if(k<min)
    {
    BOOL=0;
    k=min;
    }
    }
    temp_k=k;
    }

    if(temp_k>0)
    {
    led_state=0x00;
    temp_k--;
    }
    else
    led_state=0xff;
    }

    备注:C程序设计教程 谭浩强 P171-174仔细看看

    关于静态局部变量几点注意:

    1.静态局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值;

    2.静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放;

    3.对静态局部变量是在编译时赋初值的,即只赋初值一次。自动变量赋初值是在函数调用时进行,每调用一次函数,重新给次初值;

    4.如果定义局部变量时不赋初值的话,则对静态局部变量编译时自动赋初值0(对数值型变量)或空字符(对字符型变量),而自动变量如不赋初值,则它的值是不确定的;

    5.静态局部变量在函数调用结束后仍然存在,但是其它的函数不能引用它。因为他是局部变量,只能被本函数引用;

    6.三种局部变量存储位置不一样:自动变量存储在动态存储区,静态局部变量存储在静态存储区,寄存器变量存储在CPU的寄存器中。

    需要用到静态局部变量的情况:

    1.需要保留函数上一次调用结束时的值;

    2.如果初始化后,变量只被引用而不改变其值,则这时用静态局部变量比较方便,以免每次调用时重新赋值。

    三种局部变量:

    auto变量

    static局部变量

    register变量

  • 相关阅读:
    3、看源码MVC中的Controllr的Json方法
    2、MVC+IOC容器+ORM结合
    1、看源码MVC如何实例化控制器?
    6、UnityConfig实现AOP
    5、动态代理AOP实现-DynamicProxy模式
    1、面向切面编程
    通过js看类似C#中的回掉
    C#新开一个线程取到数据,如何更新到主线程UI上面
    2.C#自定义Attribute
    1.C#中几个简单的内置Attribute
  • 原文地址:https://www.cnblogs.com/chasing/p/3558065.html
Copyright © 2011-2022 走看看