历史上的今天
返回首页

历史上的今天

今天是:2025年08月19日(星期二)

正在发生

2021年08月19日 | 51单片机-静态变量

2021-08-19

1.static

static一般不用在主函数中,大多数在中断函数和封装好的子函数里运用,它的作用是保证在子函数或中断函数中定义的变量每次调用完之后都可以保持调用完时候的值,《手把手教你学51单片机》文档7.2节有这个知识点的讲解,不过我们还是用代码来解释这个static的作用吧。

 

2.举例

我们要实现像第四章第2讲的实验现象让数码管0从0到F循环显示。本次我们用的是函数封装,代码如下

#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

  

unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化

 

void delay_ms(unsigned int x)

{

    unsigned int i,j;

    if(x==1000)

    {

        for(i=0;i<19601;i++)//延时1s

        {

            for(j=5;j>0;j--);

        }

    }

    else while(x--)for(j=115;j>0;j--);

}

  

void SEG0_task()

{

    unsigned char i=0;

    P0=LedChar[i];

    i++;

    if(i>=16)i=0; //让i在0~15之间变化

}

  

void main()

{  

    ADDR3 = 1;//使能三八译码器

    ENLED = 0;// 

   

    ADDR2 = 0;//**************************

    ADDR1 = 0;//只让数码管0显示

    ADDR0 = 0;//**************************

   

    while(1)

    {

        SEG0_task();

        delay_ms(1000);//延时1s

    } 

}


我们看到的是数码管0一直显示0,这是因为主函数的死循环里每次调用“SEG0_task()”时开头i的值都被初始化为0了,虽然第一次调用完这个函数时,已经执行过“i++;”,但是第二次调用该函数时i又被初始化为0了,导致永远执行的是“P0= LedChar[0];”

而我们只要在SEG0_task()函数中加上static的关键字去定义i,就可以使i成为局部静态变量,从而实现变量在函数调用结束之后仍然保持着当前的值,第二次调用该函数时不会被再次初始化为0。

代码修改如下

static unsigned char i=0;


这样就可以实现我们想要的实验现象了。

 

3.回归按键

按键的执行任务也可以封装为函数,同样需要static去定义key_up,因为它需要跟着KEY4变化,而不是每次都被初始化为同一个值。

代码如下


#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

  

sbit LED2  = P0^0;

sbit KEY4  = P2^7;

 

void delay_ms(unsigned int x)

{

    unsigned int i,j;

    if(x==1000)

    {

        for(i=0;i<19601;i++)//延时1s

        {

            for(j=5;j>0;j--);

        }

    }

    else while(x--)for(j=115;j>0;j--);

}

  

void KEY_task()

{

    static unsigned char key_up=1;

    if(key_up==0)

    {      

        if(KEY4==1)//不支持连按

        {

            LED2 = !LED2;

        }

    }

    key_up=KEY4;   //如果不松手,key_up就会等于0 

}

  

void main()

{  

    ADDR3 = 1;//使能三八译码器

    ENLED = 0;// 

   

    ADDR2 = 1;//************

    ADDR1 = 1;//只让小灯显示

    ADDR0 = 0;//************

    P2 = 0xF7;//让K4能具备有被拉低的条件先

     

    while(1)

    {

        KEY_task(); //按键功能任务

        delay_ms(2);//假设这部分是要执行的其他程序

    } 

}


推荐阅读

史海拾趣

骅讯(Cmedia)公司的发展小趣事

进入21世纪后,随着USB技术的普及,骅讯公司迅速抓住市场机遇,进军USB音频业务。凭借其在音频技术领域的深厚积累,骅讯成功开发出多款USB音频产品,并在市场上取得了良好的反响。这一举措不仅拓展了骅讯的业务范围,也为其在音频领域的持续发展奠定了坚实的基础。

CBM_America_Corporation公司的发展小趣事

CBM_America_Corporation在电子行业的初期,专注于研发具有创新性的半导体技术。通过不懈的努力,公司成功开发出一种高效能、低能耗的芯片,受到了市场的广泛欢迎。这一技术突破为公司带来了大量的订单,也吸引了众多投资者的关注。随着资金的注入,CBM开始扩大生产规模,并进军国际市场,逐步成为了电子行业的领军企业。

格瑞宝(GP)公司的发展小趣事

