简介
数码管分为共阴数码管和共阳数码管。简单说就是所有阴极共用一个引脚或所有阳极共用一个引脚。
用共阴数码管举例:A,B,C,D,E,F,G对应数码管的段。1,2,3,4对应数码管的位。共阴数码管高电平时段有效,低电平时位有效。共阳数码管反之,低电平段有效,高电平位有效。
数码管对应的字符
共阴
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0xff, //全亮
0x00 //全灭
共阳
0xc0,//0
0xf9,//1
0xa4,//2
0xb0,//3
0x99,//4
0x92,//5
0x82,//6
0xf8,//7
0x80,//8
0x90,//9
0x88,//A
0x83,//B
0xc6,//C
0xa1,//D
0x86,//E
0x8e, //F
0x00, //全亮
0xff //全灭
原理图
代码部分
#include <REGX52.H>
sbit U3=P2^0; //段选
sbit U4=P2^1; //位选
void delay()//延时函数
{
unsigned int i;
for(i=0;i<300;i++);
}
unsigned char DX[]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x6F};//共阴数码管字符
char dx(unsigned int x)//选择段函数
{
unsigned char y;
y=DX[x];
return y;
}
void wx(unsigned char locaton)//选择位函数
{
switch(locaton)
{
case 1:P0=0xfe;break;
case 2:P0=0xfd;break;
case 3:P0=0xfb;break;
case 4:P0=0xf7;break;
case 5:P0=0xef;break;
case 6:P0=0xdf;break;
case 7:P0=0xbf;break;
case 8:P0=0x7f;break;
}
}
void print(unsigned char x,y)//显示函数
{
U3=1;//段选开
P0=dx(x);
U3=0;//段选关
U4=1;//位选开
wx(y);
U4=0;//位选关
delay();
P0=0x00;//消影
}
main()
{
while(1)
{
print(1,1);
print(2,2);
print(3,3);
print(4,4);
print(5,5);
print(6,6);
print(7,7);
print(8,8);
}
}
PS:当中消影代码,可以自己试试效果 ,这样印象深刻。
结论:
数码管还是属于简单的部分,主要就是理解段选位选的逻辑。我用的是74HC573译码器,有的板子是38码器。注意一下就可。