51单片机——八段数码管

    在对LED灯的应用有了一定的了解之后,我开始学习了一些关于数码管的应用。
    在我的开发板上,有独立共阳管和八位共阴管 。数码管从高位到低位的段码依次是h(dp),g,f,e,d,c,b,a共八位。共阴管是“1”表示亮,“0”表示灭,而共阳管则是相反的。顺便提一句,若是要检测数码管是否完好,可以用数码管“8”来检测。
    若是要在数码管上显示0~F,则可以用一套固定的十六进制数表示,可以放在数组中,为{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}。这一个数组是用来表示共阴管的亮的,而若是共阳管的时候,需要在前面加上“~”。
    独立共阳管显示0-F

自己写的几个延时函数

void DelayUs2X(unsigned char t)//微秒级延时
{
	while(t--);
}
void DelayMs(unsigned char t)//毫秒级延时
{
	while(t--)
	{
		DelayUs2X(245);
		DelayUs2X(245);
	}
}	
void DelayS(unsigned char t)//秒级延时
{
	while(t--)
	{
		DelayMs(245);
	}
}

段码和位码的用数组存放

unsigned char code Seg_Code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 
//段码,显示器现实的数字对应0~15 
unsigned char code Bit_Code[]={0xfe,0xfd,0xfb,0xf7,0xef,0x0df,0xbf,0x7f};
//位码,对应8个数码管
unsigned char code LOVE[]={0x06,0x00,0x38,0x3f,0x3e,0x79,0x00,0x3e};
//                           I         L    O    V    E         U

 

 

 

 单个数码管从0——15的显示,因为板子上的单个数码管是共阳极的,所以需要给代码去反

void main()//单个数码管零到16的显示
{	
    while(1)
    {
    	if(i==16)
		{
			i=0;
		}
		P1 =~Seg_Code[i];
		i++;
		DelayS(5);//相当于1秒的延迟
    }
}

八位数码管一次显示从1到15,每次位选一个数码管 

 

void show_0_15()//0到15的八位数码管一次显示
{
	DataPort = 0;//清除数据,防止重影
		
		for(i=0;i<16;i++,j++)//先送位码,再选段码
		{
				if(j==8)
			{
				j=0;
			}
			DataPort =Bit_Code[j];//送位码确定哪个数码管显示
			Bit_Latch = 1;//开门
			Bit_Latch = 0;//关门
		//	Delay();
		
			DataPort = Seg_Code[i];//送段码,确定显示的数字
			Seg_Latch = 1;//开门
			Seg_Latch = 0;//关门
			Delay();
			
		}
	}

 

Display显示函数,用来确认需要从第几码管显示以及显示几位数码管

 

 

void DisPlay(unsigned char FirstBit,unsigned char Num)//显示几位数码管以及各自上面的数字
	
{
	unsigned char i;
	for(i=0;i

 

 8位累加器,从0到99999999

void leijiaqi()//累加器8位
	{
	unsigned long int num=0;
	unsigned int j;
	while(1)
	{
		j++;
		if(j==24)//延时空跑24圈,num+1;这24圈只是为了跑亮八个灯
		{
			j=0;
			num++;
			if(num==10000000)
				num=0;
		}
		TempData[0]=Seg_Code[num/10000000];
		TempData[1]=Seg_Code[(num%10000000)/1000000];
		TempData[2]=Seg_Code[(num%1000000)/100000];
		TempData[3]=Seg_Code[(num%100000)/10000];
		TempData[4]=Seg_Code[(num%10000)/1000];
		TempData[5]=Seg_Code[(num%1000)/100];
		TempData[6]=Seg_Code[(num%100)/10];
		TempData[7]=Seg_Code[(num%10)/1];
		DisPlay(0,8);
	}
}

 在八位数码管上动态显示11位的手机号码,将上一位空格共12位

void main()
{
	unsigned long int num=0;
	unsigned int j;
	while(1)
	{
		j++;
		if(j==40)//延时空跑24圈,num+1;这24圈只是为了跑亮八个灯
		{
			temp%=1000;
			temp++;
			j=0;
		}
		//temp%=8;
	
		for(i=0;i<8;i++)
		{
			TempData[i]=PhoneNumber[(i+temp)%12];
		}
		DisPlay(0,8);
	}
	
}

 

 

你可能感兴趣的:(单片机)