STC89C52單片機數碼管介紹以及代碼示例


目錄

一,數碼管介紹

二,數碼管引腳定義

我們首先對單個引腳進行說明:

其次,我們對多個引腳管進行說明:

最后我們來詳細說說如何進行位選還有段選

接着是段選

三,數碼管段碼表

四,數碼管驅動方式

五,代碼演示


一,數碼管介紹

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM