当前位置:   article > 正文

数码管显示

数码管显示


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

数码管

共阳和共阴

分为:共阴极数码管和共阳极数码管,其中共阳极数码管更为常用。
原因:
因为数码管的非公共端往往接 在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

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

代码实现

为什么不需要消隐???

/************静态数码管——流动显示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--);
		}          
	} 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

数码管动态显示

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

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

原理

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

代码

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

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

#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、1、2、3、4、5、6、7、8、9、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;//消隐		如果不消隐就会模糊
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

方法二:38译码器

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

原理

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

代码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/752287
推荐阅读
相关标签
  

闽ICP备14008679号