天天看點

飛思卡爾16位單片機(十一)—— 數位管動态掃描測試

一、數位管掃描介紹

        這個實驗是我們對GPIO輸出功能的一個擴充,用GPIO驅動數位管進行動态掃描,達到顯示數字的目的。本實驗的硬體電路采用一個4位8段共陰數位管。

       所謂“4位”指的是數位管上有4個子單元。每個子單元如下圖所示。

飛思卡爾16位單片機(十一)—— 數位管動态掃描測試

       所謂“8段”指的是每個子單元由8個發光二極管組成,如上圖所示,八段分别為:A、B、C、D、E、F、G、DP。

       數位管按照連接配接方式可以分為共陰數位管和共陽數位管。二者的差別在于每一位的8個發光二極管是陰極連接配接在一起還是陽極連接配接在一起。共陰數位管的陰極連接配接在一起,共陽數位管的陽極連接配接在一起。

        共陰數位管的内部原理圖如下圖所示。

飛思卡爾16位單片機(十一)—— 數位管動态掃描測試

數位管的管腳圖如下圖所示。

飛思卡爾16位單片機(十一)—— 數位管動态掃描測試

       由以上兩個圖可以看出,雖然4位8段共陰數位管中有32個發光二極管,但是數位管引出的管腳隻有12個。首先是每一位的發光二極管的陰極連接配接在了一起,總共引出了4個陰極。其次,四位的名稱相同的陽極都是連接配接在一起的一共有8個陽極。是以數位管隻有12個管腳。由于數位管的這個構造,4位數位管使用相同的陽極,決定了要想在4位上顯示不同的數字,必須采用掃描的方式來顯示。

        數位管掃描的方式是:先給陽極指派需要顯示的第一位的段碼,然後令第一位的陰極為低電平,其餘位為高電平,這樣第一位有顯示;經過一段時間之後,再向陽極指派第二位的段碼,然後令第二位的陰極為低電平,其餘位為高電平,這樣第二位有顯示;同理來顯示第三位和第四位。把顯示的時間間隔調節到适當的值,由于人眼的視覺暫留現象,感覺4位數位管是同時顯示的。共陰數位管顯示數字和字母的段碼如下圖所示。

飛思卡爾16位單片機(十一)—— 數位管動态掃描測試

在本實驗中,數位管的驅動電路的原理圖如下圖所示。

飛思卡爾16位單片機(十一)—— 數位管動态掃描測試

電路中采用4個三極管,對4位數位管的共陰極進行控制,當輸入為高電平時,三極管導通,對應的陰極接地。

二、例程測試

        在這個實驗的例程中,采用ECT的輸出比較功能進行定時,每隔5ms進入一次中斷函數,對數位管進行掃描,中斷函數的代碼如下所示

interrupt void scan(void)
{
  if(ECT_TFLG1_C0F == 1)
  {
    ECT_TFLG1_C0F = 1;
    ECT_TC0 = ECT_TCNT + 1250;         //設定輸出比較時間為5ms
  }
  switch(single)
  {
    case 1:
      CONT1 = 1;
      CONT2 = 0;
      CONT3 = 0;
      CONT4 = 0;
      DATA=shuma[data1];
      break;

    case 2:
      CONT1 = 0;
      CONT2 = 1;
      CONT3 = 0;
      CONT4 = 0;
      DATA=shuma[data2];
      break;

    case 3:
      CONT1 = 0;
      CONT2 = 0;
      CONT3 = 1;
      CONT4 = 0;
      DATA=shuma[data3];
      break;

    case 4:
      CONT1 = 0;
      CONT2 = 0;
      CONT3 = 0;
      CONT4 = 1;
      DATA=shuma[data4];
      break;
    
    default:
      break;
  }
  
  single +=1;
  if(single == 5) single = 1;
}
           

在這段代碼中,CONT1、CONT2、CONT3、CONT4為4位數位管的共陰極驅動三極管的控制端,高電平則相應的數位管陰極接地。single為标志位,表示的是顯示哪路數位管。每個周期變換一次取值,對1~4位數位管進行掃描。shuma[ ]數組中儲存的是數字對應的斷碼,DATA是數位管陽極對應的GPIO的資料寄存器,将斷碼指派給相應的寄存器,就會顯示相應的數字。data1~data4分别存儲了需要顯示的數字的數值。

        程式的主函數如下所示。

void main(void) {
  DisableInterrupts; 
  INIT_PLL();
  initialize_ect();
  INIT_port();
  LEDCPU_dir=1;
  LEDCPU=0;
  EnableInterrupts;

  ECT_TFLG1_C0F = 1;
  ECT_TC0 = ECT_TCNT + 1250;         //設定輸出比較時間為5ms
 
  for(;;) {
    data1 = 1;
    data2 = 2;
    data3 = 3;
    data4 = 4;
    delay(); 
  
    data1 = 5;
    data2 = 6;
    data3 = 7;
    data4 = 8;
    delay(); 
  }
}
           

在主循環中,将data1~data4指派為1~4或5~8,并延時。

将程式下載下傳到單片機中,并執行,可以看到數位管顯示1、2、3、4,過一段時時間顯示5、6、7、8,然後又顯示1、2、3、4,如此循環。

繼續閱讀