数码管模块
目录
1.数码管的介绍
2.原理图
3.数码管运行原理
4.C51数组
5.C51子函数
6.数码管段码表
7.数码管驱动方式(了解)
8.静态数码管显示代码
第一步:搞懂原理图
第二步:开始写代码
最终代码:
9.动态数码管显示代码
第一步:
第二步:
第三步:
第四步:
最终代码:
1.数码管的介绍
数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
板中数码管,可控制显示各个位置显示不同数字
2.原理图
138译码器与数码数码管相连。138译码器使用CBA顺序识辨二进制数字转化为十进制数字,对应Y几亮,例如:Y5(5是十进制) C、A、D分别是1、0、1(二级制)。想要显示数码数字,看数码管原理图最左边的P00~P07(统称为P0)达成效果
3.数码管运行原理
管脚定义(对应字母控制对应位置亮):上面的为共阴极、下面的为共阳极(可以理解为3,8管脚处为供电,三角形尖尖有一横的是负极,所有共阴极),两个图中的数字为引脚
用共阴极(因为共阴极所有3、8号公共端要接地,即为0)连接显示数字6的操作,有电势差即有电流流过灯才会亮,所有下面的1为亮,0不亮:(位选:10111110:显示6)
共阳极,接VCC为1,下面的为0才亮,有电流流过,有电势差灯才亮
下面为多个数码管,PCB板的4个为一体,同样上面为共阴极、下面为共阳极的原理图
共阴极,那么我们公共端(12、9、8、6)接地给0才会亮,及可以控制第几个亮;显示的数字则通过下面(11、7、4、2、1、10、5、3即对应字母ABCDEFG)控制,给1才亮,给0不亮(电势差);下图显示结果:第三亮,显示数字1:(共引脚,其他亮的话数字也一样)
4.C51数组
5.C51子函数
6.数码管段码表
7.数码管驱动方式(了解就好)
8.静态数码管显示代码
第一步:搞懂原理图
原理图是共阴极(上面给0、下给1亮)
上图完整版
输入3(ABC,读的时候是从下读 C B A )个口,控制输出8个口,输出口连接共阴极的,是0还是1,在这里控制:使能端连接(按下图给1和0就可以用了)
通过CBA给数字0和1二进制转换10进制(得到数字几)就控制Y几,Y0头上“—”是表示低电平有效(即给0)
双向缓冲,高电平往低电频送数据
对上图内比较重要的几个原件解释:
CC2(电容):滤波电容,稳定电源,确定电路稳定性,提高电路工作性能可靠运行
RP4:排阻,限流,防止电流过大
这里的P01......P07,就是用P0口,后面代码就是通过P0口控制灯的
只有Y5为0,其他Y0...Y7都为1
读取顺序都是从下到上
代码控制公共端,从下往上写
二进制101转换为1十进制为5,控制Y5,即公共端的LED6
要显示下图的数字6
第二步:开始写代码
代码实现如下(P2控制共阴极,P0控制显示数字)及结果
优化操作代码,代码第三行根据数码管段码表,下面//8表示第一个灯Y7即LED8,在最左边那个
函数调用(前面参数为显示位置,后面为显示数字),接上面代码:
最终代码:
#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()
{Nixie(1,5);while(1){}
}
9.动态数码管显示代码
第一步:
将静态数码管的代码复制粘贴到这里的项目中
第二步:
生成延迟函数复制过来,修改一下
第三步:
动态显示,放循环里面
第四步:
注释掉上面的延时调用,旁边的管会有些影响,需要消影,段选、位选影响造成串位,如下代码消除
最终代码:
#include <REGX52.H>unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i); }}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()
{while(1){Nixie(1,1);//Delay(20);Nixie(2,3);//Delay(20);Nixie(3,1);//Delay(20);Nixie(4,4);//Delay(20);Nixie(5,5);//Delay(20);Nixie(6,2);//Delay(20);Nixie(7,0);//Delay(20);}
}