数码管显示


静态数码管是共阳,动态数码管是共阴???

数码管

共阳和共阴

分为:共阴极数码管和共阳极数码管,其中共阳极数码管更为经常使用。
缘由:
由于数码管的非公共端每每接 在IC 芯片的IO上,而IC 芯片的驱动能力
每每是比较小的,若是采用共阴极数码 管,它的驱动端在非公共端,就有可能受限于IC芯片输出电流不够而显示昏
暗(比 如51单片机),要外加上拉电阻或者是三极管加大驱动能力。因此使用共阳数码59
管的好处是:将驱动数码管的工做交到公共端(通常接驱动电源),加大驱动电 源的功率天然要比加
大IC芯片IO口的驱动电流简单许多。另外一方面,这样也能减 轻MCU的负担。





数组

段选和位选

段选:能够理解为数码管内部有八个发光二极管,段选就是让选中的那一段发光二极管发光。
位选:针对一排数码管,位选就是让选中的数码管起做用。
函数

数码管静态显示

原理

显示原理:靠点亮内部的发光二极管来发光。本器材为共阳极数码管。与之链接的JP3端口须要处于低电平(0),才会让对应的发光二极管亮。
在这里插入图片描述
a,b,c,d,e,f,g,DP八个发光二极管对应JP3的八个端口,当与之对应的端口处于低电平0时,这个发光二极管就会亮。
例如:当a,b,c,d,e,f为0时,数码管就会显示0


spa

单位数码管:内部有8个发光二极管 ,有10个引脚 ,第3和第8引脚链接在一块儿code

代码实现

为何不须要消隐???blog

/************静态数码管——流动显示0——9***********/ 
 
#include <reg52.h>

//数组1按位取反以后就是数组2 ~按位取反符号

//此数组流动显示数字0——9
unsigned char code DIG_CODE_1[10]={ 0x3F, 0x06, 0x5B, 0x4F, 0x66,
 0x6D, 0x7D, 0x07,0x7F, 0x6F};//此数组需每位取反后才能成功显示

unsigned char code DIG_CODE_2[10]={ 0xC0, 0xF9, 0xA4, 0xB0,
 0x99, 0x92, 0x82, 0xF8,0x80, 0x90};

//被调函数原型说明
void delay(unsigned int t);   

//主函数
void main()
{ 
 	unsigned int i;
	while(1)
	{ 
	 	for(i=0;i<=9;i++)
		{ 
			P0=DIG_CODE_2[i];
			// P0=~DIG_CODE_1[i]; 
			//若是要用1数组来个P0赋值那么就须要按位取反
			delay(30);
		}
		i=0;
	}
}

//被调函数
//延时函数delay(),时间与t有关。当t=50时,延时10ms
void delay(unsigned int t)
{ 
 	int a, b;
    for (;t>0;t--)	   	// t已经在传递过来的时候已经赋值了,//
                         //因此在for语句第一句就不用赋值了--//
	{ 
		for (b=38;b>0;b--)
		{ 
			for (a=130;a>0;a--);
		}          
	} 
}

数码管动态显示

一排数码管同时亮也是利用动态效应,一次只能亮一个数码管,当间隔小了,人眼就会当作这一排数码管都亮了。图片

方法一:使用数码管段选和位选

原理

P0接数码管段选,P1接数码管位选
P1控制哪一个数码管能亮,P0控制亮的数码管显示什么数字。
例如:P1=1111 1110,那么就是对应的第一个数码管能亮(最左边的那个),P0=0x3f,这个数码管显示的数字为0.

原型

代码

这段代码是让一排数码管都显示数字
j=10;while(j–);
这段代码的做用时短暂延时,假设没有这段代码,每一个数码管就会瞬间熄灭,这一排看到的亮度就会比较暗,效果差。
若是加了这个延时,这一排数码管的亮度就会比较亮。
若是继续延长这个时间,例如j=10000那么看到的效果就会是一个个数码管分别亮,由于间隔时间过长,动态效应就没法起做用了。
P0 = 0x00;
消隐 若是不消隐就会显示模糊





class

消隐与不消隐的区别:(以下图)
在这里插入图片描述
在这里插入图片描述

变量

#include<reg51.h>

//--定义全局变量--//
unsigned char code DIG_PLACE[8] = { 
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制

unsigned char code DIG_CODE[17] = { 
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、一、二、三、四、五、六、七、八、九、A、b、C、d、E、F的显示码
//共阴极,高电平有效

unsigned char DisplayData[8];
//用来存放要显示的8位数的值

//--声明全局函数--//
void DigDisplay(); //动态显示函数


void main(void)
{ 
	unsigned char i;

	for(i=0; i<8; i++)
	{ 
		DisplayData[i] = DIG_CODE[i];	
	}
	while(1)
	{ 
		DigDisplay();
	}				
}


void DigDisplay()
{ 
	unsigned char i;
	unsigned int j;

	for(i=0; i<8; i++)
	{ 
		P1 = DIG_PLACE[i];	 //发送位选
		P0 = DisplayData[i];     //发送段码
		//若是没有这个延时就会瞬间熄灭,看到的就比较暗
		j = 10;						 //扫描间隔时间设定 若是改为10000就能看到一个一个数码管亮了
		while(j--);	
		P0 = 0x00;//消隐 若是不消隐就会模糊
	}
}

方法二:38译码器

38译码器——3通道输入,三通道输出

原理

原理与上面基本类似,P0接数码管段选,不一样的是位选是由38译码器的3个端口来决定(再也不由数码管位选的端口来决定)
经过A B C这三个端口来控制哪个数码管起做用。
A B C就是38译码器的3个输入端
在这里插入图片描述


原理

代码

相关文章
相关标签/搜索