栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/892455.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号