Bootstrap

51单片机之数码管显示

4.1静态数码管显示

上述数码管为共阴极数码管。我们想要第六个数码管显示数字,首先在138译码器中找到LED6对应着Y5接口,就是让Y5输出低电平,那么就需要p24 p23 p22 输出的二进制为 5,也就是101(二进制)

P2_4=1;

P2_3=0;

P2_2=1;

接着是阳极输出,想要数码管显示6,就让对应位置输出高电平

a b c d e f g dp

1 0 1 1 1 1 1 0

左端是低位 ,右端是高位对应二进制就是 0111 1101 ——>0X7D(十六进制),我们就是

#include <REGX52.H>


void main(){
	P2_4=1;
	P2_3=0;
	P2_2=1;
	P0=0X7D;
	while(1){
		
	}
}

现在我们编写函数,实现对函数参数进行改变控制数码管显示。

#include <REGX52.H>



void NiXie(unsigned char Location,unsigned char Number);
unsigned char digitSegments[] = {
    0x3F,  // 0
    0x06,  // 1
    0x5B,  // 2
    0x4F,  // 3
    0x66,  // 4
    0x6D,  // 5
    0x7D,  // 6
    0x07,  // 7
    0x7F,  // 8
    0x6F   // 9
};

void main(){
	NiXie(3,1);
	
	while(1){
		
	}	
}

void NiXie(unsigned char Location,unsigned char Number){
	
	switch(Location){
		case 1:
			P2_4=0;P2_3=0;P2_2=0;
		break;				
		case 2:
			P2_4=0;P2_3=0;P2_2=1;
			break;
		case 3:
			P2_4=0;P2_3=1;P2_2=0;
			break;
		case 4:
			P2_4=0;P2_3=1;P2_2=1;
			break;		
		case 5:
			P2_4=1;P2_3=0;P2_2=0;
			break;
		case 6:
			P2_4=1;P2_3=0;P2_2=1;
			break;
		case 7:
			P2_4=1;P2_3=1;P2_2=0;
			break;
		case 8:
			P2_4=1;P2_3=1;P2_2=1;
			break;
		default:
				break;
	}
	P0=digitSegments[Number];

	
}

4.2动态数码管显示

我们的51单片机采用的就是直接扫描的方式,通过快速依次点亮不同的数码管,呈现同时点亮的效果。

void main(){

	
	while(1){
			NiXie(8,1);
			NiXie(7,2);
			NiXie(3,3);
		
	}
	
}

数码管通电顺序是 位码 段码 位码 段码 位码 段码 ,在切换过程中就会产生跑串等现象,因此我们需要对数码管就进行”消影“。我们在NiXie函数末尾加上一个延迟函数,使得每次确定完显示数字之后,稳定一下再去显示下一个,

#include <REGX52.H>



void NiXie(unsigned char Location,unsigned char Number);
void Delay1ms(unsigned int xms);
unsigned char digitSegments[] = {
    0x3F,  // 0
    0x06,  // 1
    0x5B,  // 2
    0x4F,  // 3
    0x66,  // 4
    0x6D,  // 5
    0x7D,  // 6
    0x07,  // 7
    0x7F,  // 8
    0x6F   // 9
};
void main(){

	
	while(1){
			NiXie(8,1);
			NiXie(7,2);
			NiXie(6,3);
		
	}
	
}

void NiXie(unsigned char Location,unsigned char Number){
	
	switch(Location){
		case 1:
			P2_4=0;P2_3=0;P2_2=0;
		break;				
		case 2:
			P2_4=0;P2_3=0;P2_2=1;
			break;
		case 3:
			P2_4=0;P2_3=1;P2_2=0;
			break;
		case 4:
			P2_4=0;P2_3=1;P2_2=1;
			break;		
		case 5:
			P2_4=1;P2_3=0;P2_2=0;
			break;
		case 6:
			P2_4=1;P2_3=0;P2_2=1;
			break;
		case 7:
			P2_4=1;P2_3=1;P2_2=0;
			break;
		case 8:
			P2_4=1;P2_3=1;P2_2=1;
			break;
		default:
				break;
	}
	P0=digitSegments[Number];
	Delay1ms(1);
}

void Delay1ms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms){
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}


}

;