數碼管靜態顯示和動態顯示
- 數碼管
- 共陽和共陰
- 段選和位選
- 數碼管靜態顯示
- 原理
- 代碼實作
- 數碼管動態顯示
- 方法一:使用數碼管段選和位選
- 原理
- 代碼
- 方法二:38譯碼器
- 38譯碼器——3通道輸入,三通道輸出
- 原理
- 代碼
靜態數碼管是共陽,動態數碼管是共陰???
數碼管
共陽和共陰
分為:共陰極數碼管和共陽極數碼管,其中共陽極數碼管更為常用,
原因:
因為數碼管的非公共端往往接 在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
單位數碼管:內部有8個發光二極管 ,有10個引腳 ,第3和第8引腳連接在一起
代碼實作
為什么不需要消隱???
/************靜態數碼管——流動顯示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;
消隱 如果不消隱就會顯示模糊
消隱與不消隱的區別:(如下圖)


#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、1、2、3、4、5、6、7、8、9、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個輸入端

代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/224359.html
標籤:其他
