1.静态数码管显示
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
下图展示了数码管的线路连接
数码管的连接方式分为,公共端,共阴极和共阳极连接:
多个数码管共用引脚,该共用引脚的方式,只能显示一位数,动态数码管显示的原理,通过快速的扫描,迷惑肉眼,使其看起来显示多位数。
通过138译码器
,可以实现位选(COM公共端选中),主要工作原理为:
通过给P22,P23,P24引脚赋值,即给端口A,B,C赋值来选择共用端LED1~LED8
!!C是高位啊。
C | B | A | Y |
---|---|---|---|
0 | 0 | 0 | Y0 |
0 | 0 | 1 | Y1 |
0 | 1 | 0 | Y2 |
0 | 1 | 1 | Y3 |
1 | 0 | 0 | Y4 |
1 | 0 | 1 | Y5 |
1 | 1 | 0 | Y6 |
1 | 1 | 1 | Y7 |
例如:若我将P22=0,P23=0,P24=0,则我通过138译码器选择了Y0,也就是位选到LED1,再根据下图P0引脚设置高低电平,显示目标数字。
其中:
74HC245为双向数据缓冲器,有利于提高驱动能力,使得数码管看起来更亮
74HC245的作用:信号功率放大。
第1脚DIR,为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。
第2~9脚“A”信号输入输出端,A1=B1、、、、、、A8=B8,A1与B1是一组,如果DIR=“1”G=“0”则A1输入B1输出,其它类同。如果DIR=“0”G=“0”则B1输入A1输出,其它类同。
第11~18脚“B”信号输入输出端,功能与“A”端一样,不在描述。
第19脚G,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。
第10脚GND,电源地。
第20脚VCC,电源正极。
单位换算工具
数码管显示数字对应的P0电平输入
下面代码经过我的改进,不在是单一的在指定位置显示指定数字,而是改为我称之为流动的数码管。
#include <REGX52.H>
void Delay(int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
void Nixie(unsigned char Location,unsigned char Number)
{
switch(Location)
{
case 1: P2_2=1,P2_3=1,P2_4=1;break;
case 2: P2_2=0,P2_3=1,P2_4=1;break;
case 3: P2_2=1,P2_3=0,P2_4=1;break;
case 4: P2_2=0,P2_3=0,P2_4=1;break;
case 5: P2_2=1,P2_3=1,P2_4=0;break;
case 6: P2_2=0,P2_3=1,P2_4=0;break;
case 7: P2_2=1,P2_3=0,P2_4=0;break;
case 8: P2_2=0,P2_3=0,P2_4=0;break;
}
P0=NixieTable[Number];
}
void main()
{
unsigned char Location=1;
while(1)
{
if(Location==9)
Location=1;
Nixie(Location,Location);
Delay(200);
Location++;
}
}
要想实现静态一位的显示,只需要将while循环中的去掉,并在前面加上函数调用即可。
2.动态数码管显示
按理来说,因为共用引脚,所以只能显示多个数中的一个,为了解决这一问题,我们使用快速扫描显示的方式
#include <REGX52.H>
void Delay(int ms) //@12.000MHz
{
unsigned char data i, j;
while(ms--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77F,0x7C,0x39,0x5E,0x79,0x71,0x00};
void Nixie(unsigned char Location,unsigned char Number)
{
switch(Location)
{
case 1: P2_2=1;P2_3=1;P2_4=1;break;
case 2: P2_2=0;P2_3=1;P2_4=1;break;
case 3: P2_2=1;P2_3=0;P2_4=1;break;
case 4: P2_2=0;P2_3=0;P2_4=1;break;
case 5: P2_2=1;P2_3=1;P2_4=0;break;
case 6: P2_2=0;P2_3=1;P2_4=0;break;
case 7: P2_2=1;P2_3=0;P2_4=0;break;
case 8: P2_2=0;P2_3=0;P2_4=0;break;
}
P0=NixieTable[Number];
Delay(1);
P0=0x00;
}
void main()
{
while(1)
{
Nixie(1,1);
Nixie(2,2);
Nixie(3,3);
Nixie(4,4);
}
}