🏆文章目录
❤️第一话——基础知识
🤡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; /*********输入一个1 0 0的数据,对应为操作Y4******/
P2_4=1; /*********也就是操作第4位数码管*********************/
P0=0X07; //数码管的段码,对应数据为0000 0111,也就是数字7
while(1);
}
🤣 2.2随意改变参数的数码管显示
/*******************随意调整显示位置和内容的数码管程序**********/
#include <regx52.h>
//共阴极数码管的段码,显示数字0~9
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//开发板上有8个数码管,用38译码器选定第几个数码管的位置函数
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]; //想让数码管显示几,就从这里给P0口赋对应的数码管段码数组
}
void main()
{
Nixie(6,3); //给函数传参数,让第6个数码管,显示数字3
while(1);
}
😂 2.3动态数码管显示
#include <regx52.h>
#include <intrins.h> //nop函数的头文件
/**********************************************************/
/**************随意改变参数的延时函数***********************/
void Delay(unsigned char xms)
{
while(xms)
{
unsigned char i=2;
unsigned char j=199;
_nop_();
do
{
while(--j);
}while(--i);
xms--;
}
}
/*************************************************************/
/***********************0~9的数码管显示段码*********************/
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); //延时1毫秒,视觉停留,余辉效应
P0=0X00; //消影,不然显示会有混乱,可以把这个注释掉,观察实验现象
}
/***************主函数进入数码管显示函数***********************/
/**********实际显示1后显示2,在显示3,因为延时1ms视觉停留,所以看着是数码管显示4 5 6的静态显示***********************/
void main()
{
while(1)
{
Nixie(4,4);
Nixie(5,5);
Nixie(6,6);
}
}
😘2.4两个独立按键控制单个数码管递加、递减
#include <regx52.h>
#include <intrins.h> //包含nop函数的头文件
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) //越界判断,因为数码管我们写的0~9的段码,所以不能超过10位
{
cnt++; //每按一次,计数器cnt递加一次
i=NixieTable[cnt]; //让i为数码管显示的数据
Delay(1000); //延时
}else
{
cnt=0; //超过10后,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; //计数器递减到小于0时,初始化为9
i=NixieTable[9]; //数码管显示也初始化
Delay(1000); //延时
}
}
if(P3_0!=0&&P3_1!=0) //上面的程序,不能让数码管一直显示,我们让这两个按键不操作时,进入到循环体里,执行数码管的显示,不然按键松手数码管就不显示了
{
P0=i; //数码管一直显示
}
}
}
❤️第三话——总结
数码管的显示实际就是先选位,在用段码来显示对应数字,学完这节,大家可以尝试写一个简易秒表程序,按键控制开始,停止,清零的操作。