51单片机 2.数码管概述及显示

数码管知识

●LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成的“8”字型器件。
在这里插入图片描述

在这里插入图片描述

数码管引脚定义

●单个数码管
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
● 四位一体数码管
在这里插入图片描述
四位一体数码管实际一次也只能显示一个数字,即使多个数码管点亮显示的都是同一个数字;

数码管的动态显示是对每个数码管采用分时复用的方式轮流点亮每个数码管,在同一时间只会点亮一个数码管。

分时复用的扫描显示利用了人眼的视觉暂留特性,如果公共端的控制信号刷新速度足够快,人眼就不会区分出LED的闪烁,认为4个数码管是同时点亮。

●译码器
在这里插入图片描述

通过译码器位选,可以选择具体一个LED口,比如CBA的值为3,那么Y3=0,即LED4=0,即选中第5个数码管显示数字

●数码管段码表
在这里插入图片描述
0x80 dp亮

数码管静态显示

例:第5个数码管(LED4) 显示数字3,且dp点亮

#include <REGX52.H>

void main()
{
	P2_4 = 0; //C
	P2_3 = 1; //B
	P2_2 = 1; //A  
/* 138译码器:CBA的值决定哪个Y口为0,其他Y口都为1;也即选中LED(Y+1)口为0;*/
	
	P0 = 0x4F+0x80; //1100 1111; //P0的每一位决定dp,g,f,e,d,c,b,a
	while(1);
}

在这里插入图片描述

模块化封装

只需要将需要点亮的数码管编号和显示的数字提供给接口

#include <REGX52.H>

unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};

void NixieTube( unsigned char NixieTubeNum,digit,dp );
/*                        数码管编号,显示的数字,dp是否点亮 0不亮,1亮*/

void main()
{
	NixieTube( 4,5,0 );
	while(1);
}

void NixieTube( unsigned char NixieTubeNum,digit,dp )
{
	if(NixieTubeNum <= 8 && NixieTubeNum >= 0){
		
		switch(NixieTubeNum){
			
			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;
		}
		
		if(dp){
			P0 = NixieTable[digit] + 0x80;
		}else{
			P0 = NixieTable[digit];
		}
	}
}

这里碰到了一个问题,那就是数组不能定义在函数里,必须定义外函数外面,暂时不知道为什么?!!

数码管动态显示

数码管的动态显示是利用视觉的停留效应,比如要显示 345,实际是位选1 段选3 然后位选2 段选4 再位选3 段选5 不停的循环;

这就导致了数字移位的出现,即每一次段选 后 接位选,比如段选3后 接位选2 短暂的时间内 2数码管会显示3 然后才显示4;再加上视觉的停留,会有残影出现 即3 显示在了2数码管上 4显示在在3数码管上,5显示在1数码管上

位选 段选 位选 段选 位选 段选

所以数码管的动态显示需要消影,即每次段选后 不显示任何数字

位选 段选 清零 位选 段选 清零 位选 段选 清零

#include <REGX52.H>

unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};

void NixieTube( unsigned char NixieTubeNum,digit,dp );

void DelayXms( unsigned int xms );

void main()
{
	
	while(1){
		NixieTube( 1,2,0 );
//		DelayXms( 20 );
		NixieTube( 2,4,0 );
//		DelayXms( 20 );
		NixieTube( 3,5,1 );
//		DelayXms( 20 );
	}
}

void NixieTube( unsigned char NixieTubeNum,digit,dp )
{
	if(NixieTubeNum <= 8 && NixieTubeNum >= 0){
		
		switch(NixieTubeNum){
			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;
		}
		
		if(dp){
			P0 = NixieTable[digit] + 0x80;
		}else{
			P0 = NixieTable[digit];
		}
		
		DelayXms( 1 ); //不延时就归0的话,显示的很弱
		P0 = 0x00; //清零
	}
}

void DelayXms( unsigned int xms )
{
	unsigned char i,j;
	
	while(xms--){
		i = 2;
		j = 239;
		do{
			while(--j);
		}while(--i);
	}
}

数码管驱动方式

  • 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间
  • 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可,比如TM1640
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值