在第6課里,我們講到數(shù)碼管的靜態(tài)顯示,利用靜態(tài)顯示法,通過控制位選和段選,可以讓數(shù)任意幾位數(shù)碼管顯示任意字符,但由于所有位數(shù)碼管的相同的段選全部接在一起,所以只能同時(shí)顯示相同的數(shù)字,例如8位同時(shí)顯示8字,1、3、5位同時(shí)顯示3字。但大家想一下,如果我們要讓數(shù)碼管同一時(shí)刻顯示不同的數(shù)字,如圖1所示的現(xiàn)象,用靜態(tài)顯示的方法就不能夠?qū)崿F(xiàn),這里就只能用到動(dòng)態(tài)顯示的方法,今天這一節(jié)我們主要講解數(shù)碼管動(dòng)態(tài)顯示的原理的程序?qū)崿F(xiàn)的方法。
圖1 數(shù)碼管同時(shí)顯示123456
在講解動(dòng)態(tài)顯示方法之前,我們先介紹在種數(shù)碼管及單片機(jī)程序開發(fā)過程常用的方法-數(shù)組編碼法。
1、數(shù)組編碼
在跟數(shù)碼管相關(guān)的程序中,可以對(duì)位進(jìn)行編碼,也可對(duì)段進(jìn)行編碼,這里我們以段編碼進(jìn)行講解。通過第8課的程序我們知道,在位選確定后,要顯示數(shù)字8時(shí),P0=0x80,顯示數(shù)字3時(shí)P0=0xb0,也就是0xb0,0x80分別可以表示數(shù)字3和8,按此方法,我們把在數(shù)碼管上顯示0-f,16個(gè)數(shù)字全部用16制度表示出來,這16個(gè)16進(jìn)制數(shù)就稱為數(shù)碼管可顯示0-f的相應(yīng)的編碼,如圖2所示(注意共陽和共陰極數(shù)碼管相應(yīng)的編碼有所不同,這里以實(shí)驗(yàn)板上共陽極的為例)。
圖2 共陽極數(shù)碼管編碼
在編程中,編碼的表示方法如下:
unsigned char code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e };
這里編碼表示的方法與C語言中數(shù)組定義的方法基本一樣。table是數(shù)組名,后面需加[],中括號(hào)中需加上數(shù)組中元素的個(gè)數(shù),也可以不寫。等號(hào)的右邊用一個(gè)大括號(hào)將所有元素包含起來,里面的元素之間用“,”隔開,在大括號(hào)外用“;”結(jié)束。等號(hào)左邊的unsigned char 是數(shù)據(jù)元素的數(shù)據(jù)類型,這里定義為無符號(hào)字符型,也就是元素的值范圍只能是0-255之間。Code表示把這個(gè)數(shù)組定義為編碼,這樣定義的好處是其元素轉(zhuǎn)化成二進(jìn)文件后可能直接存儲(chǔ)到程序存儲(chǔ)器中,當(dāng)然這里也可以不加code,但是這樣編譯后會(huì)將其直接存儲(chǔ)到數(shù)據(jù)存儲(chǔ)器中,要知道單片機(jī)中數(shù)據(jù)存儲(chǔ)器的容量是非常有限的,定義為code后可節(jié)約單片機(jī)數(shù)據(jù)存儲(chǔ)器的空間。
調(diào)用程序的方法如下,
P0=table[1];
這里表示將數(shù)組中的第2個(gè)元素(注意第一個(gè)是table[0])0xf9賦給P1口,
即P0=0xf9;也就是此時(shí)位被選通的數(shù)碼管會(huì)顯示數(shù)字2.
下面利用編碼的方法讓6個(gè)數(shù)碼管以間隔1秒的時(shí)間循環(huán)顯示0-f。相應(yīng)程序如例1.
例1:6個(gè)數(shù)碼管循環(huán)顯示0-f
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit duan=P2^6;
sbit wei=P2^7;
uchar num;
unsigned char code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e };
void delay(uint);
void main()
{
wei=1;
P0=0xfe;
wei=0;
for(num=0;num<16;num++)
{
duan=1;
P0=table[num];
delay(150);
duan=0;
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=500;y>0;y--);
}
下載到實(shí)驗(yàn)板后實(shí)驗(yàn)現(xiàn)象如圖3所示。
圖3 6個(gè)數(shù)碼管依次從0-f變化
2、數(shù)碼管的動(dòng)態(tài)顯示
明白了數(shù)組編碼后,現(xiàn)在我們正式介紹數(shù)碼管的動(dòng)態(tài)顯示,為了更利于大家理解,我們先用前面介紹過的靜態(tài)顯示法寫一個(gè)程序,功能為:讓6個(gè)數(shù)碼管間隔一秒依次顯示1、2、3、4、5、6。程序如例2.
例2 數(shù)碼管依次顯示1、2、3、4、5、6
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit duan=P2^6;
sbit wei=P2^7;
uchar num;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint);
void main()
{
while(1)
{
for(num=1;num<7;num++)
{
if(num==1)
{
wei=1;
P0=0xfe;
wei=0;
duan=1;
P0=table[num];
delay(1000);
duan=0;
}
else if(num==2)
{
wei=1;
P0=0xfd;
wei=0;
duan=1;
P0=table[num];
delay(1000);
duan=0;
}
else if(num==3)
{
wei=1;
P0=0xfb;
wei=0;
duan=1;
P0=table[num];
delay(1000);
duan=0;
}
else if(num==4)
{
wei=1;
P0=0xf7;
wei=0;
duan=1;
P0=table[num];
delay(1000);
duan=0;
}
else if(num==5)
{
wei=1;
P0=0xef;
wei=0;
duan=1;
P0=table[num];
delay(1000);
duan=0;
}
else if(num==6)
{
wei=1;
P0=0xdf;
wei=0;
duan=1;
P0=table[num];
delay(1000);
duan=0;
}
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
main函數(shù)內(nèi)的意思num從1開始,一直加到6,然后不斷的循環(huán) (程序?yàn)閒or(num=1;num<7;num++),當(dāng)num=1時(shí),先打開第一位數(shù)碼管,再讓第一位數(shù)碼管顯示1(程序P0=table[num],即P0=table[1]),然后進(jìn)行1s的延時(shí)(程序?yàn)閐elay(1000);)。緊接著當(dāng)num=2時(shí),打開第二位數(shù)碼管,并讓其顯示2,延時(shí)1s……,一直到num=6時(shí),打開第六位數(shù)碼管,并讓其顯示6,延時(shí)1s,再重復(fù)前的的程序。這個(gè)我們就可以在實(shí)驗(yàn)板上看到數(shù)碼管從第一位開始依次以1s的時(shí)間間隔依次顯示123456.
下面的程序下載到實(shí)驗(yàn)板現(xiàn)象如圖4所示。
圖4數(shù)碼管依次顯示123456
現(xiàn)在我們把延時(shí)程序縮短(注意上面是延時(shí)1s,依次100ms 10ms 1ms ….一直到10us,然后把每次改后的程序下載到實(shí)驗(yàn)板,.當(dāng)短到10us時(shí),可看到如下現(xiàn)象:
也就是此時(shí)我們看到的現(xiàn)象是6個(gè)數(shù)碼管在同一時(shí)刻按位依次顯示123456,可能大家馬上要提出疑問了,在上面不是說過利用靜態(tài)的寫法不是實(shí)現(xiàn)不了這種效果嗎?這里就是數(shù)碼管的動(dòng)態(tài)顯示。
所謂動(dòng)態(tài)顯示,就是依次向每位位數(shù)碼管同時(shí)送出字形碼和相應(yīng)的位選,位與位之間利用延時(shí)程序進(jìn)行延時(shí),當(dāng)延時(shí)程序非常短時(shí),由于發(fā)光管的余輝和人眼視覺暫留作用,此時(shí)我們的人眼就分辨不出位與位之間有延時(shí)存在,此時(shí)就感覺各位數(shù)碼管同時(shí)都在顯示,這樣我們實(shí)現(xiàn)在靜態(tài)不能實(shí)現(xiàn)的功能。