单片机——数码管
1. 数码管简介
数码管:也称为LED数码管,基本单元是发光二极管(LED)。分为七段数码管和八段数码管(多一个小数点DP)。
- 共阳数码管:所有LED的阳极连接到一起形成一个公共阳极接VCC,单片机需要控制某段LED的阴极为低电平时,相应led就会点亮
- 共阴数码管:所有LED的阴极连接到一起形成一个公共阴极接GND,单片机需要控制某段LED的阳极为高电平,相应LED会点亮。注:单片机上IO口的电压不足以驱动数码管的led,因此共阴数码管的阳极一般并不直接连到单片机的IO上,而是中间再接一个电源。
动态数码管:两个或两个以上单个数码管并列在一起形成的多位数码管,内部分为公共端和段码端。多位数码管上的所有数码管在同一时刻现实的数字是一样的,因为它们共用段选线,而在极短的时间内通过“位选”不同的数码管显示不同的数字,从视觉上实现了多个数码管在同一时间的动态显示不同数字。
- 公共端:各个数码管相互独立,负责控制多位数码管中具体哪个数码管工作
- 段码端:各个数码管共用用七段/八段的段选线
2. 原理图分析
静态数码管:静态化数码管是共阳数码管,可以直接通过单片机输出低电平来控制对应的数码管led是否亮
动态数码管:动态化数码管是共阴数码管,通过单片机控制段线实现控制数码管的显示具体数字,通过单片机控制位线实现控制具体哪个数码管显示
74138译码器:默认状态输出的8个IO口(Yn)都是高电平,通过3个输入IO口(A、B 、C)组成的8种状态,实现对8个输出IO口(Yn)具体哪个IO口输出低电平
3. 代码编写
共阳数码管码表
静态数码表
uunsigned char val[16] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
void delay()
{
int i = 100, j = 100;
while(i--)
{
while(j--)
{}
}
}
void main(void)
{
while (1)
{
for(int i=0; i<15; i++)
{
P0 = val[i];
delay();
}
}
}
共阴数码管码表
动态数码表
unsigned char led_select[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char bit_select[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
void delay()
{
int i = 2, j = 100;
while(i--)
{
while(j--)
{}
}
}
void main(void)
{
while (1)
{
for(int i=0; i<8; i++)
{
P2 = bit_select[i]; //位选
P0 = val[i]; //段选
delay();
P0 = 0x0; //清空两个段选数字之间的影响
}
}
}
38译码器真值表
unsigned char led_select[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay()
{
int i = 2, j = 100;
while(i--)
{
while(j--)
{}
}
}
void main(void)
{
while (1)
{
for(int i=0; i<8; i++)
{
P2 = i; //通过译码器位选
P0 = val[i]; //段选
delay();
P0 = 0x0; //清空两个段选数字之间的影响
}
}
}