目录
五、数码管
(1)静态数码管显示
让任意位置显示0~9的数字,首先我们来看138译码器原理图:
图5.1-1
通过三个引脚依次控制LED(0...7)输出低电平。结合Switch语句就能实现在任意位置显示某个数(0...9)。
图5.1-2
数码管数字编码原理如下:
图5.1-3
图5.1-4
再增加一个数组存放这些编码值,定义一个结构体函数,形参分别放位置和数值,具体代码如下:
#include <REGX52.H>
unsigned char Nixie[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //显示数值
void LED_display(unsigned int location,number)
{
switch(location) //确定位置
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
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;
}
P0=Nixie[number];
}
void main()
{
LED_display(1,2); //第一个数码管显示2
while(1);
}
(2)动态数码管显示
效果:让数码管显示123。
这个就是在上一个代码中多调用几次显示函数,同时为了消影,在每调用一次的时候就加一个一毫秒延时即可。具体代码如下:
#include <REGX52.H>
void Delay(int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
unsigned char Nixie[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void LED_display(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
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;
}
P0=Nixie[Number];
}
void main()
{
while (1)
{
LED_display(1,1);
Delay(1); //延时消影
LED_display(2,2);
Delay(1);
LED_display(3,3);
Delay(1);
}
}
还有一种方法就是up主讲的,在显示函数中加一个延时和清零操作,也能达到这个效果。具体代码如下:
#include <REGX52.H>
void Delay(int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
unsigned char Nixie[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void LED_display(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
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;
}
P0=Nixie[Number];
Delay(1);
P0=0x00; //清零操作
}
void main()
{
while (1)
{
LED_display(1,1);
LED_display(2,2);
LED_display(3,3);
}
}
六、模块化编程
图6.1-1
这里以led闪烁的代码延时函数为例。
图6.1-2
同理,数码管显示也是可以模块化的,这里就不一一展示了,模块化编程使得我们的主程序代码简洁、易懂,希望大家多运用模块化编写程序。