一,什么是數(shù)碼管
? ? ?數(shù)碼管,其實就是由多個led組合在一起的組合顯示塊;有共陰極的,也有共陽極的。使用的數(shù)碼管不同,里面包含的led個數(shù)也會有相關(guān)的差異。我們通常使用的數(shù)碼管,里面有8個led燈,大家可以參照生活中的數(shù)碼管器件就一目了然了,你會發(fā)現(xiàn),數(shù)碼管顯示的每一個數(shù)字或字母,都是一段一段組合拼接起來的,并不是像寫的那樣圓滑。其中,組合的每一個段,就是一個led燈。
二,點亮一個數(shù)碼管
? ? ?2.1.在點亮數(shù)碼管之前,你還必須弄清楚,改數(shù)碼管的接是共陰極還是共陽極的接法;其次,還得弄清楚是那幾個(或一個)? ? IO口是IO口 的斷選位(也就是控制顯示哪一個數(shù)碼管,通常由IO口控制一個譯碼器來實現(xiàn),因為這樣更節(jié)約IO口資源)。
? ? ?2.2.弄清楚斷選位之后,還得知道,是哪些IO口控制我們的數(shù)碼管上的led;
????????比如:
? ? ? ? ? ? P0.0 控制數(shù)碼管上的led.0;(注意:數(shù)碼管上對應(yīng)的led位,可以參照原理圖上的或查閱相關(guān)資料獲得,這里僅僅舉列)
? ? ? ? ? ? P0.1-->led.1? ? ? ? ? ? ? ? ?P0.2-->led2? ? ? ? ......
2.3.想要點亮數(shù)碼管很容易,只要開啟對應(yīng)的數(shù)碼管斷選位,再設(shè)置數(shù)碼管上led的值為點亮(有的數(shù)碼管是共陰極接法,有的是共陽極接法,根據(jù)具體的設(shè)計,給出相關(guān)的高或低電平即可)就OK了。但是,我們要在數(shù)碼管上顯示我們想要的數(shù)字增么辦呢?這個時候,就是考研創(chuàng)造力的時候了,有的數(shù)碼管的資料會直接給出它的真值表,但有的卻不一定找得到。在這個時候,我們就得根據(jù)我們想要顯示的數(shù)字,點亮并熄滅對應(yīng)數(shù)碼管上的led來實現(xiàn)。(推薦:你可以自己先實驗,找出0-9,或其他想要顯示的字符所對應(yīng)的IO口的值,來保存起來,這樣你就可以重復(fù)利用啦?。?/p>
三,點亮多個數(shù)碼管
????????3.1 我們想要點亮多個數(shù)碼管,首先可以根據(jù)2.1,弄清楚你的數(shù)碼管的斷選位,然后周期性的改變斷選位的值,以此動態(tài)逐個顯示你的數(shù)碼管。
????????3.2 在顯示多個數(shù)碼管時,建議周期大于100hz,這樣人眼難以識別起關(guān)和開的瞬間,我們看起來就像時很多個數(shù)碼管同時點亮了一樣。
四,動態(tài)顯示數(shù)碼管
? ? ? ? 4.1 ,在動態(tài)顯示數(shù)碼管的值時,建議先根據(jù)2.2和2.3,把對應(yīng)的數(shù)碼管顯示參數(shù)照準,并保存下來,這樣你用起來也方便。
? ? ? ? 4.2, 動態(tài)顯示數(shù)碼管,我們可以在規(guī)定的時間周期,改變數(shù)碼管對應(yīng)led的開關(guān)個數(shù)來實現(xiàn),比如說:
? ? ? ? ? ? ? ? 0 在數(shù)碼管中顯示的值為0xc0? ? ? 1是0xf9
? ? ? ?那么我們就可以在規(guī)定的時間里,切換該值,從而達到動態(tài)效果。
? ? ? ? 4.3 我們應(yīng)該注意的時,掃描數(shù)碼管(即顯示多個數(shù)碼管)應(yīng)該與設(shè)置數(shù)碼管的值(數(shù)碼管中l(wèi)ed的狀態(tài)更新)區(qū)分開,掃描周期我們可以放短一點,而改變它的值的周期我們可以一秒或者是2秒改變一次。
? ? ? ?4.4 消除余暉,大家實驗后,可能會發(fā)現(xiàn),你顯示的值有的時候并不是想要的,它會跳動或者是亮滅不清晰,這個我們就叫做余暉效應(yīng)。
產(chǎn)生余暉效應(yīng)的原因是因為你在選則下一個數(shù)碼管的時候,還保留了上一個數(shù)碼管的顯示值,所以我們消除余暉,只需要在改變數(shù)碼管顯示值的時候,先關(guān)閉所有數(shù)碼管的顯示,在值跟新完成后我們再打開顯示。這里你不用擔心關(guān)閉和開啟會有閃爍,更新值的時間會很短,肉眼時幾乎察覺不到滴。
5,示列代碼
/*
芯片:stc89c52
器件:38譯碼器等
編譯環(huán)境:UV4,C語言
*/
#include<reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};//數(shù)碼管顯示值真值表緩存數(shù)組
unsigned char LedBuff[6] = {
0xff,0xff,0xff,0xff,0xff,0xff
};//數(shù)碼管顯示值緩存數(shù)組
void main()
{
unsigned char i =0;
unsigned int cnt = 0;
unsigned long sec = 0;
ENLED = 0;
ADDR3 = 1;
TMOD = 0x01;
TH0 = 0xfc;
TL0 = 0x67;
TR0 = 1;
while(1)
{
if(TF0==1)
{
TF0 = 0;
TH0 = 0xfc;
TL0 = 0x67;
cnt++;
if(cnt>=1000)
{
cnt = 0;
sec++;
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
switch(i)
{
case 0:ENLED = 1;ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=LedBuff[0];ENLED = 0;break;
case 1:ENLED = 1;ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=LedBuff[1];ENLED = 0;break;
case 2:ENLED = 1;ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=LedBuff[2];ENLED = 0;break;
case 3:ENLED = 1;ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=LedBuff[3];ENLED = 0;break;
case 4:ENLED = 1;ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=LedBuff[4];ENLED = 0;break;
case 5:ENLED = 1;ADDR2=1;ADDR1=0;ADDR0=1;i=0;P0=LedBuff[5];ENLED = 0;break;
default:break;
}
}
}
}
以上代碼,僅供參考,您需要根據(jù)自己原理圖的設(shè)計來實現(xiàn)。
三文原創(chuàng),多謝各位指出不足與錯誤。