一、數位管掃描介紹
這個實驗是我們對GPIO輸出功能的一個擴充,用GPIO驅動數位管進行動态掃描,達到顯示數字的目的。本實驗的硬體電路采用一個4位8段共陰數位管。
所謂“4位”指的是數位管上有4個子單元。每個子單元如下圖所示。
所謂“8段”指的是每個子單元由8個發光二極管組成,如上圖所示,八段分别為:A、B、C、D、E、F、G、DP。
數位管按照連接配接方式可以分為共陰數位管和共陽數位管。二者的差別在于每一位的8個發光二極管是陰極連接配接在一起還是陽極連接配接在一起。共陰數位管的陰極連接配接在一起,共陽數位管的陽極連接配接在一起。
共陰數位管的内部原理圖如下圖所示。
數位管的管腳圖如下圖所示。
由以上兩個圖可以看出,雖然4位8段共陰數位管中有32個發光二極管,但是數位管引出的管腳隻有12個。首先是每一位的發光二極管的陰極連接配接在了一起,總共引出了4個陰極。其次,四位的名稱相同的陽極都是連接配接在一起的一共有8個陽極。是以數位管隻有12個管腳。由于數位管的這個構造,4位數位管使用相同的陽極,決定了要想在4位上顯示不同的數字,必須采用掃描的方式來顯示。
數位管掃描的方式是:先給陽極指派需要顯示的第一位的段碼,然後令第一位的陰極為低電平,其餘位為高電平,這樣第一位有顯示;經過一段時間之後,再向陽極指派第二位的段碼,然後令第二位的陰極為低電平,其餘位為高電平,這樣第二位有顯示;同理來顯示第三位和第四位。把顯示的時間間隔調節到适當的值,由于人眼的視覺暫留現象,感覺4位數位管是同時顯示的。共陰數位管顯示數字和字母的段碼如下圖所示。
在本實驗中,數位管的驅動電路的原理圖如下圖所示。
電路中采用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,如此循環。