以下這段是數碼管動態掃描的單片機程序,這段程序實現的是8個數碼管同時循環顯示11111111,22222222,一直到99999999,以下幾個地方我不明白,大家幫我指導以下:
①數碼管用共陰極,用的是138譯碼器控制8和數碼管的負級,大家知道,138譯碼器一次性只能輸出一位低電平,不能同時全輸出低電平,也就是只能通過switch選擇語句來一位一位的點亮,不能實現同時一起點亮同一個數,并且循環掃描顯示,于是,我就請教了很多論壇朋友,他們修改了一段代碼,我就不理解是什么意思,也就是從我編寫的原基礎上,增加了:
void main()
{
unsigned char i;
while(1)
{
for (i=0;i<200;i++)
{
DigDisplay();
}
k++;
if (k>9)
{
k=0;
}
}
}
我看不懂的是,它在main主函數里增加要循環200次這個子函數的意義是什么,這樣會不會是為了快速刷新子函數里面的這個switch反復執行來達到138譯碼器全部無間隔的提供負級,讓數碼管顯示00000000,11111111,這樣循環顯示到99999999然后又從0開始?是這樣嗎?
以下是網友們修改的代碼,可以實現同時一起動態掃描顯示,我就不理解為何要讓子函數執行200次的循環!
修改后我不能理解的程序:
- #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;
- }
- }
- }
復制代碼
下面是我個人寫的不能同時顯示得程序,這個程序就只能利用動態掃描來顯示出1234567,就不動了!
- #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
- typedef unsigned int u16; //對數據類型進行聲明定義
- 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) //位選,選擇點亮的數碼管,
- {
- 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];//發送段碼
- delay(100); //間隔一段時間掃描
- P0=0x00;//消隱
- }
- }
- void main()
- {
- while(1)
- {
- DigDisplay(); //數碼管顯示函數
- }
- }
復制代碼 |