1.1单个数码管
1.2 数码管的工作原理
(1)数码管的亮灭是由发光二极管的亮灭实现的。
(2)一位数码管内部有八个发光二极管,利用其亮和灭让数码管显示不同的数字。
1.3 数码管的接线方式
1.3.1 位选
每一个数码管内部的8个二极管是独立驱动的。共阴极数码管和共阳极数码管的区别主要在于位选接线方式的不同。我们把8个发光二极管的公共端称之为位选。
(1)共阳极数码管
8个发光二极管的正极一起接到VCC上,这种接法就叫共阳极。写入代码时,我们要给公共端高电平,即给位选为“1”。
(2)共阴极数码管
如果8颗LED负极一起然后接到GND上,则为共阴极。写入代码时,我们要给公共端低电平,即给位选为“0”。
1.3.2 段选
当我们确定单片机是共阴极或者共阳极数码管时,我们即可以对他的段选端进行赋值。
对于单个数码管,我们对会发光的每个段进行命名。我们采用顺时针的方法进行命名,分别是ABCDEFG DP。
如果我们的数码位选给的是高电平1,那么段选时应该给低电平0可以使数码管发光。反之,如果位选为低电平0,那么段选时即给高电平1,能使数码管发光。
1.4 显示程序
1.4.1静态显示和动态显示的区别
静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
动态显示的特点是将所有的数码管的段选线并接在一起,用一个IO接口控制,公共端是通过相应的IO接口控制,例如138译码器。以共阳极极为例,假设4个数码管工作过程为:第一步使最右边一个数码管的公共端为1,其余数码管公共端为0,这时候只有右边的第一个数码管显示,其余不显示;第二部使右边第二个数码管的公共端为1,其余的公共端为0,同时发送右边第二个数码管的段码,这时候,只有右边第二个数码管显示,其余不显示,以此类推,直到最后一个,每一个数码管轮流显示相应的信息,这就是数码管的动态显示。
(1)数码管静态显示6
以共阳极为例,首先给位选端赋值为1,后对段选端进行赋值,需要其亮的端口把他赋值为0,后用二进制表示出来。
#include <REGX52.H>
sbit LED1=P2^4;
void main()
{
while(1)
{
LED1=1;//位选赋值
P0=0x82;//段选赋值
}
}
(2)数码管动态显示1314
首先写出数码管从0-9显示的二进制数,然后用switch函数进行判断,确定当进入不同语句时,数码管亮不同的位置(该步为给位选位赋值),然后使段选位P0等于数组内段码,即可动态显示数字1314。
case 1指第一个数码管,若switch语句只触发了第一句,而后续数码管显示也只会在第一位,以此类推。
unsigned char Diaplay_[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码表
void Diaplay (unsigned char Location,number)
{
switch(Location)
{
case 1:LED1=0;LED2=1;LED3=1;LED4=1;break;//第一位亮
case 2:LED1=1;LED2=0;LED3=1;LED4=1;break;//第二位亮
case 3:LED1=1;LED2=1;LED3=0;LED4=1;break;//第三位亮
case 4:LED1=1;LED2=1;LED3=1;LED4=0;break;//第四位亮
}
P0=Diaplay_[number];
主要代码:
#include <REGX52.H>
#include <INTRINS.H>
sbit LED1=P2^4;//定义位选位
sbit LED2=P2^5;
sbit LED3=P2^6;
sbit LED4=P2^7;
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
_nop_();
_nop_();
i = 12;
j = 168;
do
{
while (--j);
} while (--i);
xms--;
}
}
unsigned char Diaplay_[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码表
void Diaplay (unsigned char Location,number)
{
switch(Location)
{
case 1:LED1=0;LED2=1;LED3=1;LED4=1;break;//第一位亮
case 2:LED1=1;LED2=0;LED3=1;LED4=1;break;//第二位亮
case 3:LED1=1;LED2=1;LED3=0;LED4=1;break;//第三位亮
case 4:LED1=1;LED2=1;LED3=1;LED4=0;break;//第四位亮
}
P0=Diaplay_[number];
}
void main()
{
while(1)//显示1314
{
Diaplay(1,1);
Delay(500);
Diaplay(2,3);
Delay(500);
Diaplay(3,1);
Delay(500);
Diaplay(4,4);
Delay(500);
}
}