天天看點

51單片機——動态及靜态數位管

靜态數位管為七位數字顯示另加以為小數點顯示位,共八個LED燈管組成。

使用八個IO口分别控制八個LED燈。

動态數位管:

使用三八譯碼器由三個IO口來調配八個八位數位管,另加八個IO來控制目前八位數位管的顯示。

三八譯碼器:為000—111八個狀态(000,001,010,011,100,101,110,111)。

實際上八個數位管并不是同時顯示,但是因為在一定的時間變化上,人眼識别不到,便可達到八個八位數位管同時顯示的效果。

注:此原理也可用于調節LED燈管的亮度,使用PWM軟信号控制LED燈的亮度。人眼并不會觀察到LED燈閃爍,而是随占空比的增大而觀察到LED燈變暗。

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//段選信号
    
void delay(unsigned int i)
{
 while(i--);
}

void Display(unsigned long int u)
{
 unsigned int i,a;
 
 for(i=0;i<8;i++)
 {
  switch(i)
  {
   case(0):
    LSA=1;LSB=1;LSC=1; break;//顯示第0位
   case(1):
    LSA=0;LSB=1;LSC=1; break;//顯示第1位
   case(2):
    LSA=1;LSB=0;LSC=1; break;//顯示第2位
   case(3): 
    LSA=0;LSB=0;LSC=1; break;//顯示第3位
   case(4):
    LSA=1;LSB=1;LSC=0; break;//顯示第4位
   case(5):
    LSA=0;LSB=1;LSC=0; break;//顯示第5位
   case(6):
    LSA=1;LSB=0;LSC=0; break;//顯示第6位
   case(7):
    LSA=0;LSB=0;LSC=0; break;//顯示第7位
  }
  
  a = u%10;      
  u = u/10;
  P0=smgduan[a];//将段選信号賦給P0
  delay(50);
  P0=0x00;
 }
}

void main()
{
 while(1)
 {
  Display(12345670);
 }
}