在发展过程中,格瑞宝始终秉持开放合作的理念,积极寻求与行业内外的合作伙伴建立长期稳定的合作关系。例如,公司与唯样商城等元器件线上平台达成战略合作,成为其代理商之一。这一合作不仅进一步扩充了格瑞宝的产品线,也为广大客户提供了更多的产品选择和服务支持。通过合作与共赢的模式,格瑞宝不断拓宽业务边界,提升市场竞争力,实现了更快速的发展。

维峰电子(WCON)公司的发展小趣事

维峰电子(WCON)于2002年在广东成立,由创始人李文化带领的团队共同创立。创业初期,公司面临着资金短缺、技术落后和市场竞争激烈等多重挑战。然而,团队凭借着对电子连接器行业的深刻理解和坚定信念,不断研发新产品,优化生产工艺,逐渐在市场中站稳脚跟。他们通过不懈努力,成功开发出多款具有竞争力的电子连接器产品,为公司后续的发展奠定了坚实基础。

Fairchild Imaging公司的发展小趣事

Fairchild Imaging一直致力于成像技术的创新。在XXXX年,公司成功研发出一款具有划时代意义的图像传感器,该传感器以其高清晰度、低噪声和宽动态范围等特性,赢得了市场的广泛认可。这一技术的突破不仅为Fairchild Imaging赢得了众多客户的青睐,还为公司后续的发展奠定了坚实的基础。

Datatronic公司的发展小趣事

Datatronic公司深知人才是企业发展的核心。因此,公司一直注重人才的培养和引进。公司建立了完善的人才培训体系,为员工提供广阔的发展空间和机会。同时,公司还积极引进国内外优秀人才,为公司的技术创新和市场拓展提供了有力支持。这些举措使得Datatronic公司在人才方面形成了竞争优势。

问答坊 | AI 解惑

μC/OS—II的嵌入式串口通信模块设计

在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上。但μC/OS-II仅是一个 ...…

查看全部问答>

不知道大家的示波器程序进展如何?

不知道大家的程序进展如何?是否可以和大家分享一下呢? [ 本帖最后由 daicheng 于 2009-8-13 16:45 编辑 ]…

查看全部问答>

【藏书阁】射频电路设计理论与应用

目录: 第1章 引言 .. 1.1 射频设计的重要性 .. 1.2 量纲和单位 .. 1.3 频谱 .. 1.4 无源元件的射频特性 .. 〖DW〗1.4.1 高频电阻 .. 〖DW〗1.4.2 高频电容 .. 〖DW〗1.4.3 高频电感 .. 1.5 片状元件及对电路板的考虑 . 1.5.1 片状电阻 ...…

查看全部问答>

监控摄像头监控蔬菜了

上海正全力加强158个迎世博重点蔬菜基地的建设,强化生产基地的监管,建立健全农产品质量安全可追溯体系。闵行区农委世博蔬菜基地除在场区实行全天候巡逻外,还在农田蔬菜大棚和装运车间安装了监控摄像头,实现世博重点蔬菜基地生产和运输过程的有 ...…

查看全部问答>

T9输入法 购买

问下大家:我们想购买T9输入法,但是http://www.t9.com/该产品根本没有提供联系方式呀,只要我留言,但是我留了又发不出去,真急人。有了解的朋友帮帮我哦:)…

查看全部问答>

请各位大侠们帮助,新装的WIN CE 5.0编译出现Invalid parameters passed to Wince.bat问题,怎么解决呀!急死人了,帮帮

小弟刚接触WIN CE ,刚装的WIN CE5.0安装后,新建工程编译出现Invalid parameters passed to Wince.bat问题,而且左边没有 OSDesign View标签.开始安装时因为有文件有2部分,WIN CE文件没有放在同一目录下,之后我将文件移动到了同一目录下,开始以 ...…

查看全部问答>

请版主给个STM32F105/107的USB的otg_fs的例程

                                 ST提供了USB的库,像我这种水平的人写不出程序来,还是要靠例程来理解熟悉的,版主能给个吗?最好是IAR下的.…

查看全部问答>

[提建议]建立一个语音教学及互动平台

[提建议]建立一个语音教学及互动平台 我相信在坛子里面的学生应该不少吧。想在EEWorld里学到一些实践的经验和如何做项目。 我们论坛中已经有了 但是,我觉得我们eeworld是还会有更多的想法和活动的. 如:     链接:https:/ ...…

查看全部问答>

TI ARM 产品全新拓展

TI旗下Cortex M3,A8及ARM9产品线,具有31种全新产品满足您不同的设计需求。 $(\'swf_W93\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\ ...…

查看全部问答>