學過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];
}
}