LED的两种连接:共阳极 和 共阴极(stc89c52使用的是共阴极连接)
以 共阴极为例:如果要显示数字6,则需要点亮 A,C,D,E,F,G
位选:3和8要接上低电平
段选:A,C,D,E,F,G接上高电平
四位一体的数码管:可以看出同一时刻,数码管只能显示同一个数字
位选 ---d138译码器(0为 选中)
通过单片机3个引脚控制,8个LED位。例如:
选择LED1 ----> CBA = 000-----> Y0
选择LED5 ----> CBA = 100-----> Y4
选择LED8 ----> CBA = 111-----> Y7
段选 ---- 控制每个数码管a,b,c,d,e,f,g,dg
其中 J21控制74HC245 的数据传输方向。
LE 接VCC高电平 -----> 从A 到 B
LE 接GND低电平 -----> 从B到A
为什么要用一个74HC245芯片?
因为高电平点亮LED不够稳定,需要这个芯片加强信号!
1、点亮一个静态数码管---点亮第一个数码管显示数字6
位选: 选中LED8 ----> CBA=111
P2_4 = 1;P2_3 = 1;P2_2 = 1
段选:选中a,c,d,e,f,g
0111 1101 ----> 十六进制 :0x7D
P0 = 0x7D
#include <REGX52.H>
void main()
{
while(1)
{
P2_4=1; // 138 译码器 C
P2_3=1; // 138 译码器 B
P2_2=1; // 138 译码器 A
P0= 0x7D;
}
}
程序优化 :将显示封装到函数中
#include <REGX52.H>
unsigned char NumberArray[]={0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,};
// location:第几个数码管显示 Number:数码管显示的数字
void display(unsigned char location,Number)
{
switch(location) //位选
{
case 1:P2_4=1;P2_3=1;P2_2=1;break; // 选中第一个数码管,LED8
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
default:P2_4=1;P2_3=1;P2_2=1;
}
P0 = NumberArray[Number];
}
void main()
{
while(1)
{
display(1,14); //第一个数码管显示E
}
}
2、动态数码管显示(多位数码管显示)
数码管的消影现象(图片中1,2,3 并没有显示清除,有阴影):
问题:位选 段选 (这个位置会发生问题) 位选 段选 位选 段选
解决: 位选 段选 清零 位选 段选 清零 位选 段选
#include <REGX52.H>
unsigned char NumberArray[]={0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,};
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void display(unsigned char location,Number)
{
switch(location) //λѡ
{
case 1:P2_4=1;P2_3=1;P2_2=1;break; // Ñ¡ÖеÚÒ»¸öÊýÂë¹Ü LED8
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
default:P2_4=1;P2_3=1;P2_2=1;
}
P0 = NumberArray[Number];
Delay(1); //先延迟1ms
P0=0x00; //清零数码管
}
void main()
{
while(1)
{
display(1,1);
display(2,2);
display(3,3);
}
}
Delay(1); //先延迟1ms
P0=0x00; //清零数码管