51单片机之动态数码管的实现

1.为什么是动态的?

1.采用了发光管的余晖和人眼的视觉暂留效应,使人看到好像各位数码管都在同时显示

2.特点:

1.同样是利用了138译码器对高低电平进行操作

2. 动态显示将所有的数码管的段选线并联,采用循环的方式对每一位进行操作

3.关于138译码器

输出高低电频是有着一定规律的

如果是110(LSA,LSB,LSC),则为L3为低电平;(反向二进制)

同时,要注意看真值表(X为任意值,L为低电平,H为高电平)

51单片机之动态数码管的实现_第1张图片

4.关于怎样实现动态的具体操作

1.使用数组来时数码管实现输出数字

2.使用for循环来时函数进行循环操作

3.使用switch case函数实现不同字段的选择

4.同时使用delay()函数和最后对P0值刷新进行消影处理

#include
typedef unsigned char u8;
typedef unsigned int u16;

//138译码器
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//书写子函数
void delay(u16 i)
{
	while(i--);
}
void Digdisplay()	//显示0到7
{
   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[i];
		//延时
	 	delay(100);
		//进行消影处理,防止重影
		P0=0X00;
		
		 }
   }

void main()
{
	while(1)
	{
		Digdisplay();
	}
}

你可能感兴趣的:(51单片机之动态数码管的实现)