一著拭,什么是數(shù)碼管
? ? ?數(shù)碼管纱扭,其實(shí)就是由多個(gè)led組合在一起的組合顯示塊;有共陰極的儡遮,也有共陽(yáng)極的乳蛾。使用的數(shù)碼管不同,里面包含的led個(gè)數(shù)也會(huì)有相關(guān)的差異鄙币。我們通常使用的數(shù)碼管肃叶,里面有8個(gè)led燈,大家可以參照生活中的數(shù)碼管器件就一目了然了十嘿,你會(huì)發(fā)現(xiàn)因惭,數(shù)碼管顯示的每一個(gè)數(shù)字或字母,都是一段一段組合拼接起來(lái)的绩衷,并不是像寫的那樣圓滑蹦魔。其中激率,組合的每一個(gè)段,就是一個(gè)led燈版姑。
二柱搜,點(diǎn)亮一個(gè)數(shù)碼管
? ? ?2.1.在點(diǎn)亮數(shù)碼管之前迟郎,你還必須弄清楚剥险,改數(shù)碼管的接是共陰極還是共陽(yáng)極的接法;其次宪肖,還得弄清楚是那幾個(gè)(或一個(gè))? ? IO口是IO口 的斷選位(也就是控制顯示哪一個(gè)數(shù)碼管表制,通常由IO口控制一個(gè)譯碼器來(lái)實(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ù)碼管很容易慨仿,只要開(kāi)啟對(duì)應(yīng)的數(shù)碼管斷選位久脯,再設(shè)置數(shù)碼管上led的值為點(diǎn)亮(有的數(shù)碼管是共陰極接法,有的是共陽(yáng)極接法镰吆,根據(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來(lái)實(shí)現(xiàn)。(推薦:你可以自己先實(shí)驗(yàn)佳励,找出0-9休里,或其他想要顯示的字符所對(duì)應(yīng)的IO口的值,來(lái)保存起來(lái)赃承,這樣你就可以重復(fù)利用啦C钍颉)
三,點(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)和開(kāi)的瞬間怕品,我們看起來(lái)就像時(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)吼和,并保存下來(lái)涨薪,這樣你用起來(lái)也方便。
? ? ? ? 4.2炫乓, 動(dòng)態(tài)顯示數(shù)碼管刚夺,我們可以在規(guī)定的時(shí)間周期,改變數(shù)碼管對(duì)應(yīng)led的開(kāi)關(guān)個(gè)數(shù)來(lái)實(shí)現(xiàn)末捣,比如說(shuō):
? ? ? ? ? ? ? ? 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ū)分開(kāi),掃描周期我們可以放短一點(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è)俅蜷_(kāi)顯示拉盾。這里你不用擔(dān)心關(guān)閉和開(kāi)啟會(huì)有閃爍,更新值的時(shí)間會(huì)很短豁状,肉眼時(shí)幾乎察覺(jué)不到滴捉偏。
5倒得,示列代碼
/*
芯片:stc89c52
器件:38譯碼器等
編譯環(huán)境:UV4,C語(yǔ)言
*/
#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ì)來(lái)實(shí)現(xiàn)。
三文原創(chuàng)讹躯,多謝各位指出不足與錯(cuò)誤菩彬。