您的位置 首页 报告

第69节:运用static关键字能够削减全局变量的运用

开场白:本来这一节打算开始讲液晶屏的,但是昨天经过网友任军的点拨,我发现了一个惊天秘密,原来static关键字是这么好的东西我却错过了那

开场白:

原本这一节计划开端讲液晶屏的,可是昨日通过网友“任军”的指点,我发现了一个惊天隐秘,本来static要害字是这么好的东西我却错过了那么多年。曾经就有一些网友诉苦,鸿哥的程序好是好,便是全局变量满天飞,其时我觉得我也没招呀,C言语就全局变量和局部变量,单单靠局部变量必定不可,局部变量每次进入函数内部数值都会被初始化改动,所以我在许多场合也只能靠全局变量了。可是自从昨日知道了static要害字的隐秘后,我茅塞顿开,许多场合只要在局部变量前面加上static要害字,就能够大大削减全局变量的运用了。

这一节要教会我们一个知识点:

我们都知道,一般的局部变量在每次程序履行到函数内部的时分,数值都会被从头初始化,数值会发生变化,不能坚持之前的数值。可是在局部变量加上static要害字后,体系在刚上电的时分就现已把带static的局部变量赋初始值了,从此程序每次进入函数内部,都不会初始化带static要害字的局部变量,它会坚持最近一次被程序履行更改的数值不变,像全局变量相同。跟全局变量仅有的差别是,带static要害字的局部变量的效果域仅仅在函数内部,而一般全局变量的效果域是整个工程。

本程序例程是直接在第八节程序上修正,大大削减了全局变量的运用。具体内容,请看源代码解说。

(1)硬件渠道:

根据朱兆祺51单片机学习板。用矩阵键盘中的S1和S5号键作为独立按键,记得把输出线P0.4一向输出低电平,模仿独立按键的触发地GND。

(2)完成功用:跟前面第八节的功用一模相同,有两个独立按键,每按一个独立按键,蜂鸣器宣布“滴”的一声后就停。

(3)源代码解说如下:

#include “REG52.H”

#define const_voice_short 40

#define const_key_time1 20

#define const_key_time2 20

void initial_myself();

void initial_peripheral();

void delay_long(unsigned int uiDelaylong);

void T0_time();

void key_service();

void key_scan();

sbit key_sr1=P0^0;

sbit key_sr2=P0^1;

sbit key_gnd_dr=P0^4;

sbit beep_dr=P2^7;

unsigned char ucKeySec=0; //一些需要在不同函数之间运用的中心变量,只能用全局变量

unsigned int uiVoiceCnt=0; //一些需要在不同函数之间运用的中心变量,只能用全局变量

void main()

{

initial_myself();

delay_long(100);

initial_peripheral();

while(1)

{

key_service();

}

}

void key_scan()

{

/* 注释一:

(1)我们都知道,一般的局部变量在每次程序履行到函数内部的时分,数值都会被从头初始化,

数值会发生变化,不能坚持之前的数值。

(2)可是在局部变量加上static要害字后,体系在刚上电的时分就现已把带static的局部变量

赋初始值了,从此程序每次进入函数内部,都不会初始化带static要害字的局部变量,它会坚持

最近一次被程序履行更改的数值不变,像全局变量相同。跟全局变量仅有的差别是,带static要害字

的局部变量的效果域仅仅在函数内部,而一般全局变量的效果域是整个工程。

(3)以下这些变量我本来在第八节是用一般全局变量的,现在改成用static的局部变量了,削减了全局变量

的运用,让程序阅览起来愈加简练。我们也能够试试把以下变量的static去掉试试,成果会发现去掉了static后,

按键就不会被触发了。

*/

static unsigned int uiKeyTimeCnt1=0; //带static的局部变量

static unsigned char ucKeyLock1=0;

static unsigned int uiKeyTimeCnt2=0;

static unsigned char ucKeyLock2=0;

if(key_sr1==1)//IO是高电平,阐明按键没有被按下,这时要及时清零一些标志位

{

ucKeyLock1=0; //按键自锁标志清零

uiKeyTimeCnt1=0;//按键去颤动延时计数器清零,此行十分奇妙,是我实战中探索出来的。

}

else if(ucKeyLock1==0)//有按键按下,且是第一次被按下

{

uiKeyTimeCnt1++; //累加守时中止次数

if(uiKeyTimeCnt1>const_key_time1)

{

uiKeyTimeCnt1=0;

ucKeyLock1=1; //自锁按键置位,防止一向触发

ucKeySec=1; //触发1号键

}

}

if(key_sr2==1)

{

ucKeyLock2=0;

uiKeyTimeCnt2=0;

}

else if(ucKeyLock2==0)

{

uiKeyTimeCnt2++;

if(uiKeyTimeCnt2>const_key_time2)

{

uiKeyTimeCnt2=0;

ucKeyLock2=1;

ucKeySec=2;

}

}

}

void key_service()

{

switch(ucKeySec)

{

case 1:

uiVoiceCnt=const_voice_short;

ucKeySec=0;

break;

case 2:

uiVoiceCnt=const_voice_short;

ucKeySec=0;

break;

}

}

void T0_time() interrupt 1

{

TF0=0;

TR0=0;

key_scan();

if(uiVoiceCnt!=0)

{

uiVoiceCnt–;

beep_dr=0;

}

else

{

;

beep_dr=1;

}

TH0=0xf8;

TL0=0x2f;

TR0=1;

}

void delay_long(unsigned int uiDelayLong)

{

unsigned int i;

unsigned int j;

for(i=0;i

{

for(j=0;j<500;j++)

{

;

}

}

}

void initial_myself()

{

key_gnd_dr=0;

beep_dr=1;

TMOD=0x01;

TH0=0xf8;

TL0=0x2f;

}

void initial_peripheral()

{

EA=1;

ET0=1;

TR0=1;

}

总结陈词:

下一节开端讲液晶屏显现方面的内容。欲知概况,请听下回分解—-带字库12864液晶屏的常用点阵字体程序。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/262041.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部