四、数码管显示
1、数码管介绍
-
LED数码管:一种简单廉价的显示器,是由多个发光二极管封装在一起组成”8“字形的器件。
-
一位数码管,就是八段LED拼凑。
-
原理图有共阴(阴极连接在一个引脚上)或共阳两种接法
-
公共端先选好,叫位选。选好段码叫段选。
-
对于四位数码管,原理和一位数码管相同。但使用原理不相同。因为只允许单个被位选,即使选了多个,那也是显示相同的数字(因为四位数码管是段选是公用引脚的,优势就是操作起来可以用更少的引脚)
-
此弊病,可以利用单片机的数码管扫描。很快的重复单个数字,肉眼不可见(动态数码管显示)
2、代码
(1)数码管静态显示
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(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=NixieTable[Number];
}
//模块化编程,将段码封装。
void main()
{
Nixie(7,3);//静态显示,即显示一位数码管
while(1)
{
}
}
(2)数码管动态显示
因为只允许单个被位选,即使选了多个,那也是显示相同的数字(因为四位数码管是段选是公用引脚的,优势就是操作起来可以用更少的引脚)
故数码管驱动方式有两种:
-
单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间。
-
专用驱动芯片:内部自带显存,扫描电路,单片机只需告诉它显示什么即可。
代码演示
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void Nixie(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=NixieTable[Number];
Delay(1);//立马清零数码管会比较暗
P0=0x00; // 位选段选 清零 位选段选 清零 位选段选 清零.... 消影
}
void main()
{
while(1)
{
Nixie(1,1);
// Delay(20);
Nixie(2,2);
// Delay(20);
Nixie(3,3);
// Delay(20);
//当延迟低到一定程度时可以让三个数字同时显示,但也造成了“串位的问题”
// 位选 段选 位选 段选位选段选 “串位严重”
}
}