数码管显示原理及常用驱动方式详解

目录

一、数码管内部结构

二、数码管的显示方式

三、数码管显示编程思想   


一、数码管内部结构

1、内部结构有八个发光二极管,一个8字只需要显示7段,但是有一个小数点,dp,所以有八个发光二极管。

2、单个数码管封装十个引脚。3、8引脚是连在一起的,组成公共端。八个发光二极管分别与一个限流电阻串联后再并联,有一个公共端,公共端可以分为共阳或共阴极。

共阴极是公共端接地,然后给高电平让想让亮的字段亮起来。想让显示几,就给对应的字段高电平;

共阳极需要给需要的字段低电平,注意发光二极管本身需要通过5毫安以上的电流才可以发光,且电流不得过大。但是单片机的I/O口送不了这么大的电流,所以需要驱动电路。可以用上拉电阻的方式也可以直接使用专门的驱动芯片,可以使用74HC573锁存器芯片、74HC138译码器,也可以使用专门的数码管驱动芯片LM1640。

3、当多位一体的数码管时内部的公共端是独立的,而负责显示什么数字的段选线是全部连接在一起的。

公共端控制哪个位亮,称为“位选线”,控制单个数码管哪一段亮的叫做“段选线”。

一般单位数码管和二位数码管都有10个引脚,四位数码管有12个引脚。

二、数码管的显示方式

        数码管有两种显示方式:静态显示和动态显示。

       位选去选哪几个数字亮,而由于段选是连在一起的所以显示的数字是相同的,这称为静态显示。静态显示就是选中不同的数码管显示相同的数字。

        数码管动态显示又叫做动态扫描显示,就是选中几个数码管同时显示不同的数字。

        数码管的动态是以扫描的方式轮流向数码管送出段选码和位选,利用发光管的余辉和人眼的视觉暂留作用,使人感觉各位数码管同时都在显示,而实际上是多为数码管一位一位的轮流显示,只是轮流的速度非常快,人眼已经无法分辨。

        由于数码管动态显示的特性,动态显示时,我们要在每次送完段选数据后、送入位选数据前,加上语句P0 = 0xff或P0=0x00,看采用的是共阳极还是共阴极的数码管。这个操作叫做消影。如果不执行消影操作,语句再接下来的打开位选命令后,仍保持着上次的段选数据,该段选数据将立刻加在数码管上,接下来才是再次通过IO口给位选送入位选数据,数码管上会出现混乱的现象。

三、数码管显示编程思想   

     数码管显示步骤:1、送段码 2、送位选 3、延时一下,不要超过10ms(不是必须的) 4、消隐

        数码管显示时,最好将段码数据和位选数据按顺序放到各自的数组中,这样调用各自的数组,便可以用数字的方式给数码管送入位选和段选数据,更加方便直观。

我们只需将代表不同数字的段码和位选地址放入数组中,便可以直接调用

unsigned char code leddata[] = {//数码管段码表
								0x3f,//"0"
								0x06,//"1"
								0x5b,//"2"
								0x4f,//"3"
								0x66,//"4"
								0x6d,//"5"
								0x7d,//"6"
								0x07,//"7"
								0x7f,//"8"
								0x6f,//"9"
								0x77,//"A"
								0x7c,//"B"
								0x39,//"C"
								0x5e,//"D"
								0x79,//"E"
								0x71,//"F"
								0x76,//"H"
								0x38,//"L"
								0x37,//"n"
								0x3e,//"u"
								0x73,//"P"
								0x5c,//"o"
								0x40,//"-"
								0x00,//"熄灭"
								};
unsigned char LEDBUF[] = {22,22,22,22};//数据显示缓冲区
unsigned char code PLACE_CODE[] = {0xfe, 0xfd, 0xfb, 0xf7};//位选信号

我们可以在我们设置的数据缓冲区数组中填入我们想要显示的内容,就可以通过数组之间的相互调用的实现显示。

void Display()//因为有数据显示缓冲区,就不用带参数的函数
{
	static unsigned char i = 0;//静态变量只在第一次时初始化,再次调用就不会被初始化

	//1、送段码
	GPIO_DIG = leddata[LEDBUF[i]];
	//2、送位选
	GPIO_PLACE = PLACE_CODE[i];
	//3、延时 1ms,所有数码管整体延时时间不要超过10ms
	DelayXms(1);
	//4、消隐
	GPIO_DIG = 0x00;
	i++;
	if(i == N)
		i = 0;		
}
物联沃分享整理
物联沃-IOTWORD物联网 » 数码管显示原理及常用驱动方式详解

发表评论