变量的存储类别分为主动、静态、寄存器和外部这四种。其间后两种咱们暂不介绍,主要是主动变量和静态变量这两种。
函数中的部分变量,假如不加 staTIc 这个关键字来润饰,都归于主动变量,也叫做动态存储变量。这种存储类别的变量,在调用该函数的时分体系会给他们分配存储空间,在函数调用结束后会主动开释这些存储空间。动态存储变量的关键字是 auto,可是这个关键字是能够省掉的,所以咱们平常都不必。
那么与动态变量对应的便是静态变量。首要,全局变量均是静态变量,此外,还有一种特别的部分变量也是静态变量。即咱们在界说部分变量时前边加上 staTIc 这个关键字,加上这个关键字的变量就称之为静态部分变量,它的特点是,在整个生计期中只赋一次初值,在第一次履行该函数时,它的值便是给定的那个初值,而之后在该函数所有的履行次数中,它的值都是上一次函数履行结束后的值,即它能够坚持前次的履行成果。
有这样一种状况,某个变量只在一个函数中运用,可是咱们却想在函数屡次调用期间坚持住这个变量的值而不丢掉,也便是说在该函数的本次调用中该变量值的改动要依靠与上一次调用函数时的值,而不能每次都从初值开端。假如咱们运用部分动态变量的话,每次进入函数后上一次的值就丢掉了,它每次都从初值开端,假如界说成全局变量的话,又违反了咱们上面说到的尽量削减全局变量的运用这条准则,那么此刻,部分静态变量便是最好的解决方案了。
比方第六章最终的例程中有一个操控数码管动态扫描显现用的索引变量 i,咱们其时便是界说成了全局变量,现在咱们就能够改成部分静态变量来试试。
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = { //数码管显现字符转化表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { //数码管显现缓冲区,初值 0xFF 保证发动时都不亮
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned int cnt = 0;//记载 T0 中止次数
void main(){
unsigned long sec = 0; //记载通过的秒数
EA = 1; //使能总中止
ENLED = 0; //使能 U3,挑选操控数码管
ADDR3 = 1; //由于需求动态改动 ADDR0-2 的值,所以不需求再初始化了
TMOD = 0x01; //设置 T0 为形式 1
TH0 = 0xFC; //为 T0 赋初值 0xFC67,守时 1ms
TL0 = 0x67;
ET0 = 1; //使能 T0 中止
TR0 = 1; //发动 T0
while (1){
if (cnt 》= 1000){ //判别 T0 溢出是否到达 1000 次
cnt = 0; //到达 1000 次后计数值清零
sec++++; //秒计数自加 1
//以下代码将 sec 按十进制位从低到高顺次提取并转为数码管显现字符
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
}
}
/* 守时器 0 中止服务函数 */
void InterruptTImer0() interrupt 1{
staTIc unsigned char i = 0; //动态扫描的索引,界说为部分静态变量
TH0 = 0xFC; //从头加载初值
TL0 = 0x67;
cnt++; //中止次数计数值加 1
//以下代码完结数码管动态扫描改写
P0 = 0xFF; //显现消隐
switch (i){
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; break;
default: break;
}
}
咱们留意看程序中中止函数里的部分变量 i,咱们为其加上了 static 关键字来润饰,就成为了静态部分变量。它的初始化 i = 0 操作只进行一次,程序履行代码中会进行 i++等操作,那么下次再进入中止函数的时分,i 会坚持前次中止函数履行结束后的值。假如去掉 static 这个关键字,那么每次进入中止函数后,i 都会被初始化成 0,咱们能够自己修正程序看一下实际效果是否和理论相符。
责任编辑;zl