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

数码管结构及分类

数码管是发光器件之一,内部由七个条形发光二极管(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始终保持高电压

上面是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;					// 消隐,注意不要漏掉了
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值