利用单片机讲解static关键字的作用,C语言和JAVA中都有static关键字

学过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,那么当这个方法再次被执行时,这个变量将不会再次被初始化,而是保持方法上回执行时产生的值。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值