目錄
一,數碼管介紹
LED數碼管:數碼管是一種簡單、廉價的顯示器,是由多個發光二極管封裝在一起組成“8”字型的器件
二,數碼管引腳定義
我們首先對單個引腳進行說明:
數碼管分為共陽極連接和共陰極連接兩種:
1,共陰極連接就是說3,8這一頭連得是負極,所以在下面的那頭給上高電平(即置1)就可以使二極管發光
2,共陽極連接就是說3,8這一頭連得是正極,所以在下面的那頭給上低電平(即置0)就可以使二極管發光
注意:在實際編寫代碼的時候這一點一定要搞清楚,或者進行實驗后發現亮光的二極管的位置和預想的不對,那么對賦值的I/O口使用取反符號~也行
其次,我們對多個引腳管進行說明:

在這里的顯示方式我們簡單的歸納為這么幾步:位選 段選 清零 位選 段選 清零
首先說明什么是掃描數碼管,我們發現,數碼管在構造時為了節省端口(單片機就40個引腳,不能全用來顯示數碼管吧,嘿嘿)把一排的數碼管端口都共用了,所以為了同時顯示四個數字,我們是不是得這樣:
1,先在DIG1,DIG2,DIG3,DIG4,選一個
2,在端口用二進制代碼或者十六進制代碼顯示我們想要顯示的字符
3,最后將端口清零,就是全滅,因為端口是共用的,所以這樣可以避免掃描過快時,第二個位置也顯示相同的字符;
最后利用定時器以很快地速度重復這三個步驟,就可以實現數碼管的掃描操作了
然后我們之前解釋的顯示方式就一一對應了即1就表示位選,2就表示段選,3,就表示清零。
最后我們來詳細說說如何進行位選還有段選
首先還是由於節省I/O口的原因,所以在這里我們在位選的時候要用到這個74HC138譯碼器:
他的所用很簡單,看圖就可以知道,他是將p22,p23,p24三個引腳轉換為LED1到LED8,這8個接口,剛剛好來控制我們板子上從左到右的8位數碼管

接着是段選
就比較方便:可以看到下面的原理圖上每個“8”字型的數碼管上都有a,b,c,d,e,f,g,dp接口,分別對應的是P0_0到P0_7的8個接口。這里根據調試發現數碼管是共陰極。所以置P0_0到P0_7為1即可 
三,數碼管段碼表
鑒於數碼管的特殊構造,所以只能顯示一部分字母
四,數碼管驅動方式
在本節我們所說的數碼管的驅動實際上是由軟件(代碼)來驅動的,但是一但有比數碼管更加高的優先級的硬件時,我們就需要“外掛”即自帶驅動掃描芯片的數碼管顯示器

五,代碼演示
在8,7,6位置分別連續顯示1,2,3
#include <REGX52.H>
void xianshi(unsigned char location,number);
void Delay1ms(unsigned int xms) ;
void main()
{
while(1){
xianshi(8,1);
xianshi(7,2);
xianshi(6,3);
}
}
void xianshi(unsigned char location,number){
switch(location){
case 1: P2_4=0;P2_3=0;P2_2=0; break;
case 2: P2_4=0;P2_3=0;P2_2=1; break;
case 3: P2_4=0;P2_3=1;P2_2=0; break;
case 4: P2_4=0;P2_3=1;P2_2=1; break;
case 5: P2_4=1;P2_3=0;P2_2=0; break;
case 6: P2_4=1;P2_3=0;P2_2=1; break;
case 7: P2_4=1;P2_3=1;P2_2=0; break;
case 8: P2_4=1;P2_3=1;P2_2=1; break;
}
switch (number){
case 0: P0=0x3F ; break;//0011 1111
case 1: P0=0x06 ; break;//0000 0110
case 2: P0=0x5B ; break;//0101 1011
case 3: P0=0x4F ; break;//0100 1111
case 4: P0=0x66 ; break;//0110 0110
case 5: P0=0x6D ; break;//0110 1101
case 6: P0=0x7D ; break;//0111 1101
case 7: P0=0x07 ; break;//0000 0111
case 8: P0=0x7F ; break;//0111 1111
case 9: P0=0x6F ; break;//0110 1111
}
Delay1ms(1);
P0=0x00;
}
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms){
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
xms--;
}
}


