目录
- 前言
- 一、硬件原理
- 二、静态数码管显示
- 三、动态数码管显示
- 总结
前言
本节主要学习静态数码管与动态数码管的显示。
一、硬件原理
LED数码管是由多个发光二极管封装在一起的显示器件,主要分为共阴极和共阳极数码管两类。
硬件原理图如下:
笔者所用开发板上有两个四显示共阴极数码管,各数码管受相同八引脚控制显示,由于单片机输出高电平驱动能力较弱,利用74HC245芯片供给较大电流和功率驱动,并通过配置com端的电平来选亮数码管。
利用3-8译码器节省单片机IO资源。
二、静态数码管显示
51单片机P0寄存器控制数码管各段的显示,由原理图可知,若使数码管显示3,则需配置P0=0x4F。
如上图,令LED8=0,其余为高电平,即可选通第一个数码管。
显示对应表如下:
使第一个数码管显示3
代码如下:
#include <REGX52.H>
//数码管段码表
unsigned char TubeTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Tube(unsigned char Location, unsigned char 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 = TubeTable[Number];
}
void main()
{
Tube(1,3); //在数码管的第1位置显示3
while(1)
{
}
}
显示如下:
三、动态数码管显示
由于单片机8个管脚同时控制不同数码管,也就意味着数码管同时显示时,只能显示相同的数字,为了解决这个问题,可对数码管动态扫描,即显示一个数码管后以极短时间间隔再显示其他数码管,利用人眼视觉残留便可认为多个数码管同时显示。
代码如下:
#include <REGX52.H>
//数码管段码表
unsigned char TubeTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//延时函数
void Delayms(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Tube(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=TubeTable[Number];
Delayms(3); //显示一段时间
P0=0x00; //消影解决视觉残留
}
void main()
{
while(1)
{
Tube(1,3);
//Delayms(100);
Tube(2,2);
//Delayms(100);
Tube(3,1);
//Delayms(100);
}
}
上述代码实现在前三个数码管上显示3、2、1,并每次跳转显示时都做了消除残影处理,即显示之后数码管被设置为空。读者可在此基础上调试并观察消影前现象,以及加长延时观察数码管的扫描现象。
现象显示:
总结
本节主要介绍静态与动态数码管显示的操作学习,使读者了解数码管的显示机理并掌握单片机的数码管控制操作。