|
以下這段是數(shù)碼管動(dòng)態(tài)掃描的單片機(jī)程序,這段程序?qū)崿F(xiàn)的是8個(gè)數(shù)碼管同時(shí)循環(huán)顯示11111111,22222222,一直到99999999,以下幾個(gè)地方我不明白,大家?guī)臀抑笇?dǎo)以下:
①數(shù)碼管用共陰極,用的是138譯碼器控制8和數(shù)碼管的負(fù)級(jí),大家知道,138譯碼器一次性只能輸出一位低電平,不能同時(shí)全輸出低電平,也就是只能通過(guò)switch選擇語(yǔ)句來(lái)一位一位的點(diǎn)亮,不能實(shí)現(xiàn)同時(shí)一起點(diǎn)亮同一個(gè)數(shù),并且循環(huán)掃描顯示,于是,我就請(qǐng)教了很多論壇朋友,他們修改了一段代碼,我就不理解是什么意思,也就是從我編寫(xiě)的原基礎(chǔ)上,增加了:
void main()
{
unsigned char i;
while(1)
{
for (i=0;i<200;i++)
{
DigDisplay();
}
k++;
if (k>9)
{
k=0;
}
}
}
我看不懂的是,它在main主函數(shù)里增加要循環(huán)200次這個(gè)子函數(shù)的意義是什么,這樣會(huì)不會(huì)是為了快速刷新子函數(shù)里面的這個(gè)switch反復(fù)執(zhí)行來(lái)達(dá)到138譯碼器全部無(wú)間隔的提供負(fù)級(jí),讓數(shù)碼管顯示00000000,11111111,這樣循環(huán)顯示到99999999然后又從0開(kāi)始?是這樣嗎?
以下是網(wǎng)友們修改的代碼,可以實(shí)現(xiàn)同時(shí)一起動(dòng)態(tài)掃描顯示,我就不理解為何要讓子函數(shù)執(zhí)行200次的循環(huán)!
修改后我不能理解的程序:
- #include "reg52.h"
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- unsigned char k=0;
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- void delay(u16 i)
- {
- while(i--);
- }
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- switch(i)
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;
- case(1):
- LSA=1;LSB=0;LSC=0; break;
- case(2):
- LSA=0;LSB=1;LSC=0; break;
- case(3):
- LSA=1;LSB=1;LSC=0; break;
- case(4):
- LSA=0;LSB=0;LSC=1; break;
- case(5):
- LSA=1;LSB=0;LSC=1; break;
- case(6):
- LSA=0;LSB=1;LSC=1; break;
- case(7):
- LSA=1;LSB=1;LSC=1; break;
- }
- P0=smgduan[k];
- delay(100);
- P0=0x00;
- }
- }
- void main()
- {
- unsigned char i;
- while(1)
- {
- for (i=0;i<200;i++)
- {
- DigDisplay();
- }
- k++;
- if (k>9)
- {
- k=0;
- }
- }
- }
復(fù)制代碼
下面是我個(gè)人寫(xiě)的不能同時(shí)顯示得程序,這個(gè)程序就只能利用動(dòng)態(tài)掃描來(lái)顯示出1234567,就不動(dòng)了!
- #include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
- typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- typedef unsigned char u8;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
- void delay(u16 i)
- {
- while(i--);
- }
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//顯示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//顯示第7位
- }
- P0=smgduan[i];//發(fā)送段碼
- delay(100); //間隔一段時(shí)間掃描
- P0=0x00;//消隱
- }
- }
- void main()
- {
- while(1)
- {
- DigDisplay(); //數(shù)碼管顯示函數(shù)
- }
- }
復(fù)制代碼 |
|