数码管的静态显示和动态显示案例介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、静态显示和动态显示的介绍。
    • 1.数码管显示原理
    • 2.优缺点分析
  • 二、代码
    • 1.静态显示
    • 2.动态显示
  • 总结
  • 参考资料


前言

单片机控制多个数码管显示数字的时候。我们会采用静态显示和动态显示。如果是初学者的话,这篇文章一定会对你有所帮助。


一、静态显示和动态显示的介绍。

1.数码管显示原理

静态显示
多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,否则一体的多位同时显示必须时显示相同内容。当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选的信号都是相同的,那么他们显示的数字必定一样。(换言之,你可以通过位选控制那个数码管亮,但是亮的同时显示的数字必定相同)
动态显示
位选控制亮不亮,而段选控制显示数字,那怎样显示不同的数字呢?这就利用了人体肉眼观察的能力。
举个例子,假设段选1控制第一位数码管数字显示1,那么在显示第二个数码管是段选控制数码管显示2,而位选控制灯第二位数码管亮,第一位数码管灭。但是给人的感受是第一位数码管并没有灭(实际已经灭了),因为时间太短人体肉眼无法识别。这样就会发现数码管动态显示是向左或向右一位一位点亮。

2.优缺点分析

占用CPU时间不同

1、静态显示:静态显示占用CPU时间少,显示稳定可靠。

2、动态显示:动态显示占用CPU时间长,只要不执行显示程序,就立刻停止显示。

占用 I/O不同

1、静态显示:当静态显示的显示位数较多时,占用I/O较多。

2、动态显示:动态显示使用硬件少,占用 I/O较少。

二、代码

1.静态显示

代码如下(示例):

/**
 * @brief     :动态显示0到99的数字
 * @param     :无
 * @retval    :无
 * @author    :嘤嘤嘤
 * @date      :2022-06-22 
 * */
#include"REGX52.H"
typedef unsigned int uint;
uint SegCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳码表

void DelayMs(uint ms)
{
	uint i;
	while(ms--)
		for(i=0;i<113;i++);
	
}

void main()
{	  
	uint Count=0;//计数
    uint a[2];
	while(1)
	{
		a[0]=Count/10;//显示十位
		a[1]=Count%10;//显示个位
        P2=SegCode[a[0]];
		P3=SegCode[a[1]];
		Count++;
		if(Count>99)//显示到99就重新开始计数
		  Count=0;
		DelayMs(200);//防止程序运行太快。
	}
}

原理图
数码管的静态显示和动态显示案例介绍_第1张图片

2.动态显示

代码如下(示例):
初级版

/**
 * @brief     :动态显示0到999的数字
 * @param     :无
 * @retval    :无
 * @author    :嘤嘤嘤
 * @date      :2022-06-22 
 * */
#include"REGX52.H"
#include
typedef unsigned int uint;
uint dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳码表
void DelayMs(uint ms)
{
	uint i;
	while(ms--)
	  for(i=113;i>0;i--);
}

void main()
{	  
	uint i,temp,t=0;
    uint a[3];
	while(1)
	{
		a[0]=t/100;//显示百位
		a[1]=(t%100)/10;//显示十位
		a[2]=t%10;//显示个位
		temp=0x80;//控制选通
		for(i=0;i<3;i++)
		{
			P3=_crol_(temp,1);//选通LE
			P2=dispcode[a[i]];//显示
			DelayMs(5);//延时函数   
//根据仿真结果,你可以调节这个时间,会得到一些有趣的结果。家人们可以自行仿真调试。
			temp=_crol_(temp,1);		
		}
		t++;
		if(t>999)//显示到999就重新开始计数
		  t=0;
	}
}

原理图
数码管的静态显示和动态显示案例介绍_第2张图片
初级加1版

/**
 * @brief     :显示76543210
 * @param     :无
 * @retval    :无
 * @author    :嘤嘤嘤
 * @date      :2022-06-22 
 * */
#include"reg51.h"
#include
typedef  unsigned int uint;

void DelayMs(uint ms)
{
	uint i;
	while(ms--)
	  for(i=0;i<113;i++);	
}

void main()
{
  uint array[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};//控制显示的数字
  uint temp=0xfe,i;
  while(1)
  {
   	  P0=temp;  //位码    控制要显示的数字在数码管那个位置显示
  	  for(i=8;array[i]!=0;i--)
  	  {
 	  	P2=array[i];//段码   控制显示的数字
		DelayMs(5);//可以延长这里的时间,那么就会流动显示。
 	  	temp=_crol_(temp,1);
		P0=temp;
	  }	
	 temp=0xfe;
  }	 	
}

原理图
数码管的静态显示和动态显示案例介绍_第3张图片


总结

实验时候,一定要注意观察数码管是共阳还是共阴。只有选对,才会得到正确的结果。并且写代码和画原理图一定要及时保存。不然就会和我一样,重新再来。最后,我为家人们提供了我自己总结的小资料,希望可以减少家人们的学习困难。家人要是感觉资料食用口感还行,可以帮我点个赞。有什么不对的地方,欢迎大家留言指正。

参考资料

CC:代表共阴 位码0点亮 段码1点亮
CA:代表共阳 位码1点亮 段码0点亮

共阴数码管
1.共阴不带小数点0-F段码为:{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

2.共阴带小数点0-F段码为:{0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};

共阳数码管
1.共阳不带小数点0-F段码为:{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

2.共阳带小数点0-F段码为:{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};

你可能感兴趣的:(单片机,c语言,嵌入式硬件,51单片机,mcu)