工作原理
在使用数码管之前我们首先来了解一下数码管的工作原理
•LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。
其实数码管就是控制八个LED灯的亮灭来进行显示的,如图2所示A、B、C、D、E、F、G、DP,分别是数码管的八段,我们只需要点亮或熄灭这八段就可以显示需要显示的内容了。
例如:显示1 点亮B、C段 熄灭A、D、E、F、G、DP 转化二进制段码值是1111 1001 十六进制段码值是0XF9(共阳极) 转化二进制段码值是0000 0110 十六进制段码值是0X06(共阴极)
图1(数码管实物图) 图2(数码管段码图)
图3(共阳极) 图4(共阴极)
注:共阳极与共阴极的区别是高低电平驱动,一般我们使用的是低电平驱动,由电源给发光二极管供电,这样电压会更稳定。如果是高电平驱动的话则有单片机进行供电,但是单片机的电压在工作的时候会进行分压,会导致电压偏低。所有我们一般使用低电平驱动。
如图3 发光二极管的阳极接在了一起,公共端为高电平(1),这时我们只用将阴极置低电平(0),二极管导通发光。(低电平驱动)
如图4 发光二极管的阴极接在了一起,公共端为低电平(0),这时我们只用将阳极置高电平(1),二极管导通发光。(高电平驱动)
原理图
现在我们来看一下开发板上的原理图,看如何控制单片机操作数码管。
数码管是由两个573锁存器控制的,分别控制数码管的位选(选择使用哪一个数码管)和段选(显示的内容)
Y6锁存器控制数码管的位选 P2=0XC0打开位选573锁存器
Y7锁存器控制数码管的段选 P2=0XE0打开段选573锁存器
代码详解
1、点亮第一个数码管,显示数字1
//点亮第一个数码管,显示数字1
#include <STC15F2K60S2.H>
void Delayms(int ms);
void main(void)
{
P2=0X80;P0=0XFF;P2=0XA0;P0=0X00; //初始化,下一篇会专门解释初始化函数的
while(1)
{
P2=0XC0; //打开位选573锁存器
P0=0X01; //使用第一个数码管
P2=0XE0; //打开段选573锁存器
P0=0XF9; //显示数字1
Delayms(1);
}
}
void Delayms(int ms) //延时
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
2、动态数码管函数的使用
#include <STC15F2K60S2.H>
unsigned char yi,er,san,si,wu,liu,qi,ba; //数码管位选值
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,0X00}; //数码管段选值
void Delayms(int ms); //延时
void SMG1(unsigned char yi,unsigned char er); //数码管
void SMG2(unsigned char san,unsigned char si);
void SMG3(unsigned char wu,unsigned char liu);
void SMG4(unsigned char qi,unsigned char ba);
void main(void)
{
P2=0X80;P0=0XFF;P2=0XA0;P0=0X00; //初始化,下一篇会专门解释初始化函数的
while(1)
{
SMG1(1,3); //调用函数,传参数 显示1314520
SMG2(1,4);
SMG3(5,2);
SMG4(0,11);
}
}
void SMG1(unsigned char yi,unsigned char er) //第一、二两个数码管
{
P2=0XC0; //打开数码管位选573锁存器
P0=0X01; //打开第一个数码管
P2=0XE0; //打开数码管段选573锁存器
P0=tab[yi]; //显示数码管段选
Delayms(1); //动态数码管延时
P2=0XC0;
P0=0X02;
P2=0XE0;
P0=tab[er];
Delayms(1);
}
void SMG2(unsigned char san,unsigned char si) //第三、四两个数码管
{
P2=0XC0;
P0=0X04;
P2=0XE0;
P0=tab[san];
Delayms(1);
P2=0XC0;
P0=0X08;
P2=0XE0;
P0=tab[si];
Delayms(1);
}
void SMG3(unsigned char wu,unsigned char liu) //第五,六两个数码管
{
P2=0XC0;
P0=0X10;
P2=0XE0;
P0=tab[wu];
Delayms(1);
P2=0XC0;
P0=0X20;
P2=0XE0;
P0=tab[liu];
Delayms(1);
}
void SMG4(unsigned char qi,unsigned char ba) //第七、八两个数码管
{
P2=0XC0;
P0=0X40;
P2=0XE0;
P0=tab[qi];
Delayms(1);
P2=0XC0;
P0=0X80;
P2=0XE0;
P0=tab[ba];
Delayms(1);
}
void Delayms(int ms) //延时
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
在写程序之前我们一定一定要看懂原理图。
以上就是我对数码管模块的全部理解,如有不对之处,还希望大家留言指正。有什么好的建议也可以留言。