51单片机【三】静态与动态驱动数码管

版权声明:欢迎转载请注明转自方辰昱的博客https://blog.csdn.net/viafcccy https://blog.csdn.net/viafcccy/article/details/84190643

数码管结构及分类

数码管是发光器件之一,内部由七个条形发光二极管(a,b,c,d,e,f,g)和一个小圆点发光二极管(dp)构成,51单片机开发板上为八段数码管,如下图所示,根据各段的组合不同,显示的字符也就不同。

                                                          

按八个数码管的公共端接线不同,数码管又可分类为共阴极数码管和共阳极数码管两种。共阴极数码管的公共端接地,而共阳极数码管的公共端接电源,接线如下图所示(左为共阴极,右为共阳极)。当连接的单片机接口为高电平时共阴极数码管亮;反之,连接的接口为低电平时则共阳极数码管亮。

                                                                      

void DigDisplay(void)
{
	unsigned char i = 0;

	// 首先确定位码,选中最左侧数码管,注意查38译码器的真值表,gagbgc为38译码器的ABC端口
	gA = 0;
	gB = 0;
	gC = 0;
	// 依次显示0-F
	for (i=0; i<16; i++)
	{
		DIG_PORT = gDuanMa[i];/*这个数组已经定义16个元素对应0-f的段码,DIG_PORT是共阴极数码管段码经74HC573接P0端口*/
		//Delay();
		delay800ms();

J6是一个跳线 当接LE和P10时可以通过软件调节P10电压从而影响LE从而影响数码管的效果(设置这个主要是因为p0会接入多个原件) 而接VCC始终保持高电压

扫描二维码关注公众号,回复: 4128087 查看本文章

上面是38译码器简单点说就是输入三个信号输出八种信号,因为三种0或1可以有八种组合

上面是74HC573是将电压放大使二极管发亮强度更大,逻辑上并不存在。


 

上面是38译码器的真值表可以通过查找此表判断输入那三个值使8个led中的那个亮

驱动过程是这样的

1.选择哪一组led亮(同一时间只有一组LED会亮)

使用38译码器选择一组led灯使之一侧电压为低 其他全部为高

2.使这组显示确切的数字

从CPU引脚到73再到数码管 给的全是高电压因此只有选中的那组可以亮 下面通过p0端口将段码输入产生确切的高低电压使每颗正确的led发光出确切的数字 

下面是动态驱动数码管

其基本原理不变 本质上也是一个一个去点亮数码管 但是运用了人眼的视觉暂留 导致视觉上看是始终存在的

void DigDisplay1(void)
{
	// 第1个数码管上显示1
	gA = 1; gB = 1; gC = 1;			// 位选第1个数码管
	DIG_PORT = gDuanMa[1];			// 发送段码
	delay1ms(); 					// 间隔一段显示时间	
	DIG_PORT = 0x00;				// 消隐,注意不要漏掉了	

	// 第2个数码管上显示2
	gA = 0; gB = 1; gC = 1;			// 位选第2个数码管
	DIG_PORT = gDuanMa[2];			// 发送段码
	delay1ms(); 					// 间隔一段显示时间	
	DIG_PORT = 0x00;				// 消隐,注意不要漏掉了

	// 第3个数码管上显示3
	gA = 1; gB = 0; gC = 1;			// 位选第3个数码管
	DIG_PORT = gDuanMa[3];			// 发送段码
	delay1ms(); 					// 间隔一段显示时间	
	DIG_PORT = 0x00;				// 消隐,注意不要漏掉了

	// 第4个数码管上显示4
	gA = 0; gB = 0; gC = 1;			// 位选第4个数码管
	DIG_PORT = gDuanMa[4];			// 发送段码
	delay1ms(); 					// 间隔一段显示时间	
	DIG_PORT = 0x00;				// 消隐,注意不要漏掉了

	// 第5个数码管上显示5
	gA = 1; gB = 1; gC = 0;			// 位选第5个数码管
	DIG_PORT = gDuanMa[5];			// 发送段码
	delay1ms(); 					// 间隔一段显示时间	
	DIG_PORT = 0x00;				// 消隐,注意不要漏掉了

	// 第6个数码管上显示6
	gA = 0; gB = 1; gC = 0;			// 位选第6个数码管
	DIG_PORT = gDuanMa[6];			// 发送段码
	delay1ms(); 					// 间隔一段显示时间	
	DIG_PORT = 0x00;				// 消隐,注意不要漏掉了

	// 第7个数码管上显示7
	gA = 1; gB = 0; gC = 0;			// 位选第7个数码管
	DIG_PORT = gDuanMa[7];			// 发送段码
	delay1ms(); 					// 间隔一段显示时间	
	DIG_PORT = 0x00;				// 消隐,注意不要漏掉了

	// 第8个数码管上显示8
	gA = 0; gB = 0; gC = 0;			// 位选第8个数码管
	DIG_PORT = gDuanMa[8];			// 发送段码
	delay1ms(); 					// 间隔一段显示时间	
	DIG_PORT = 0x00;				// 消隐,注意不要漏掉了
}



消隐的原因是当程序在执行位选下一个数码管时但是传输的还是上一个数码管的段码导致在显示上会闪动一下

void DigDisplay2(void)
{
	u8 i;

	for (i=0; i<8; i++)
	{
		switch (i)	 					 	//位选,选择点亮哪个数码管
		{
			case 0:
				gA = 1; gB = 1; gC = 1; 
				break;					 	//显示第0位
			case 1:
				gA = 0; gB = 1; gC = 1; 
				break;					 	//显示第1位
			case 2:
				gA = 1; gB = 0; gC = 1; 
				break;					 	//显示第2位
			case 3:
				gA = 0; gB = 0; gC = 1; 
				break;					 	//显示第3位
			case 4:
				gA = 1; gB = 1; gC = 0; 
				break;					 	//显示第4位
			case 5:
				gA = 0; gB = 1; gC = 0; 
				break;					 	//显示第5位
			case 6:
				gA = 1; gB = 0; gC = 0; 
				break;					 	//显示第6位
			case 7:
				gA = 0; gB = 0; gC = 0; 
				break;					 	//显示第7位
			default:
				break;	
		}
		DIG_PORT = gDuanMa[i+1];			// 发送段码
		delay1ms(); 						// 间隔一段显示时间	
		DIG_PORT = 0x00;					// 消隐,注意不要漏掉了
	}
}

猜你喜欢

转载自blog.csdn.net/viafcccy/article/details/84190643