天天看點

利用單片機講解static關鍵字的作用,C語言和JAVA中都有static關鍵字

學過C語言或者JAVA語言的小夥伴一定都知道static關鍵字。很多初學者對于static關鍵字的作用有點迷惑。

接下來,讓我們通過一個生動的實驗來深刻了解static關鍵字的作用吧。

我将使用單片機+C語言實驗,帶大家體驗static關鍵字的作用。

實驗方式:

點選右下角的第一個按鍵,讓左上角的第一個數位管顯示0

利用單片機講解static關鍵字的作用,C語言和JAVA中都有static關鍵字

下面這段代碼,大家沒必要全部了解,隻要大概看明白我寫的注釋就可以

#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];     
  }
}