数码管的原理及静态显示

数码管的原理及静态显示

数码管的结构和原理

image-20220121130559642

image-20220121130646385

显示字符共阴极字段码共阳极字段码显示字符共阴极字段码共阳极字段码
03FHC0HC39HC6H
106HF9HD5EHA1H
25BHA4HE79H86H
34FHB0HF71H8EH
466H99HP73H8CH
56DH92HU3EHC1H
67DH82HT31HCEH
707HF8HY6EH91H
87FH80HL38HC7H
96FH90H8.FFH00H
A77H88H“灭”00FFH
B7CH83H………………

LED数码管的显示方式

静态显示和动态显示

静态显示方式

image-20220121130752035

特点:

  • 公共端直接接地(共阴极)或接电源(共阳极) 。
  • 每个数码管的段选线与一组I/O接口线相连。
  • 每个数码管一直显示。

绘制

下面有一条线的就是共阴极的,相反共阳极的在上面

image-20220121131238493

image-20220121131548000

先亮0

image-20220121132802378

根据这个,我们可以写出完整代码

#include "reg51.h"
#include "string.h"

//定义一个数组,共阴0-9
unsigned char s[] = 
{
   0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};

void delay(unsigned int n)
{
	//给变量一个初始值,防止变量初始化的时候是一个随机数
	//可能造成程序的误动作
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
	   for(j=0;j<120;j++);
	}
}

void seg()
{
	//P2 = 0x3F;//0011 1111,横和接地不亮
	int i=0;
	for(i=0;i<strlen(s);i++)
	{
	   //P2 = s[i];//共阴
	   P2 = ~s[i];//共阳
	   delay(500);
	}
}

void main()
{
	  while(1)
	  {
	  	//子函数,执行数码管的操作
		seg();
	  }
}

编译运行

共阳

image-20220121134300813

共阴

image-20220121134338040

动态显示方式

image-20220121130843485

特点:

  • 所有数码管的段选线与一组I/O接口线并连在一起。
  • 每个数码管的公共端由一根I/O线控制。
  • 显示为逐个显示。

image-20220121163053812

image-20220121163224890

位码低电平有效,验证

image-20220121163619021

编译,用共阴

#include "reg51.h"
#include "string.h"

//定义一个数组,共阴0-9
unsigned char s[] = 
{
   0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};

void delay(unsigned int n)
{
	//给变量一个初始值,防止变量初始化的时候是一个随机数
	//可能造成程序的误动作
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
	   for(j=0;j<120;j++);
	}
}

void seg()
{
	//P2 = 0x3F;//0011 1111,横和接地不亮
	int i=0;
	for(i=0;i<strlen(s);i++)
	{
	   P2 = s[i];//共阴
	   //P2 = ~s[i];//共阳
	   delay(500);
	}

}

void main()
{
	  while(1)
	  {
	  	//子函数,执行数码管的操作
		seg();
	  }
}

导入hex文件

接下来我们显示出HELLO

image-20220121165339935

H:0111 0110 --> 0x76

E:0111 1001 --> 0x79

L:0011 1000 --> 0x38

O: 0011 1111 --> 0x3F

更改单片机连接方式

image-20220121170408019

#include "reg51.h"
#include "string.h"

//定义一个数组,共阴0-9
unsigned char s[] = 
{
   0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};

//定义一个数组,显示HELLO
unsigned char str[] = {0x76,0x79,0x38,0x38,0x3F};
//位码数组
unsigned char wei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void delay(unsigned int n)
{
	//给变量一个初始值,防止变量初始化的时候是一个随机数
	//可能造成程序的误动作
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
	   for(j=0;j<120;j++);
	}
}

void seg()
{
	//P2 = 0x3F;//0011 1111,横和接地不亮
	int i=0;
	//字母只有5个,可以循环5次
	for(i=0;i<5;i++)
	{
		P3=~wei[i];//选中位,低电平有效,取反
	    P2 = str[i];//给段码值
	    //P2 = ~s[i];//共阳
	    delay(5);//更改延时,更快显示来欺骗眼睛
	}
}

void main()
{
	  while(1)
	  {
	  	//子函数,执行数码管的操作
		seg();
	  }
}

效果:

image-20220121170945334

电路图简化

74LS138 为3 线-8线译码器,共有 54LS138和 74LS138 两种线路结构型式。54LS138为军用,74LS138为民用。

image-20220121171259001

image-20220121171453462

输出端的圆圈是取反

Y0是低电平输出

E2是高电平有效

image-20220121172608338

更改代码:

#include "reg51.h"
#include "string.h"

//定义一个数组,共阴0-9
unsigned char s[] = 
{
   0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};

//定义一个数组,显示HELLO
unsigned char str[] = {0x76,0x79,0x38,0x38,0x3F};
//位码数组
//unsigned char wei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char wei[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

void delay(unsigned int n)
{
	//给变量一个初始值,防止变量初始化的时候是一个随机数
	//可能造成程序的误动作
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
	   for(j=0;j<120;j++);
	}
}

void seg()
{
	//P2 = 0x3F;//0011 1111,横和接地不亮
	int i=0;
	//字母只有5个,可以循环5次
	for(i=0;i<5;i++)
	{
		//P3=~wei[i];//选中位,低电平有效,取反
		P3 = wei[i];
	    P2 = str[i];//给段码值
	    //P2 = ~s[i];//共阳
	    delay(5);
	}
}

void main()
{
	  while(1)
	  {
	  	//子函数,执行数码管的操作
		seg();
	  }
}

image-20220121173010666

硬件电路优化,减少IO口的使用(减少了5个)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值