在點亮了LED后,我們來到了數碼管。
關於數碼管,我只會用數碼管鎖存器點亮數碼管,應該還有其他方法,請大神指點。
我們來看一看清翔51板的原理圖的數碼管部分:

我們看到這個數碼管由兩部分組成,其中鎖存器模塊又有兩個74HC573鎖存器。
74HC573鎖存器又是干什么的呢?
當LE輸入高電平時,D端和Q端是同步的,當LE輸入低電平時,Q端的狀態會被鎖定,那么我們就可以通過這個特性來控制數碼管。
通過觀察引腳,我們發現編號為U8的鎖存器管理的是位選,也就是選擇哪個8字形的單位量。(這里解釋的不是很專業)
而編號為U9的鎖存器管理的是段選,也就是控制最小單位的LED的。
通過下面的圖我們就可以進行段選。

也就是說我們要第一個數碼管顯示1,就對P0賦值0x06(00000110)。
以此類推。
代碼如下:
#include<reg51.h> sbit wela = P2^7; sbit dula = P2^6; void main() { wela = 1; P0 = 0xFE; wela = 0; dula = 1; P0 = 0x06; dula = 0; while(1); }
那么代碼的第二行和第三行是什么意思呢?
讓我們來觀察下面的圖:

我們可以發現鎖存器上的LE分別是由P2.7和P2.6控制的。
下面是從0到9對應的16進制:
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
這是段選對應的數組:unsigned int code table[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,0x77,0x7c,0x39,0x5E,0x79,0x71,0x76,0x38,0x37,0x3E,0x40,0x00};
0 1 2 3 4 5 6 7 8 9 A B C D E F H L n u - 熄滅
這是位選對應的數組:unsigned int code duan[10] = {0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
下面是函數:對應的是(段選,位選)
void digitaltube(unsigned int du,unsigned int num) { if(num == 0) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[0]; DU = 0; } if(num == 1) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[1]; DU = 0; } if(num == 2) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[2]; DU = 0; } if(num == 3) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[3]; DU = 0; } if(num == 4) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[4]; DU = 0; } if(num == 5) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[5]; DU = 0; } if(num ==6) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[6]; DU = 0; } if(num == 7) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[7]; DU = 0; } if(num == 8) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[8]; DU = 0; } if(num == 9) { P0 = 0xFF; WE = 1; P0 = duan[du]; WE = 0; DU = 1; P0 = table[9]; DU = 0; } }
