04节-51单片机-数码管模块

1.静态数码管显示

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
在这里插入图片描述
下图展示了数码管的线路连接
在这里插入图片描述
数码管的连接方式分为,公共端,共阴极和共阳极连接:
在这里插入图片描述
多个数码管共用引脚,该共用引脚的方式,只能显示一位数,动态数码管显示的原理,通过快速的扫描,迷惑肉眼,使其看起来显示多位数。
在这里插入图片描述

在这里插入图片描述
通过138译码器
,可以实现位选(COM公共端选中),主要工作原理为:
通过给P22,P23,P24引脚赋值,即给端口A,B,C赋值来选择共用端LED1~LED8
!!C是高位啊。

CBAY
000Y0
001Y1
010Y2
011Y3
100Y4
101Y5
110Y6
111Y7

例如:若我将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);
	}
}

  • 42
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值