一.硬件知识。
首先,我们要理解数码管亮灭的原理。如图所示:
如图,a——g和.DP为一个数码管”8“的一部分。数码管分为共阴极(上)和共阳极接法(下),无论是哪种接法,要让二极管导通,即某一段led亮,都要使阴极为0,阳极为一。
下面以共阴极接法为例,原理图如下:
74HC138译码器控制哪个数码管亮(C为最高位),译码的结果直接是低电平0。
74HC245则控制某一数码管哪段亮
二.代码实现解析
1.静态数码管的显示
1.简单使某个数码管亮。
#include <REGX52.H>
void main()
{
P2_2=1;
P2_3=1;
P2_4=0;//使CAB=011,即Y3’=LED4=0,使LED4亮
P0=0x4F;//使LED4显示3,P2=01001111。
while(1)
{
}
}
结果:
LED灯也会亮是因为P2口也是接LED的模块的,无关紧要。
2.小练习:用独立按键控制LED7,按下K1时,LED4显示3,松开K1时,LED4显示8。
代码实现:
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0)
{P2_2=1;
P2_3=1;
P2_4=0;
P0=0x4F;
}
else
{
P2_2=1;
P2_3=1;
P2_4=0;
P0=0xFF;
}
}
}
结果展示:
松开K1时:
按下 K1时:
2.动态数码管的显示
让每一个数码管依次亮
#include <REGX52.H>
void Delay(unsigned char xms) //@12.000MHz
{
unsigned char data i, j;
while(xms--)
{i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}//自定义延时函数
unsigned char arr[8]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07};//用数组存下数码管显示0-7的八种情况
void sel(unsigned char Location,number)
{
switch(Location)
{
case 1:P2_4=0,P2_3=0,P2_2=0;break;
case 2:P2_4=0,P2_3=0,P2_2=1;break;
case 3:P2_4=0,P2_3=1,P2_2=0;break;
case 4:P2_4=0,P2_3=1,P2_2=1;break;
case 5:P2_4=1,P2_3=0,P2_2=0;break;
case 6:P2_4=1,P2_3=0,P2_2=1;break;
case 7:P2_4=1,P2_3=1,P2_2=0;break;
case 8:P2_4=1,P2_3=1,P2_2=1;break;
}
P0=arr[number];
}//定义一个函数,用于控制哪个灯亮(输入Location),和显示的数字(输入number)
void main()
{
while(1)
{ sel(1,0);
Delay(200);
sel(2,1);
Delay(200);
sel(3,2);
Delay(200);
sel(4,3);
Delay(200);
sel(5,4);
Delay(200);
sel(6,5);
Delay(200);
sel(7,6);
Delay(200);
sel(8,7);
Delay(200);//让数码管从LED1到LED8依次亮且从0到7
}
}
拓展:使数码管亮灭的时间间隔很短,人的眼睛就会看不出数码管会灭,即人眼看到的是常亮的数码管
修改上述代码
sel(1,0);
Delay(1);
sel(2,1);
Delay(1);
sel(3,2);
Delay(1);
sel(4,3);
Delay(1);
sel(5,4);
Delay(1);
sel(6,5);
Delay(1;
sel(7,6);
Delay(1);
sel(8,7);
Delay(1);
结果如图