51单片机(普中 清翔)-----显示数码管部分

文章详细介绍了如何使用单片机通过位选和段选来控制数码管显示特定数字,特别是在共阴极数码管的环境下。同时,提出了在快速切换显示时可能出现的数据串位问题,即消影问题,并给出了通过软件延迟和清零来解决这一问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

原理图

段选部分

 位选部分

显示原理

先位选,再段选

显示数字

显示不同位置上的不同数字


 

原理图

段选部分

 位选部分

显示原理

先位选,再段选

先对P2^2,P2^3,P2^4赋值,进行位选,选择显示的数码管位置

//二进制101对应的是十进制5,在原理图图上Y0对应的是LED1

//所以101说明Y5有效,选择的是第6个数码管,允许LED6显示,而其他位不允许显示

P2^2 = 1

P2^3 = 0

P2^4 = 1

普中51开发版数码管使用的是共阴极数码管,给数字1点亮,给数字0不亮

开发板上是逆序为1,也就是说LED8是我们说的第一个数码管(从左往右数)

显示数字

#include <REGX52.H>

unsigned char NixieTable[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f};
                             0     1     2     3    4      5     6     7     8    9
void Nixie(unsigned char Location, Number)
{
	switch(Location)
	{
		case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1;break;	//位码
		case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0;break;
		case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1;break;
		case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0;break;
		case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1;break;
		case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0;break;
		case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1;break;
		case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0;break;
	}
	P0 = NixieTable[Number];			//段码
	
}

void main()
{
//	P2_2 = 1;			//二进制101   十进制5    对应LED6
//	P2_3 = 0;			
//	P2_4 = 1;			//位选,选中LED6
//	P0 = 0x7d;			//段选
	
	Nixie(7,2);
	while(1);
}

显示不同位置上的不同数字

那么在这里解释下数码管的消影就是比方说:

当我们要显示数码管的时候首先要:位选 段选、还要显示的话就还要 位选、段选,循环。

那么这样就会出现问题:首先是选择"位选端"给上低电平,然后是段选给上数据,然后给上下一位位选的数据。但是:由于我们单片机的速度是很快的,在段选到下一个位选之间就会出现问题。我们选中下一位这个时刻很短的时间内,上一个数据就会串到下一个数据。因为它们是挨着一起的,我在选中下一位之后 上一位的数据自然是会直接过来的。这样就会显示出数据的串位的问题了!

那么我们应该怎么避免这个问题?那我们就需要在上一个段选端给清零这样即使到下一位它也不会对上一位产生影响!因为以及清零了。所以在子函数上需要优化下,显示玩之后我们首先要延迟1ms这个是为了能让程序更加稳定显示 并且 进行清零!

#include <REGX52.H>

unsigned char NixieTable[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x6f};

void Delay(unsigned char ms)		//@12.000MHz
{
	unsigned char i, j;

	while(ms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		ms--;
	}
}

void Nixie(unsigned char Location, Number)
{
	switch(Location)
	{
		case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1;break;	//位码
		case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0;break;
		case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1;break;
		case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0;break;
		case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1;break;
		case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0;break;
		case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1;break;
		case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0;break;
	}
	P0 = NixieTable[Number];		//段码
	
	Delay(1);						//软件消隐
	P2 = 0x00;						//清零
}

void main()
{
	while(1)
	{
		Nixie(1,1);
		Nixie(2,2);
		Nixie(3,3);
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值