文章目錄
- 1、前言
- 2、數碼管
- 3、單個數碼管引腳定義
- 3-1、單個共陰極
- 3-2、單個共陽極
- 3-3、單個數碼管引腳定義
- 4、四位一體數碼管引腳定義
- 4-1、四位一體共陰極數碼管
- 4-2、四位一體共陽極數碼管
- 4-3、四位一體數碼管引腳定義
- 5、數碼管原理圖
- 6、C51數組(補充知識點)
- 7、C51子函數(補充知識點)
- 8、靜態數碼管顯示
- 8-1、基礎版本
- 8-2、數碼管段碼表
- 8-3、靜態數碼管顯示Plus
- 8-4、實驗現象
- 9、動態數碼管顯示
- 9-1、基礎版本
- 9-2、實驗現象
- 9-3、動態數碼管顯示(消影)
- 9-4、實驗現象
- 10、數碼管驅動方式
1、前言
在前面的文章中介紹了51單片機之獨立按鍵控制LED狀態,今天介紹單片機的數碼管,下面將介紹數碼管的顯示其中包含了動態數碼管和靜態數碼管兩種。
2、數碼管
數碼管其實就是由多個發光二極管封裝在一起組成“8”字型的器件當分別點亮這些發光二極管時就可以組成不同的數字顯示出來。
3、單個數碼管引腳定義
3-1、單個共陰極
所有LED的陰極連接在一起,通過控制陽極的高電平來點亮對應的段。
3-2、單個共陽極
所有LED的陽極連接在一起,通過控制陰極的低電平來點亮對應的段。
3-3、單個數碼管引腳定義
數碼管通常由7個或8個LED組成,分別對應數字0到9和英文字母A到F等字符的顯示方式。每個LED可以看作是一個“像素”,通過點亮不同的LED組合,可以展示不同的字符或圖形。
4、四位一體數碼管引腳定義
4-1、四位一體共陰極數碼管
4-2、四位一體共陽極數碼管
4-3、四位一體數碼管引腳定義
舉例說明:假設四位一體數碼管需要顯示數字為()()(1)(),則在Figure6. 四位一體共陰極數碼管途中,將DIG3設置為低電平(置0),DIG1、DIG2、DIG4為高點平(置1);然后引腳7、4設置為高點平(置1),其余引腳(11、2、1、10、5、3)設置為低電平(置0)。
5、數碼管原理圖
從下圖可以知道8個數碼管通過了一個74HC245芯片和單片機的P00-P07相連接。74HC138譯碼器通過P22-P24輸出的相對于的電平選擇控制哪個具體的數碼管。由于3-8譯碼器是輸出低電平有效,則原理圖中的四位一體數碼管是共陰極連接。74HC245芯片主要是用于數據緩沖功能,其中DIR表述傳輸方向,若是高電平,則是將Ax的數據傳輸給Bx;否則,則是將Bx的數據傳輸給Ax。OE表示使能引腳(低電平有效)。
C(P2_4) | B(P2_3) | A(P2_2) | Y | LED |
---|---|---|---|---|
0 | 0 | 0 | Y0 | LED0 |
0 | 0 | 1 | Y1 | LED1 |
0 | 1 | 0 | Y2 | LED2 |
0 | 1 | 1 | Y3 | LED3 |
1 | 0 | 0 | Y4 | LED4 |
1 | 0 | 1 | Y5 | LED5 |
1 | 1 | 0 | Y6 | LED6 |
1 | 1 | 1 | Y7 | LED7 |
6、C51數組(補充知識點)
數組:把相同類型的一系列數據統一編制到某一個組別中,可以通過數組名+索引號簡單快捷的操作大量數據。
int x[3]; //定義一組變量(3個)
int x[]={1,2,3}; //定義一組變量并初始化
x[0] //引用數組的第0個變量
x[1] //引用數組的第1個變量
x[2] //引用數組的第2個變量
引用×[3]時,數組會越界。讀出的數值不確定,應避免這種操作。
7、C51子函數(補充知識點)
子函數:將完成某一種功能的程序代碼單獨抽取出來形成一個不模塊在主函數中可隨時調用此模塊,以達到代碼的復用和優化程序結構的目的。
void Function(unsigned char x, y)
{}
返回值函數名(形參)
{函數體
}
8、靜態數碼管顯示
8-1、基礎版本
#include <REGX52.H>void main()
{unsigned int i = 0;/* Select LED6 to light up. set /Y5. */P2_2 = 1;P2_3 = 0;P2_4 = 1;/* Control LED6 show number(6), set a,c,d,e,f,g. */P0 = 0x7D;while(1){}
}
注意:讓LED6的數碼管顯示數字6,則需要點亮a,c,d,e,f,g等六個端口,則如下圖所示:
8-2、數碼管段碼表
數字 | a | b | c | d | e | f | g | dp | 段碼 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0x3F |
1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0x06 |
2 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0x5B |
3 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0x4F |
4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0x66 |
5 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0x6D |
6 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0x7D |
7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0x07 |
8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0x7F |
9 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0x6F |
A | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0x77 |
B | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0x7C |
C | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0x39 |
D | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0x5E |
E | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0x79 |
F | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0x71 |
None | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0x00 |
8-3、靜態數碼管顯示Plus
#include <REGX52.H>unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};void Nixie(unsigned char Location, Number)
{switch (Location){case 1: P2_4 = 1; P2_3 = 1; P2_2 = 1; break; // LED8case 2: P2_4 = 1; P2_3 = 1; P2_2 = 0; break; // LED7case 3: P2_4 = 1; P2_3 = 0; P2_2 = 1; break; // LED6case 4: P2_4 = 1; P2_3 = 0; P2_2 = 0; break; // LED5case 5: P2_4 = 0; P2_3 = 1; P2_2 = 1; break; // LED4case 6: P2_4 = 0; P2_3 = 1; P2_2 = 0; break; // LED3case 7: P2_4 = 0; P2_3 = 0; P2_2 = 1; break; // LED2case 8: P2_4 = 0; P2_3 = 0; P2_2 = 0; break; // LED1}P0 = NixieTable[Number];
}void main()
{Nixie(2,4);while(1){}}
8-4、實驗現象
9、動態數碼管顯示
9-1、基礎版本
#include <REGX52.H>unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};void DelayMs(unsigned int xms) //@12.000MHz
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}void Nixie(unsigned char Location, Number)
{switch (Location){case 1: P2_4 = 1; P2_3 = 1; P2_2 = 1; break; // LED8case 2: P2_4 = 1; P2_3 = 1; P2_2 = 0; break; // LED7case 3: P2_4 = 1; P2_3 = 0; P2_2 = 1; break; // LED6case 4: P2_4 = 1; P2_3 = 0; P2_2 = 0; break; // LED5case 5: P2_4 = 0; P2_3 = 1; P2_2 = 1; break; // LED4case 6: P2_4 = 0; P2_3 = 1; P2_2 = 0; break; // LED3case 7: P2_4 = 0; P2_3 = 0; P2_2 = 1; break; // LED2case 8: P2_4 = 0; P2_3 = 0; P2_2 = 0; break; // LED1}P0 = NixieTable[Number];
}void main()
{unsigned int i;while(1){for(i = 1; i <= 8; i++){Nixie(i,i+1);DelayMs(i);} }
}
9-2、實驗現象
動態數碼管顯示
9-3、動態數碼管顯示(消影)
#include <REGX52.H>unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};void DelayMs(unsigned int xms) //@12.000MHz
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}void Nixie(unsigned char Location, Number)
{switch (Location){case 1: P2_4 = 1; P2_3 = 1; P2_2 = 1; break; // LED8case 2: P2_4 = 1; P2_3 = 1; P2_2 = 0; break; // LED7case 3: P2_4 = 1; P2_3 = 0; P2_2 = 1; break; // LED6case 4: P2_4 = 1; P2_3 = 0; P2_2 = 0; break; // LED5case 5: P2_4 = 0; P2_3 = 1; P2_2 = 1; break; // LED4case 6: P2_4 = 0; P2_3 = 1; P2_2 = 0; break; // LED3case 7: P2_4 = 0; P2_3 = 0; P2_2 = 1; break; // LED2case 8: P2_4 = 0; P2_3 = 0; P2_2 = 0; break; // LED1}P0 = NixieTable[Number];DelayMs(1);P0 = 0x00;
}void main()
{unsigned int i;while(1){for(i = 1; i <= 8; i++){Nixie(i,i+1);DelayMs(i);} }
}
9-4、實驗現象
動態數碼管顯示(消影)
10、數碼管驅動方式
- 單片機直接掃描:硬件設備簡單,但會耗費大量的單片機CPU時間。
- 專用驅動芯片:內部自帶顯存、掃描電路,單片機只需告訴它顯示什么即可。