学过C语言或者JAVA语言的小伙伴一定都知道static关键字。很多初学者对于static关键字的作用有点迷惑。
接下来,让我们通过一个生动的实验来深刻理解static关键字的作用吧。
我将使用单片机+C语言实验,带大家体验static关键字的作用。
实验方式:
点击右下角的第一个按键,让左上角的第一个数码管显示0
下面这段代码,大家没必要全部理解,只要大概看明白我写的注释就可以
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
//共阴极数码管显示 0~F 的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#define KEY_MATRIX_PORT P1
#define SMG_A_DP_PORT P0
//延时函数,输入1,大概延时10us
void delay(u16 ten_us)
{
while(ten_us--);
}
//此方法用于获取,按下的按键的序号,这个方法的写法不用看,只要知道这个方法是用来获取按下按键的序号就可以了
u8 key_matrix_flip_scan(void)
{
//主要看这里的static关键字
//主要看这里的static关键字
//主要看这里的static关键字
static u8 key_value = 0;//主要看这里的static关键字
KEY_MATRIX_PORT = 0x0f;
if(KEY_MATRIX_PORT != 0x0f)
{
delay(1000);
//测试列
KEY_MATRIX_PORT=0x0f;
switch(KEY_MATRIX_PORT)//保存行为 0,按键按下后的列值
{
case 0x07: key_value=1;break;
case 0x0b: key_value=2;break;
case 0x0d: key_value=3;break;
case 0x0e: key_value=4;break;
}
//测试行
KEY_MATRIX_PORT=0xf0;
switch(KEY_MATRIX_PORT)//保存列为 0,按键按下后的键值
{
case 0x70: key_value=key_value;break;
case 0xb0: key_value=key_value+4;break;
case 0xd0: key_value=key_value+8;break;
case 0xe0: key_value=key_value+12;break;
}
while(KEY_MATRIX_PORT!=0xf0);
}
return key_value;
}
//主函数,程序的执行入口
void main()
{
u8 key = 0;
while(1)
{
//不断的调用检测按下按键序号的方法,获取按下按键的序号。
key= key_matrix_flip_scan();
//让数码管显示对应序号的方法
SMG_A_DP_PORT=gsmg_code[key-1];
}
}
在key_matrix_flip_scan()方法中,变量key_value一开始被定义,然后作为返回值返回,return key_value。
接下里我们来看一下key_matrix_flip_scan()方法中,变量static u8 key_value = 0;带static关键字时的,实验效果。
可以看到,按钮按下后,数码管一直持续显示0。
单片机矩阵键盘点亮数码管,代码加static效果
再来看一下把static关键字去掉的效果
单片机矩阵键盘点亮数码管,代码不加static效果
可以看到,按钮按下后,数码管显示了一下,立即熄灭了。
我们来分析一下为什么会这样
首先看下面代码中的main函数,利用while循环,不断执行key_matrix_flip_scan()方法。
当key_matrix_flip_scan()方法中的static u8 key_value = 0;带static关键字时,当我们按下第一个按键时,key_matrix_flip_scan()方法检测到我们按下按键,返回key_value为1,接着调用SMG_A_DP_PORT=gsmg_code[key-1];让数码管显示0;
当key_value=1时,数码管显示0,当key_value=0时,数码管不亮。
此时注意,如果我们加了static关键字,那么当再次循环调用key_matrix_flip_scan()方法时,不会再对key_value执行赋值0的操作,而是保留之前值,所以数码管可以继续显示0;
如果我们把static关键字去掉,那么每回循环执行key_matrix_flip_scan()方法时,都会执行u8 key_value = 0;初始化key_value的值为0。也就是说,当我们按下按键时,key_matrix_flip_scan()返回key_value=1,但当再次调用key_matrix_flip_scan()方法时,又初始化key_value的值为0。当key_value=1时,数码管显示0,当key_value=0时,数码管不亮。所以出现了亮了一下就熄灭的实验现象。
u8 key_matrix_flip_scan(void)
{
static u8 key_value = 0;//主要看这里的static关键字
KEY_MATRIX_PORT = 0x0f;
if(KEY_MATRIX_PORT != 0x0f)
{
delay(1000);
//测试列
KEY_MATRIX_PORT=0x0f;
、、、、、、
while(KEY_MATRIX_PORT!=0xf0);
}
return key_value;
}
//主函数,程序的执行入口
void main()
{
u8 key = 0;
while(1)
{
//不断的调用检测按下按键序号的方法,获取按下按键的序号。
key= key_matrix_flip_scan();
//让数码管显示对应序号的方法
SMG_A_DP_PORT=gsmg_code[key-1];
}
}
总结:
static关键字的作用,如果一个方法中的变量被定义为static,那么当这个方法再次被执行时,这个变量将不会再次被初始化,而是保持方法上回执行时产生的值。