单片机——数码管显示

数码管介绍

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件

单片机——数码管显示_第1张图片

一位数码管

单片机——数码管显示_第2张图片

单片机——数码管显示_第3张图片八段LED各有名字,八位

单片机——数码管显示_第4张图片引脚定义;和下图序号相对应

 阴极连接在同一个端口上——阴极连接

 单片机——数码管显示_第5张图片

 我们单片机上的数码管引脚连接方式是阴极连接,假使要在数码管上显示数字6,公共端(即阴极)需要接地 (数据0或者低电平),负极选中(位选)

 如图需要点亮A,F,G,E,C,D单片机——数码管显示_第6张图片才会让数码管显示为数字6,则需要分别给对应的阳极引脚高电平 。

则可以得出段码:1011 1110(即引脚对应数据)

 阳极连接在一起——阳极连接

单片机——数码管显示_第7张图片

阳极连接则需要把共阳极连接到高电平端(VCC),则想要LED亮则需要在对应引脚接入数据0,

则可得出显示6的段码为:0100 0001

四位一体数码管

单片机——数码管显示_第8张图片单片机——数码管显示_第9张图片

 

 单片机——数码管显示_第10张图片

 类似的上图的图一是阴极连接,每个四位一体数码管分成四个一位数码管,且这四个A与A连接,B与B连接,以此类推。

假使要让四位一体数码管在第三个一位数码管上显示数字1,该如何操作?

拿阴极连接作为例子,因为只需要其中的第三个一位数码管显示数字,则第三个一位数码管位选(即阴极)输入数据0,其他的为1;再对其阳极进行讨论,要显示为1,即BC亮,因为阴极接的是低电平,则BC对应的引脚应该输入高电平,接入数据1,即7,4给1,得出段码:0110 0000;

注意:共用引脚的结果:在同一个时刻,只能有一个一位数码管被选中,即使选中多个,也是只能显示相同的数字。好处是:节省空间,方便操作。

138译码器:

可以通过控制三个端口来控制八个端口的其中一个端口输出1,

单片机——数码管显示_第11张图片

引脚介绍:

 A,B,C:输入端,高位到低位依次是是C-B-A

Y0 ~Y7:输出端

VCC:电源正极

GND:电源负极

G1,G2A,G2B:使能端,当G1接高电平,G2A,G2B接低电平时,才能正常工作。

工作原理:

输入端CBA输入000时,对应着0,对应着Y0;输入001时,对应1,对应着Y1......以此类推,可以通过控制三个引脚的输入来控制八个引脚中其中一个输出1(节省L口)。注意:八个引脚是低电平有效,即当输入端输入000时,输出端是0111 1111,Y0有效;输入端输入101时,输出端是1111 01111。

低电平驱动能力强,高电平驱动能力弱。

静态数码管显示

目标:实现在第三个一位数码管上显示数字6

操作如下

1、需要通过138译码器选中LED6

单片机——数码管显示_第12张图片单片机——数码管显示_第13张图片

     引脚P22,P23,P24在代码中分别对应P2_4,P2_3,P2_2。要选中Y5输出端,LED6,则需要CBA输入端输入101。

 2、要显示数字6,对应LED要激活afgedc。

        因为四位一体数码管是阳极连接,则需要激活的要输入1,反之则输入0;注意:从高位到低位依次是P07~P06~P05.......,其分别对应dp,g,f,e,d,c,b,a,则可得出段码:0111 1101。转换成16进制——0x7D;

得出代码:

#include 

void main(void)
{
    //分别对应138译码器的CBA输入端
	P2_4 = 1;//C
	P2_3 = 0;//B
	P2_2 = 1;//A
    //CBA输入101,选中输出端Y5
	
    
	P0 = 0x7D;
	while(1)
	{
		
	}
	
}
可以通过函数和数组来改善代码

 首先有:

单片机——数码管显示_第14张图片

 通过Switch函数快捷判断需要在哪个一体数码管上显示数字,再通过数组实现显示的数字

优化代码:

#include 

unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void Nixie(unsigned char Location, Number)
{
	switch(Location)
	{
		case 1: P2_4=1;P2_3=1;P2_2=1;break;
		case 2: P2_4=1;P2_3=1;P2_2=0;break;
		case 3: P2_4=1;P2_3=0;P2_2=1;break;
		case 4: P2_4=1;P2_3=0;P2_2=0;break;
		case 5: P2_4=0;P2_3=1;P2_2=1;break;
		case 6: P2_4=0;P2_3=1;P2_2=0;break;
		case 7: P2_4=0;P2_3=0;P2_2=1;break;
		case 8: P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0 = NixieTable[Number];
}

void main(void)
{
	Nixie(6,4);
	while(1)
	{
		
	}
	
}

动态数码管显示

直接让静态数码管显示多个任务同时执行

#include 
#include 

void Nixie(unsigned char Location, Number);


unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};



void Nixie(unsigned char Location, Number)
{
	switch(Location)
	{
		case 1: P2_4=1;P2_3=1;P2_2=1;break;
		case 2: P2_4=1;P2_3=1;P2_2=0;break;
		case 3: P2_4=1;P2_3=0;P2_2=1;break;
		case 4: P2_4=1;P2_3=0;P2_2=0;break;
		case 5: P2_4=0;P2_3=1;P2_2=1;break;
		case 6: P2_4=0;P2_3=1;P2_2=0;break;
		case 7: P2_4=0;P2_3=0;P2_2=1;break;
		case 8: P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0 = NixieTable[Number];
}

void main(void)
{
	
	while(1)
	{
		Nixie(1,1);
		Nixie(2,2);
		Nixie(3,3);
		Nixie(4,1);
	}
	
}

但是此时会出现bug,数字错乱显示在数码管上,如下图所示:

单片机——数码管显示_第15张图片

 这就涉及到消隐过程。

消隐

数码管显示过程:位选——段选——位选——段选——位选——段选——.......

因为单片机的速度很快,在下一位数据还没出来时,上一位的数据会被串到下一位数据上,导致数据串位。

要解决这个问题,需要在每次段选之后清零,这样上一位数据对下一位数据就不会产生影响。

#include 
#include 

void Nixie(unsigned char Location, Number);
void Delay(unsigned int xms);

unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
	
}

void Nixie(unsigned char Location, Number)
{
	switch(Location)
	{
		case 1: P2_4=1;P2_3=1;P2_2=1;break;
		case 2: P2_4=1;P2_3=1;P2_2=0;break;
		case 3: P2_4=1;P2_3=0;P2_2=1;break;
		case 4: P2_4=1;P2_3=0;P2_2=0;break;
		case 5: P2_4=0;P2_3=1;P2_2=1;break;
		case 6: P2_4=0;P2_3=1;P2_2=0;break;
		case 7: P2_4=0;P2_3=0;P2_2=1;break;
		case 8: P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0 = NixieTable[Number];
	Delay(1);
	P0 = 0x00;
}

void main(void)
{
	
	while(1)
	{
		Nixie(1,1);
		Nixie(2,2);
		Nixie(3,3);
		Nixie(4,1);
	}
	
}

数码管数码管驱动

 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间。

专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可。

 TM1640:

单片机——数码管显示_第16张图片

只需两根线就可以控制16个数码管显示任意数字

74AC595

 单片机——数码管显示_第17张图片

 只需三根线即可控制八个数码管。

你可能感兴趣的:(单片机,嵌入式硬件)