图a数码管管脚图,图b是共阳极数码管,图c是共阴极数码管。
由图b可知共阳极数码管阳极连接在一起,接高电平,阴极对应的各段分别控制。比如要想显示1,则阴极对应的bc段低电平,其它接高电平,即可显示。
由图C可知,共阴极数码管将各个二极管的阴极连接在一起(阴极为低电平),而阳极控制各段,比如要显示1,则bc为高电平,其它各段低电平即可显示。
共阳极和共阴极数码管对照表
共阳极数码管对照表(位选位高电平,各段选低电平控制数字显示)
uchar code table[]={
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
0x8c, //P
0xc1,//U
0x91,//Y
0x7c,//L
0x00,//全亮
0xff //熄灭
};
共阴极数码管对照表(位选为低电平,段选为高电平)
uchar code leddata[]={
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"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00 //熄灭
};
#include
#include
typedef unsigned char u8; //重定义全局字符型变量
typedef unsigned int u16; //重定义全局整型变量
u8 code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*利用数组引用数码表(注次数码表为阴极数码表,因为是共阳极数码管,本应使用刚阳极数码管,
为了方便直接将共阴极数码表取反来使用)。code是将数组从ram调到ROM节省空间*/
/*延时函数*/
void dealy(u16 i)
{
while(i--);
}
void main()
{ int i=0;
for(i=0;i<9;i++){
P0=~table[i];//取反是因为使用的是阴极数码表,而取反得阳极数码表
dealy(50000);
}
//p0=~table[0]; 该写法是固定显示数字不变的写法,~table[0]显示的就为0
}
译码器工作原理
可以有真值表观察,当使能控制都为低电平的情况下,A0A1A2输入不同电平控制输出。
例,A0A1A2为000(二进制为0)对应Y0就输出低电平,为001(二进制为1)输出Y1就位高电平。所以就相当于二进制十进制,十进制对应输出。
74HC25看自己的原理图即可,不再阐述。
#include
#include
typedef unsigned char u8; //重定义全局字符型变量
typedef unsigned int u16; //重定义全局整型变量
u8 code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*利用数组引用数码表(该数码管是共阴极数码管,所以使用共阴极数码表)。code是将数组从ram调到ROM节省空间*/
sbit LSA=P2^2; //ABC分别连接单片机的P2^2,P2^3,P2^4管脚
sbit LSB=P2^3;
sbit LSC=P2^4;
/*延时函数*/
void dealy(u16 i)
{
while(i--);
}
/*动态显示函数
*参数说明
*ABC分别为138译码器的输入端,通过控制输入端来控制输出端的高低电平,从而实现对位选的控制
且A为二进制中的低位,C为高位*/
void Display()
{ u16 i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break; //利用138译码器来控制位选,当ABC都等于0时,y0为低电平,其余为高电平
case 1:LSA=1;LSB=0;LSC=0;break; //Y1输出低电平
case 2:LSA=0;LSB=1;LSC=0;break; //Y2输出低电平
case 3:LSA=1;LSB=1;LSC=0;break; //Y3输出低电平
case 4:LSA=0;LSB=0;LSC=1;break; //Y4输出低电平
case 5:LSA=1;LSB=0;LSC=1;break; //Y5输出低电平
case 6:LSA=0;LSB=1;LSC=1;break; //Y6输出低电平
case 7:LSA=1;LSB=1;LSC=1;break; //Y7输出低电平
}
P0=table[i]; //第i个为低电平决定位选则跳出switch循环,P0提供段选(原理图可以看出)
dealy(100); // 短暂的延时,达到肉眼看不到的速度,以达到同时显示效果
P0=0x00; //清零,作用为了下一个显示不会产生重影
}
}
void main()
{
while(1)
{
Display();
}
}