數碼管靜態顯示和動態顯示
靜態數碼管是共陽,動態數碼管是共陰???
數碼管
共陽和共陰
分爲:共陰極數碼管和共陽極數碼管,其中共陽極數碼管更爲經常使用。
緣由:
由於數碼管的非公共端每每接 在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個輸入端
原理