天天看点

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);
 }
}