从零开始带你玩转单片机----------【第四期】数码管显示

发布于:2022-12-24 ⋅ 阅读:(1147) ⋅ 点赞:(0)

❤️第一话——基础知识

🤡1.1什么是数码管?

在这里插入图片描述
在这里插入图片描述

LED数码管内部由多个发光二极管构成,LED数码管为“8”字形,算小数点段总共8段,每一段对应着一个发光二极管,有共阴极和共阳极两种。

🤖1.2用一位数码管显示一个数字

在这里插入图片描述
在这里插入图片描述
假设用一位数码管表示数字7,实际上我们只要点亮a、b、c三段的二极管,其他的保持熄灭,就能呈现出数字7的显示;但是我们此时需要注意数码管是共阴极还是共阳极连接,上图为共阴极连接,要点亮a、b、c段的二极管,首先公共端要输入0-低电压,a、b、c三段输入为1-高电平,其他为低电平即可,共阳性原理类似。

👾1.3四位一体的数码管

在这里插入图片描述
在这里插入图片描述

四位一体的数码管,每个数码管公共端单独分开(12、9、8、6),相同的段选端接在一起(a~g,dp),如果要在某一个上显示数字,先选中需要显示数字的那位的公共端,在进行段选即可。

👹1.4译码器

  • 译码器是一种具有“翻译”功能的逻辑电路,这种电路能将输入二进制代码的各种状态,按照其原意翻译成对应的输出信号。有一些译码器设有一个和多个使能控制输入端,又成为片选端,用来控制允许译码或禁止译码。
    在这里插入图片描述
    在这里插入图片描述

-三八译码器——就是用三位来控制八位,但首先需要三个引脚片选上,G1接高电平,G2A、G2B接低电平,才能实现;将三位选择端组成的二进制数据换算为对应十进制数据,就是选择控制的端口,如101转化为十进制为5,那么选中的就为Y5,参照上面的真值表。

❤️第二话——代码实操

😃 2.1数码管显示一个数字

/*************一位数码管显示一个数字*********************/

#include <regx51.h>

void main()
{
	P2_2=0;     /*********这里是三八译码器****************************/
	P2_3=0;    /*********输入一个1 0 0的数据,对应为操作Y4******/
	P2_4=1;   /*********也就是操作第4位数码管*********************/ 
	
	P0=0X07;     //数码管的段码,对应数据为0000  0111,也就是数字7
	while(1);
}

🤣 2.2随意改变参数的数码管显示

/*******************随意调整显示位置和内容的数码管程序**********/
#include <regx52.h>

//共阴极数码管的段码,显示数字0~9
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};


//开发板上有8个数码管,用38译码器选定第几个数码管的位置函数
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];            //想让数码管显示几,就从这里给P0口赋对应的数码管段码数组
	
}


void main()
{
	Nixie(6,3);                       //给函数传参数,让第6个数码管,显示数字3
	while(1)}

😂 2.3动态数码管显示

#include <regx52.h>
#include <intrins.h>  //nop函数的头文件

 /**********************************************************/
 /**************随意改变参数的延时函数***********************/
 
void Delay(unsigned char xms)        
{                                   
	while(xms)
	{
	  
		unsigned char i=2;
		unsigned char j=199;         
		_nop_();
	  do
	  {
	   while(--j);
	  }while(--i);
		xms--;                
  }                                 
}                                 
  /*************************************************************/



 /***********************0~9的数码管显示段码*********************/
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];//让数码管显示具体数字
	  Delay(1);           //延时1毫秒,视觉停留,余辉效应
	  P0=0X00;            //消影,不然显示会有混乱,可以把这个注释掉,观察实验现象
}

/***************主函数进入数码管显示函数***********************/
/**********实际显示1后显示2,在显示3,因为延时1ms视觉停留,所以看着是数码管显示4 5 6的静态显示***********************/
void main()
{
	while(1)
	{
	Nixie(4,4); 
	Nixie(5,5);
	Nixie(6,6);
	
	}
}

😘2.4两个独立按键控制单个数码管递加、递减

#include <regx52.h>
#include <intrins.h>  //包含nop函数的头文件

unsigned char i;    //定义一个全局变量,用于后面传递数据
unsigned char cnt;  //定义一个全局变量,计数器的作用,用于累加

/******延时函数******/
void Delay(unsigned char xms)
{
	while(xms)
	{
	  
		unsigned char i=2;
		unsigned char j=199;
		_nop_();
	  do
	  {
	   while(--j);
	  }while(--i);
		xms--;
  }
}

/*******第几位数码管显示的函数*******/
void NixieLocation()
{
    P2_4=1;
    P2_3=1;
    P2_2=1; 
    P0=0x00;	//初始化数码管,让数码管不显示
}

/****************数码管显示数字几的段码*************/
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};	


void main()
{
	  while(1)
		{
	         NixieLocation();    //调用数码管位置函数
	
	         if(P3_1==0)        //按键检测,按键按下执行循环体里的
	         {
		       Delay(20);       //按键消抖
		       while(P3_1==0);  //按键松手判定
		       Delay(20);       //按键松手去抖
		
		
		          if(cnt<10)     //越界判断,因为数码管我们写的0~9的段码,所以不能超过10位
		          {
		             cnt++; 	//每按一次,计数器cnt递加一次		
			         i=NixieTable[cnt];    //让i为数码管显示的数据
			         Delay(1000);        //延时
	          	  }else
	           	  {
			         cnt=0;             //超过10后,cnt归0,在一次递增
			         i=NixieTable[0];	//数码管显示也要初始化
                     Delay(1000);			
		          }
	         }
	
					
	             if(P3_0==0)      //按键检测
	             {
		            Delay(20);     //延时去抖
		            while(P3_0==0);   //松手检测
		            Delay(20);    //延时去抖
		
		
		          if(cnt>0)     //因为要递减操作,递减下去会出现负数,所以要设置这个越界判定
		          {
		             cnt--; 	//每按一次,递减操作			
			         i=NixieTable[cnt];   //数码管显示的数据,
			         Delay(1000);       //延时
	          	  }else
	          	  {
			         cnt=9;        //计数器递减到小于0时,初始化为9
			         i=NixieTable[9];	//数码管显示也初始化
                     Delay(1000);		//延时
		          }
	            }
					 
				if(P3_0!=0&&P3_1!=0)    //上面的程序,不能让数码管一直显示,我们让这两个按键不操作时,进入到循环体里,执行数码管的显示,不然按键松手数码管就不显示了
                {					
				P0=i;        //数码管一直显示
                }				 
     }
}

❤️第三话——总结

数码管的显示实际就是先选位,在用段码来显示对应数字,学完这节,大家可以尝试写一个简易秒表程序,按键控制开始,停止,清零的操作。


网站公告

今日签到

点亮在社区的每一天
去签到