-
數位管
多位數位管,即是兩個或兩個以上單個數位管并列集中在一起形成一體的數位管。當多位一體時,它們内部的公共端是獨立的,而負責顯示什麼數字的段線全部是連接配接在一起的,獨立的公共端可以控制多位一體中的哪一位數位管點亮,而連接配接在一起的段線可以控制這個能點亮數位管亮什麼數字,通常我們把公共端叫做“位選線”,連接配接在一起的段線叫做“段選線”有了這兩個線後,通過單片機及外部驅動電路就可以控制任意的數位管顯示。一般一位數位管有10個引腳,二位數位管也是10個引腳,四位數位管是12個引腳。
為了更友善區分段選和位選,請看下原理圖:

如圖為兩個4位一體的數位管,可以看到與8個com相連的是兩個數位管的位選,位選與引腳相連,是以位選控制那個燈亮。段選可以看到a,b,,,,,g并聯到一起。因為是并聯,是以點亮的數位管顯示的數字相同。
- 共陰極數位管和共陽極數位管
圖a數位管管腳圖,圖b是共陽極數位管,圖c是共陰極數位管。
由圖b可知共陽極數位管陽極連接配接在一起,接高電平,陰極對應的各段分别控制。比如要想顯示1,則陰極對應的bc段低電平,其它接高電平,即可顯示。
由圖C可知,共陰極數位管将各個二極管的陰極連接配接在一起(陰極為低電平),而陽極控制各段,比如要顯示1,則bc為高電平,其它各段低電平即可顯示。
共陽極和共陰極數位管對照表:
共陽極數位管對照表(位選位高電平,各段選低電平控制數字顯示)
uchar code table[]={
0xc0,//0
0xf9,//1
0xa4,//2
0xb0,//3
0x99,//4
0x92,//5
0x82,//6
0xf8,//7
0x80,//8
0x90,//9
0x88,//A
0x83,//B
0xc6,//C
0xa1,//D
0x86,//E
0x8e, //F
0x8c, //P
0xc1,//U
0x91,//Y
0x7c,//L
0x00,//全亮
0xff //熄滅
共陰極數位管對照表(位選為低電平,段選為高電平)
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00 //熄滅
};
-
數位管顯示原理
1.靜态顯示
多位數位管依然可以靜态顯示,但是顯示時要麼隻顯示一位數位管,否則一體的多位同時顯示必須時顯示相同内容。當多位數位管應用于某一系統時,它們的“位選”是可獨立控制的,而“段選”是連接配接在一起的,我們可以通過位選信号控制哪幾個數位管亮,而在同一時刻,位選選通的所有數位管上顯示的數字始終都是一樣的,因為它們的段選是連接配接在一起的,是以送入所有數位管的段選的信号都是相同的,那麼他們顯示的數字必定一樣。(換言之,你可以通過位選控制那個數位管亮,但是亮的同時顯示的數字必定相同)
2.動态顯示
位選控制亮不亮,而段選控制顯示數字,那怎樣顯示不同的數字呢?這就利用了人體肉眼觀察的能力。
舉個例子,假設段選1控制第一位數位管數字顯示1,那麼在顯示第二個數位管是段選控制數位管顯示2,而位選控制燈第二位數位管亮,第一位數位管滅。但是給人的感受是第一位數位管并沒有滅(實際已經滅了),因為時間太短人體肉眼無法識别。這樣就會發現數位管動态顯示是向左或向右一位一位點亮。
-
靜态數位管工作原理
靜态數位管原理圖:
因為共陽極數位管,是以位選接的是高電平,要想正常顯示通過控制低電平來控制段選即可。
- 靜态數位管代碼實作:
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8; //重定義全局字元型變量
typedef unsigned int u16; //重定義全局整型變量
u8 code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*利用數組引用數位表(注次數位表為陰極數位表,因為是共陽極數位管,本應使用剛陽極數位管,
為了友善直接将共陰極數位表取反來使用)。code是将數組從ram調到ROM節省空間*/
/*延時函數*/
void dealy(u16 i)
{
while(i--);
}
void main()
{ int i=0;
for(i=0;i<9;i++){
P0=~table[i];//取反是因為使用的是陰極數位表,而取反得陽極數位表
dealy(50000);
}
//p0=~table[0]; 該寫法是固定顯示數字不變的寫法,~table[0]顯示的就為0
}
- 動态數位管工作原理
如圖,位選的控制通過連接配接J16的管腳連接配接138譯碼器,利用138譯碼器控制位選。段選不是有單片機IO直接驅動,而是通過連接配接74HC25晶片連接配接管腳,利用晶片來實作段選。
因為是共陰極數位管,是以位選應接低電平,段選接高電平時,數位管正常顯示。
譯碼器工作原理
可以有真值表觀察,當使能控制都為低電平的情況下,A0A1A2輸入不同電平控制輸出。
例,A0A1A2為000(二進制為0,A為低位,C為高位)對應Y0就輸出低電平,為001(二進制為1)輸出Y1就位高電平。是以就相當于二進制十進制,十進制對應輸出。
74HC25看自己的原理圖即可,不再闡述。
- 動态數位管代碼實作
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8; //重定義全局字元型變量
typedef unsigned int u16; //重定義全局整型變量
u8 code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*利用數組引用數位表(該數位管是共陰極數位管,是以使用共陰極數位表)。code是将數組從ram調到ROM節省空間*/
sbit LSA=P2^2; //ABC分别連接配接單片機的P2^2,P2^3,P2^4管腳
sbit LSB=P2^3;
sbit LSC=P2^4;
/*延時函數*/
void dealy(u16 i)
{
while(i--);
}
/*動态顯示函數
*參數說明
*ABC分别為138譯碼器的輸入端,通過控制輸入端來控制輸出端的高低電平,進而實作對位選的控制
且A為二進制中的低位,C為高位*/
void Display()
{ u16 i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break; //利用138譯碼器來控制位選,當ABC都等于0時,y0為低電平,其餘為高電平
case 1:LSA=1;LSB=0;LSC=0;break; //Y1輸出低電平
case 2:LSA=0;LSB=1;LSC=0;break; //Y2輸出低電平
case 3:LSA=1;LSB=1;LSC=0;break; //Y3輸出低電平
case 4:LSA=0;LSB=0;LSC=1;break; //Y4輸出低電平
case 5:LSA=1;LSB=0;LSC=1;break; //Y5輸出低電平
case 6:LSA=0;LSB=1;LSC=1;break; //Y6輸出低電平
case 7:LSA=1;LSB=1;LSC=1;break; //Y7輸出低電平
}
P0=table[i]; //第i個為低電平決定位選則跳出switch循環,P0提供段選(原理圖可以看出)
dealy(100); // 短暫的延時,達到肉眼看不到的速度,以達到同時顯示效果
P0=0x00; //清零,作用為了下一個顯示不會産生重影
}
}
void main()
{
while(1)
{
Display();
}
}