一,什么是數(shù)碼管
? ? ?數(shù)碼管,其實(shí)就是由多個(gè)led組合在一起的組合顯示塊;有共陰極的,也有共陽極的。使用的數(shù)碼管不同,里面包含的led個(gè)數(shù)也會(huì)有相關(guān)的差異。我們通常使用的數(shù)碼管,里面有8個(gè)led燈,大家可以參照生活中的數(shù)碼管器件就一目了然了,你會(huì)發(fā)現(xiàn),數(shù)碼管顯示的每一個(gè)數(shù)字或字母,都是一段一段組合拼接起來的,并不是像寫的那樣圓滑。其中,組合的每一個(gè)段,就是一個(gè)led燈。
二,點(diǎn)亮一個(gè)數(shù)碼管
? ? ?2.1.在點(diǎn)亮數(shù)碼管之前,你還必須弄清楚,改數(shù)碼管的接是共陰極還是共陽極的接法;其次,還得弄清楚是那幾個(gè)(或一個(gè))? ? IO口是IO口 的斷選位(也就是控制顯示哪一個(gè)數(shù)碼管,通常由IO口控制一個(gè)譯碼器來實(shí)現(xiàn),因?yàn)檫@樣更節(jié)約IO口資源)。
? ? ?2.2.弄清楚斷選位之后,還得知道,是哪些IO口控制我們的數(shù)碼管上的led;
????????比如:
? ? ? ? ? ? P0.0 控制數(shù)碼管上的led.0;(注意:數(shù)碼管上對(duì)應(yīng)的led位,可以參照原理圖上的或查閱相關(guān)資料獲得,這里僅僅舉列)
? ? ? ? ? ? P0.1-->led.1? ? ? ? ? ? ? ? ?P0.2-->led2? ? ? ? ......
? ? ? 2.3.想要點(diǎn)亮數(shù)碼管很容易,只要開啟對(duì)應(yīng)的數(shù)碼管斷選位,再設(shè)置數(shù)碼管上led的值為點(diǎn)亮(有的數(shù)碼管是共陰極接法,有的是共陽極接法,根據(jù)具體的設(shè)計(jì),給出相關(guān)的高或低電平即可)就OK了。但是,我們要在數(shù)碼管上顯示我們想要的數(shù)字增么辦呢?這個(gè)時(shí)候,就是考研創(chuàng)造力的時(shí)候了,有的數(shù)碼管的資料會(huì)直接給出它的真值表,但有的卻不一定找得到。在這個(gè)時(shí)候,我們就得根據(jù)我們想要顯示的數(shù)字,點(diǎn)亮并熄滅對(duì)應(yīng)數(shù)碼管上的led來實(shí)現(xiàn)。(推薦:你可以自己先實(shí)驗(yàn),找出0-9,或其他想要顯示的字符所對(duì)應(yīng)的IO口的值,來保存起來,這樣你就可以重復(fù)利用啦?。?/p>
三,點(diǎn)亮多個(gè)數(shù)碼管
????????3.1 我們想要點(diǎn)亮多個(gè)數(shù)碼管,首先可以根據(jù)2.1,弄清楚你的數(shù)碼管的斷選位,然后周期性的改變斷選位的值,以此動(dòng)態(tài)逐個(gè)顯示你的數(shù)碼管。
????????3.2 在顯示多個(gè)數(shù)碼管時(shí),建議周期大于100hz,這樣人眼難以識(shí)別起關(guān)和開的瞬間,我們看起來就像時(shí)很多個(gè)數(shù)碼管同時(shí)點(diǎn)亮了一樣。
四,動(dòng)態(tài)顯示數(shù)碼管
? ? ? ? 4.1 ,在動(dòng)態(tài)顯示數(shù)碼管的值時(shí),建議先根據(jù)2.2和2.3,把對(duì)應(yīng)的數(shù)碼管顯示參數(shù)照準(zhǔn),并保存下來,這樣你用起來也方便。
? ? ? ? 4.2, 動(dòng)態(tài)顯示數(shù)碼管,我們可以在規(guī)定的時(shí)間周期,改變數(shù)碼管對(duì)應(yīng)led的開關(guān)個(gè)數(shù)來實(shí)現(xiàn),比如說:
? ? ? ? ? ? ? ? 0 在數(shù)碼管中顯示的值為0xc0? ? ? 1是0xf9
? ? ? ?那么我們就可以在規(guī)定的時(shí)間里,切換該值,從而達(dá)到動(dòng)態(tài)效果。
? ? ? ? 4.3 我們應(yīng)該注意的時(shí),掃描數(shù)碼管(即顯示多個(gè)數(shù)碼管)應(yīng)該與設(shè)置數(shù)碼管的值(數(shù)碼管中l(wèi)ed的狀態(tài)更新)區(qū)分開,掃描周期我們可以放短一點(diǎn),而改變它的值的周期我們可以一秒或者是2秒改變一次。
? ? ? ?4.4 消除余暉,大家實(shí)驗(yàn)后,可能會(huì)發(fā)現(xiàn),你顯示的值有的時(shí)候并不是想要的,它會(huì)跳動(dòng)或者是亮滅不清晰,這個(gè)我們就叫做余暉效應(yīng)。
產(chǎn)生余暉效應(yīng)的原因是因?yàn)槟阍谶x則下一個(gè)數(shù)碼管的時(shí)候,還保留了上一個(gè)數(shù)碼管的顯示值,所以我們消除余暉,只需要在改變數(shù)碼管顯示值的時(shí)候,先關(guān)閉所有數(shù)碼管的顯示,在值跟新完成后我們?cè)俅蜷_顯示。這里你不用擔(dān)心關(guān)閉和開啟會(huì)有閃爍,更新值的時(shí)間會(huì)很短,肉眼時(shí)幾乎察覺不到滴。
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è)計(jì)來實(shí)現(xiàn)。
三文原創(chuàng),多謝各位指出不足與錯(cuò)誤。