历史上的今天

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

正在发生

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

发布者:温馨小筑 关键字:51单片机  静态变量  中断函数 手机看文章 扫描二维码
随时随地手机看文章

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);//假设这部分是要执行的其他程序

    } 

}


关键字:51单片机  静态变量  中断函数 引用地址:51单片机-静态变量

上一篇:51单片机-不支持连按
下一篇:51单片机-支持连按与全局变量

推荐阅读

    北京时间8月18日午间消息,通用汽车前副董事长鲍勃·卢茨(Bob Lutz)周五说,为了特斯拉的利益着想,埃隆·马斯克应该辞职。  “鉴于他最近的表现,我实在想不出有哪个公司投资者或公司的独立董事成员会希望马斯克继续担任特斯拉的首席执行官。”卢茨说。  《纽约时报》周五发布了对马斯克的专访。采访中,马斯克提到过去一年尤其“煎熬”,...
随着社会的不断发展,人们的生活越来越离不开地图导航,无论是开车出行还是到去到陌生的地方,我们都会用到手机地图。然而在众多导航软件中,使用最为广泛的就要属百度地图和高德地图了。但别看都是导航软件,其中差别还真是不小呢。所以,今天小编就来给大家介绍一下,看看哪个更适合你。高速路径规划跑高速使用导航可以说是家常便饭了,高速路径规划就十...
  1、数字万用表是电子测量的一个利器,日常生活中可以用来测量线路的通断。万用表分为数字万用表和指针万用表。一般分为电压档(交流+直流)、电流档(交流+直流)、电阻档。测量通断要用到电阻档,是最简单的功能。  2、我们以一个牙科探针为例进行说明,探针是一个塑料柄,连接有两根金属针,这类似于我们平时的带皮电线,为了判断A点和B点是否导通...
系统时间首先设置一个变量记录系统时间,为了防止溢出使用的是unsigned long long的数据类型,取值范围是0~2^64,计算得到,需要运行50几亿年才会溢出。在定时器中断中累加这个值,可以通过get_system_time_us函数获取系统时间。每来一个时钟脉冲(0.2us一个时钟脉冲)计数器减1,再和系统时间变量结合就可以得到us级的系统时间了。环型缓冲区假设有一个...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved