數碼管顯示


靜態數碼管是共陽,動態數碼管是共陰???

數碼管

共陽和共陰

分爲:共陰極數碼管和共陽極數碼管,其中共陽極數碼管更爲經常使用。
緣由:
由於數碼管的非公共端每每接 在IC 芯片的IO上,而IC 芯片的驅動能力
每每是比較小的,若是採用共陰極數碼 管,它的驅動端在非公共端,就有可能受限於IC芯片輸出電流不夠而顯示昏
暗(比 如51單片機),要外加上拉電阻或者是三極管加大驅動能力。因此使用共陽數碼59
管的好處是:將驅動數碼管的工做交到公共端(通常接驅動電源),加大驅動電 源的功率天然要比加
大IC芯片IO口的驅動電流簡單許多。另外一方面,這樣也能減 輕MCU的負擔。





數組

段選和位選

段選:能夠理解爲數碼管內部有八個發光二極管,段選就是讓選中的那一段發光二極管發光。
位選:針對一排數碼管,位選就是讓選中的數碼管起做用。
函數

數碼管靜態顯示

原理

顯示原理:靠點亮內部的發光二極管來發光。本器材爲共陽極數碼管。與之鏈接的JP3端口須要處於低電平(0),纔會讓對應的發光二極管亮。
在這裏插入圖片描述
a,b,c,d,e,f,g,DP八個發光二極管對應JP3的八個端口,當與之對應的端口處於低電平0時,這個發光二極管就會亮。
例如:當a,b,c,d,e,f爲0時,數碼管就會顯示0


spa

單位數碼管:內部有8個發光二極管 ,有10個引腳 ,第3和第8引腳鏈接在一塊兒code

代碼實現

爲何不須要消隱???blog

/************靜態數碼管——流動顯示0——9***********/ 
 
#include <reg52.h>

//數組1按位取反以後就是數組2 ~按位取反符號

//此數組流動顯示數字0——9
unsigned char code DIG_CODE_1[10]={ 0x3F, 0x06, 0x5B, 0x4F, 0x66,
 0x6D, 0x7D, 0x07,0x7F, 0x6F};//此數組需每位取反後才能成功顯示

unsigned char code DIG_CODE_2[10]={ 0xC0, 0xF9, 0xA4, 0xB0,
 0x99, 0x92, 0x82, 0xF8,0x80, 0x90};

//被調函數原型說明
void delay(unsigned int t);   

//主函數
void main()
{ 
 	unsigned int i;
	while(1)
	{ 
	 	for(i=0;i<=9;i++)
		{ 
			P0=DIG_CODE_2[i];
			// P0=~DIG_CODE_1[i]; 
			//若是要用1數組來個P0賦值那麼就須要按位取反
			delay(30);
		}
		i=0;
	}
}

//被調函數
//延時函數delay(),時間與t有關。當t=50時,延時10ms
void delay(unsigned int t)
{ 
 	int a, b;
    for (;t>0;t--)	   	// t已經在傳遞過來的時候已經賦值了,//
                         //因此在for語句第一句就不用賦值了--//
	{ 
		for (b=38;b>0;b--)
		{ 
			for (a=130;a>0;a--);
		}          
	} 
}

數碼管動態顯示

一排數碼管同時亮也是利用動態效應,一次只能亮一個數碼管,當間隔小了,人眼就會當作這一排數碼管都亮了。圖片

方法一:使用數碼管段選和位選

原理

P0接數碼管段選,P1接數碼管位選
P1控制哪一個數碼管能亮,P0控制亮的數碼管顯示什麼數字。
例如:P1=1111 1110,那麼就是對應的第一個數碼管能亮(最左邊的那個),P0=0x3f,這個數碼管顯示的數字爲0.

原型

代碼

這段代碼是讓一排數碼管都顯示數字
j=10;while(j–);
這段代碼的做用時短暫延時,假設沒有這段代碼,每一個數碼管就會瞬間熄滅,這一排看到的亮度就會比較暗,效果差。
若是加了這個延時,這一排數碼管的亮度就會比較亮。
若是繼續延長這個時間,例如j=10000那麼看到的效果就會是一個個數碼管分別亮,由於間隔時間過長,動態效應就沒法起做用了。
P0 = 0x00;
消隱 若是不消隱就會顯示模糊





class

消隱與不消隱的區別:(以下圖)
在這裏插入圖片描述
在這裏插入圖片描述

變量

#include<reg51.h>

//--定義全局變量--//
unsigned char code DIG_PLACE[8] = { 
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位選控制 查表的方法控制

unsigned char code DIG_CODE[17] = { 
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、一、二、三、四、五、六、七、八、九、A、b、C、d、E、F的顯示碼
//共陰極,高電平有效

unsigned char DisplayData[8];
//用來存放要顯示的8位數的值

//--聲明全局函數--//
void DigDisplay(); //動態顯示函數


void main(void)
{ 
	unsigned char i;

	for(i=0; i<8; i++)
	{ 
		DisplayData[i] = DIG_CODE[i];	
	}
	while(1)
	{ 
		DigDisplay();
	}				
}


void DigDisplay()
{ 
	unsigned char i;
	unsigned int j;

	for(i=0; i<8; i++)
	{ 
		P1 = DIG_PLACE[i];	 //發送位選
		P0 = DisplayData[i];     //發送段碼
		//若是沒有這個延時就會瞬間熄滅,看到的就比較暗
		j = 10;						 //掃描間隔時間設定 若是改爲10000就能看到一個一個數碼管亮了
		while(j--);	
		P0 = 0x00;//消隱 若是不消隱就會模糊
	}
}

方法二:38譯碼器

38譯碼器——3通道輸入,三通道輸出

原理

原理與上面基本類似,P0接數碼管段選,不一樣的是位選是由38譯碼器的3個端口來決定(再也不由數碼管位選的端口來決定)
經過A B C這三個端口來控制哪個數碼管起做用。
A B C就是38譯碼器的3個輸入端
在這裏插入圖片描述


原理

代碼

相關文章
相關標籤/搜索