??第一话——基础知识
🤡1.1什么是数码管?
LED数码管内部由多个发光二极管构成,LED数码管为“8”字形,算小数点段总共8段,每一段对应着一个发光二极管,有共阴极和共阳极两种。
🤖1.2用一位数码管显示一个数字
假设用一位数码管表示数字7,实际上我们只要点亮a、b、c三段的二极管,其他的保持熄灭,就能呈现出数字7的显示;但是我们此时需要注意数码管是共阴极还是共阳极连接,上图为共阴极连接,要点亮a、b、c段的二极管,首先公共端要输入0-低电压,a、b、c三段输入为1-高电平,其他为低电平即可,共阳性原理类似。
👾1.3四位一体的数码管
四位一体的数码管,每个数码管公共端单独分开(12、9、8、6),相同的段选端接在一起(a~g,dp),如果要在某一个上显示数字,先选中需要显示数字的那位的公共端,在进行段选即可。
👹1.4译码器
- 译码器是一种具有“翻译”功能的逻辑电路,这种电路能将输入二进制代码的各种状态,按照其原意翻译成对应的输出信号。有一些译码器设有一个和多个使能控制输入端,又成为片选端,用来控制允许译码或禁止译码。
-三八译码器——就是用三位来控制八位,但首先需要三个引脚片选上,G1接高电平,G2A、G2B接低电平,才能实现;将三位选择端组成的二进制数据换算为对应十进制数据,就是选择控制的端口,如101转化为十进制为5,那么选中的就为Y5,参照上面的真值表。
??第二话——代码实操
😃 2.1数码管显示一个数字
#include <regx51.h>
void main()
{
P2_2=0;
P2_3=0;
P2_4=1;
P0=0X07;
while(1);
}
🤣 2.2随意改变参数的数码管显示
#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(6,3);
while(1);
}
😂 2.3动态数码管显示
#include <regx52.h>
#include <intrins.h>
void Delay(unsigned char xms)
{
while(xms)
{
unsigned char i=2;
unsigned char j=199;
_nop_();
do
{
while(--j);
}while(--i);
xms--;
}
}
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];
Delay(1);
P0=0X00;
}
void main()
{
while(1)
{
Nixie(4,4);
Nixie(5,5);
Nixie(6,6);
}
}
😘2.4两个独立按键控制单个数码管递加、递减
#include <regx52.h>
#include <intrins.h>
unsigned char i;
unsigned char cnt;
void Delay(unsigned char xms)
{
while(xms)
{
unsigned char i=2;
unsigned char j=199;
_nop_();
do
{
while(--j);
}while(--i);
xms--;
}
}
void NixieLocation()
{
P2_4=1;
P2_3=1;
P2_2=1;
P0=0x00;
}
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void main()
{
while(1)
{
NixieLocation();
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
if(cnt<10)
{
cnt++;
i=NixieTable[cnt];
Delay(1000);
}else
{
cnt=0;
i=NixieTable[0];
Delay(1000);
}
}
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(cnt>0)
{
cnt--;
i=NixieTable[cnt];
Delay(1000);
}else
{
cnt=9;
i=NixieTable[9];
Delay(1000);
}
}
if(P3_0!=0&&P3_1!=0)
{
P0=i;
}
}
}
??第三话——总结
数码管的显示实际就是先选位,在用段码来显示对应数字,学完这节,大家可以尝试写一个简易秒表程序,按键控制开始,停止,清零的操作。
|