数码管介绍
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
一位数码管
八段LED各有名字,八位
引脚定义;和下图序号相对应
阴极连接在同一个端口上——阴极连接
我们单片机上的数码管引脚连接方式是阴极连接,假使要在数码管上显示数字6,公共端(即阴极)需要接地 (数据0或者低电平),负极选中(位选)
如图需要点亮A,F,G,E,C,D才会让数码管显示为数字6,则需要分别给对应的阳极引脚高电平 。
则可以得出段码:1011 1110(即引脚对应数据)
阳极连接在一起——阳极连接
阳极连接则需要把共阳极连接到高电平端(VCC),则想要LED亮则需要在对应引脚接入数据0,
则可得出显示6的段码为:0100 0001
四位一体数码管
类似的上图的图一是阴极连接,每个四位一体数码管分成四个一位数码管,且这四个A与A连接,B与B连接,以此类推。
假使要让四位一体数码管在第三个一位数码管上显示数字1,该如何操作?
拿阴极连接作为例子,因为只需要其中的第三个一位数码管显示数字,则第三个一位数码管位选(即阴极)输入数据0,其他的为1;再对其阳极进行讨论,要显示为1,即BC亮,因为阴极接的是低电平,则BC对应的引脚应该输入高电平,接入数据1,即7,4给1,得出段码:0110 0000;
注意:共用引脚的结果:在同一个时刻,只能有一个一位数码管被选中,即使选中多个,也是只能显示相同的数字。好处是:节省空间,方便操作。
138译码器:
可以通过控制三个端口来控制八个端口的其中一个端口输出1,
引脚介绍:
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
引脚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 <REGX52.H>
void main(void)
{
//分别对应138译码器的CBA输入端
P2_4 = 1;//C
P2_3 = 0;//B
P2_2 = 1;//A
//CBA输入101,选中输出端Y5
P0 = 0x7D;
while(1)
{
}
}
可以通过函数和数组来改善代码
首先有:
通过Switch函数快捷判断需要在哪个一体数码管上显示数字,再通过数组实现显示的数字
优化代码:
#include <REGX52.H>
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 <REGX52.H>
#include <INTRINS.H>
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,数字错乱显示在数码管上,如下图所示:
这就涉及到消隐过程。
消隐
数码管显示过程:位选——段选——位选——段选——位选——段选——.......
因为单片机的速度很快,在下一位数据还没出来时,上一位的数据会被串到下一位数据上,导致数据串位。
要解决这个问题,需要在每次段选之后清零,这样上一位数据对下一位数据就不会产生影响。
#include <REGX52.H>
#include <INTRINS.H>
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个数码管显示任意数字
74AC595
文章来源:https://www.toymoban.com/news/detail-767607.html
只需三根线即可控制八个数码管。文章来源地址https://www.toymoban.com/news/detail-767607.html
到了这里,关于单片机——数码管显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!