2021/11/19数码管显示问题

1.静态单个数码管依次显示数字

**

对于单个的数码管而言,示意图和结构如下图所示要显示某种数码只需要对应码段亮即可**

在这里插入图片描述
数码管又分为共阴和共阳极
dp是小数点要让其亮为1,亮为0
共阴极:要让码段亮用1
共阳极:要让码段亮用0
例如显示3这个数 dp g f e d c b a
共阴:0 1 0 0 1 1 1 1 ->0x4f
共阳:0 0 1 1 0 0 0 0 ->0x70f
共阳极的可以参考一下函数帮助编程

//共阳极代码
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};


//共阴极代码
unsigned char leddata[]={ 
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
 };

在这里插入图片描述

#include<reg52.h>
//延时函数固定套路
void DelayXms(unsigned int xms)
{
    unsigned int i,j;
    for(i=xms;i>0;i--)
       for(j=124;j>0;j--);
}
//数码管段表(可以根据LED编码软件自动得到)
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};
//主函数
void main()
{
     unsigned char i;
     while(1)
   	 {
      	for(i=0;i<23;i++){
 		  P2=leddata[i];//1111 1001
 		  DelayXms(500);
 	   }
	 }
}






PS:这里我们把延时函数提出来当作固定版块来用(下次直接放进代码里)

void DelayXms(unsigned int xms)
{
    unsigned int i,j;
    for(i=xms;i>0;i--)
       for(j=124;j>0;j--);
}

`
在这里插入图片描述

2.一个多数码管静态显示同时显示相同数字,且数字会不断变化

1111-2222-3333…

多数码管结构图如下,每个数码管对应端口相互链接,对外显示8个端口称为段码选择口,另外每个数码管还有一个位选择口,一共四个,用来控制对应数码管是否选中。
如何控制数码管的选中?
1.硬件选择:以共阳极位例子,要选择某一个数码管把对应的位选结构接到高电平上,其他的接在低电平上。
2.软件实现:为数码管位选口编码,根据编码值来控制数码管的选中。

在这里插入图片描述

#include<reg52.h>
void DelayXms(unsigned int xms)
{
    unsigned int i,j;
    for(i=xms;i>0;i--)
       for(j=124;j>0;j--);
}
//数码管段表(可以根据LED编码软件自动得到)
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};
//主函数
void main()
{
     unsigned char i;
     while(1)
   	 {
      	for(i=0;i<23;i++){
      	       //将上面的P2口改到P0口
 		       P0=leddata[i];//1111 1001
 		       DelayXms(500);
 	   }
	 }
}

在这里插入图片描述

3…一个多数码管静态同时显示“1234”数字(每个数码管显示不同数字且同时出现)

1234

#include<reg52.h>
void DelayXms(unsigned int xms)
{
    unsigned int i,j;
    for(i=xms;i>0;i--)
       for(j=124;j>0;j--);
}
//数码管段表(可以根据LED编码软件自动得到)
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};
void main()
{

	while(1)
	{
		P2=0x01;//0000 0001
		P0=leddata[1];
		DelayXms(1);//通过控制延时时间,达到同时显示的功能,利用LED的余晖效应和人眼的视觉暂留
		
		P2=0x02;//0000 0010
		P0=leddata[2];
		DelayXms(1);//要达到同时显示时间控制在1-10ms
		
		P2=0x04;//0000 0100
		P0=leddata[3];
		DelayXms(1);
		
		P2=0x08;//0000 1000
		P0=leddata[4];
		DelayXms(1);
		
	}
}

在这里插入图片描述连线时注意数码管位选口不再接地或者电源,而是与I/O接口P2对应相连(可以打标签,也可以直接连过去)

4…一个多数码管依次显示“1234”数字(每个数码管显示不同数字且轮流交替出现)

**1____->2__->3____->____4
这里只需要把3里面的延时增大就可以了

while(1)
	{
		P2=0x01;//0000 0001
		P0=leddata[1];
		DelayXms(1);//通过控制延时时间,达到同时显示的功能,利用LED的余晖效应和人眼的视觉暂留
		
		P2=0x02;//0000 0010
		P0=leddata[2];
		DelayXms(1);
		
		P2=0x04;//0000 0100
		P0=leddata[3];
		DelayXms(1);
		
		P2=0x08;//0000 1000
		P0=leddata[4];
		DelayXms(1);
		
	}
while(1)
	{
		P2=0x01;//0000 0001
		P0=leddata[1];
		DelayXms(500);//通过控制延时时间,达到依次显示的状态
		
		P2=0x02;//0000 0010
		P0=leddata[2];
		DelayXms(500);
		
		P2=0x04;//0000 0100
		P0=leddata[3];
		DelayXms(500);
		
		P2=0x08;//0000 1000
		P0=leddata[4];
		DelayXms(500);
	}
#include<reg52.h>
void DelayXms(unsigned int xms)
{
    unsigned int i,j;
    for(i=xms;i>0;i--)
       for(j=124;j>0;j--);
}
//数码管段表(可以根据LED编码软件自动得到)
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};
void main()
{

	while(1)
	{
		P2=0x01;//0000 0001
		P0=leddata[1];
		DelayXms(500);//通过控制延时时间,达到依次显示的状态
		
		P2=0x02;//0000 0010
		P0=leddata[2];
		DelayXms(500);
		
		P2=0x04;//0000 0100
		P0=leddata[3];
		DelayXms(500);
		
		P2=0x08;//0000 1000
		P0=leddata[4];
		DelayXms(500);
	}
}

**

小结一下:

**
在这里插入图片描述

进阶一:利用数组对4里面的代码进行改进,实现数码管的动态显示。

** 上面的程序有一个问题,每次如果我们想显示不同的数字,leddata[]数组里的值就需要手动去修改多次,其实时很不方便的,所以我们不妨再引入一个数组叫做数据缓冲区数组,每次需要显示不同数字,就通过改数据缓冲区里数组里的元素值,进而影响leddata[]数组里的元素值,最终达到显示不同数字的目的。这里要注意数据缓冲区数组里面元素值表示你想显示的值以共阳极为例比如:LEDBUF【】={1,2,3,4},就表示第一个数码管你想显示1,第二个数码管你想显示2,第三个数码管你想显示3,第四个数码管你想显示4,leddata【LEDBUF【0】】=leddata【1】=0xF9=数码管显示1.同理可得其他情况,这个技巧还是比较巧妙。**

#include<reg52.h>
void DelayXms(unsigned int xms)
{
    unsigned int i,j;
    for(i=xms;i>0;i--)
       for(j=124;j>0;j--);
}
//数码管段表(可以根据LED编码软件自动得到)
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};
unsigned char LEDBUF[]={1,2,3,4};
void main()
{
	while(1)
	{
		P2=0x01;//0000 0001
		P0=leddata[LEDBUF[1]];
		DelayXms(1);//通过控制延时时间,达到同时显示的功能,利用LED的余晖效应和人眼的视觉暂留
		
		P2=0x02;//0000 0010
		P0=leddata[LEDBUF[3]];
		DelayXms(1);
		
		P2=0x04;//0000 0100
		P0=leddata[LEDBUF[0]];
		DelayXms(1);
		
		P2=0x08;//0000 1000
		P0=leddata[LEDBUF[2]];
		DelayXms(1);
	}
}

在这里插入图片描述

**小结一下:对于一个多数码管的动态显示控制主要有三个步骤

1.段码选择:根据你想显示的数据,确定相应的abcdefg以及dp端口的1和0的情况,写出编码,将所连接的I/O端口进行字节选择的方式整体赋上编码值(注意顺序,从下往上=从低字节到高字节)
2.位信号选择:这里其实就是对数码管的选择和控制,那些要用,那些不用。
3.延时函数:1-10ms的延时,实现动态显示。
**
4.消隐(这里不详细展开)**

不妨对程序进行进一步简化

#include<reg52.h>
#define GPIO_DIG P0  //断码IO口
#define GPIO_PLACE P2  //位选IO口
#define N  4           //数码管个数
unsigned char LEDBUF[]={1,2,3,4};//数据显示缓冲区
unsigned char code PLACE_CODE[]={0x01,0x02,0x04,0x8};//位信号
//延时函数
void DelayXms(unsigned int xms)
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=124;j>0;j--);
}
//段码表
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};
//展示函数,一次性实现显示功能
void Display()
{
	//static unsigned char i=0;
	unsigned char i;
	//1,送段码
	GPIO_DIG=leddata[LEDBUF[i]];//从LEDBUF【】里的元素值得以显示
	//2.送位选
	GPIO_PLACE=PLACE_CODE[i];//每次选择不同的数码管显示
	//3.延时1ms<10ms
	DelayXms(1);//延时很短,可以实现动态显示(即同步显示的视觉效果)
	//4.消隐
	GPIO_DIG=0xff;//共阳极就是0xff,共阴极时0x00;
	i++;//计数循环控制
	//i的界限说明
	if(N==i)
	{
		i=0;
	}
}
//主函数
void main()
{
	while(1)
	{
		Display();
	}
}


在这里插入图片描述
PS:这里有一个问题,当LEDBUF【】数组里设置的数字相同可以同时显示,但是只要时不同数据就不能显示全数字,很奇怪,该问题始终没有得到解决。比如LEDBUF【】={1,1,1,2}时就会出现以下问题
在这里插入图片描述
**

进阶二:数码管的简单应用: 应用1:开机显示横杠,一段时间后显示某一个四位数(这个四位数通过每个管子赋值得到)

**

include<reg52.h>
#define GPIO_DIG P0  //断码IO口
#define GPIO_PLACE P2  //位选IO口
#define N  4           //数码管个数
unsigned char LEDBUF[]={22,22,22,22};//数据显示缓冲区
unsigned char code PLACE_CODE[]={0x01,0x02,0x04,0x08};//位信号
//延时函数
void DelayXms(unsigned int xms)
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=124;j>0;j--);
}
//段码表
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};

//以上部分是都会运用到的//

void Display()
{
	//static unsigned char i=0;
	unsigned char i;
	//1,送段码
	GPIO_DIG=leddata[LEDBUF[i]];
	//2.送位选
	GPIO_PLACE=PLACE_CODE[i];
	//3.延时1ms<10ms
	DelayXms(1);
	//4.消隐
	GPIO_DIG=0xff;
	i++;
	if(N==i)
	{
		i=0;
	}
}
void main()
{
    unsigned int i;//这里不能是char char的范围位0-255
    for(i=0;i<2500;i++)
	{
		Display();
	}
	while(1)
	{
	   LEDBUF[0]=4;
	   LEDBUF[1]=5;
	   LEDBUF[2]=6;
	   LEDBUF[3]=7;
	   Display();
	}
}

开机时
在这里插入图片描述
一段时间后
在这里插入图片描述
拓展:直接给一个数,不通过给每个管子赋值就能显示(C语言基础的运用)

#include<reg52.h>
#define GPIO_DIG P0  //断码IO口
#define GPIO_PLACE P2  //位选IO口
#define N  4           //数码管个数
unsigned char LEDBUF[]={22,22,22,22};//数据显示缓冲区
unsigned char code PLACE_CODE[]={0x01,0x02,0x04,0x08};//位信号
//延时函数
void DelayXms(unsigned int xms)
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=124;j>0;j--);
}
//段码表
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};

//以上部分是都会运用到的//

void Display()
{
	//static unsigned char i=0;
	unsigned char i;
	//1,送段码
	GPIO_DIG=leddata[LEDBUF[i]];
	//2.送位选
	GPIO_PLACE=PLACE_CODE[i];
	//3.延时1ms<10ms
	DelayXms(1);
	//4.消隐
	GPIO_DIG=0xff;
	i++;
	if(N==i)
	{
		i=0;
	}
}
void main()
{
	unsigned int i;//0-655535
	unsigned int num=1989;//0-1989
	//unsigned int t=0;
	//unsigned int tmp=0;
	for(i=0;i<2500;i++)
	{
		Display();
	}
	while(1)
	{
		LEDBUF[0]=num/1000;
		LEDBUF[1]=num/100%10;
		LEDBUF[2]=num/10%10;
		LEDBUF[3]=num%10;
		
		for(i=0;i<5000;i++){
		   Display();
		}
		num++;
		if(num>1995)
		{
			num=0;
		}
  }
}

拓展:一个数显示一段时间以后,显示另一个数字(参考代买,可能有错)

#include<reg52.h>
#define GPIO_DIG P0  //断码IO口
#define GPIO_PLACE P2  //位选IO口
#define N  4           //数码管个数
unsigned char LEDBUF[]={22,22,22,22};//数据显示缓冲区
unsigned char code PLACE_CODE[]={0x01,0x02,0x04,0x08};//位信号
//延时函数
void DelayXms(unsigned int xms)
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=124;j>0;j--);
}
//段码表
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};

//以上部分是都会运用到的//

void Display()
{
	//static unsigned char i=0;
	unsigned char i;
	//1,送段码
	GPIO_DIG=leddata[LEDBUF[i]];
	//2.送位选
	GPIO_PLACE=PLACE_CODE[i];
	//3.延时1ms<10ms
	DelayXms(1);
	//4.消隐
	GPIO_DIG=0xff;
	i++;
	if(N==i)
	{
		i=0;
	}
}
void main()
{
	unsigned int i;//0-655535
	unsigned int num=1989;//0-1989
	unsigned int t=0;
	unsigned int tmp=1798;
	for(i=0;i<2500;i++)
	{
		Display();
	}
      i=0;
	    while(1)
			{
				switch(i)
				{
					case 0:
						LEDBUF[0]=num/1000;
		        LEDBUF[1]=num/100%10;
	         	LEDBUF[2]=num/10%10;
		        LEDBUF[3]=num%10;
				   	t++;
					  if(t<25)
					  {
						  i=0;
					  }
					  else
					  {
						  tmp+=1;
						  t=0;
						  i=1;
					  }
						break;
					case 1:	
						LEDBUF[0]=tmp/1000;
		        LEDBUF[1]=tmp%1000/100;
	         	LEDBUF[2]=tmp%100/10;
		        LEDBUF[3]=tmp%10;
					  t++;
					  if(t>50)
					  {
						  i=0;
					  }
					  else
					  {
						  tmp+=1;
						  t=0;
						  i=1;
					  }
						break;
					default:break;
					}
				Display();
	    }
}
	

进阶三:Switch -Case语句

1.运用Switch-Case实现多个窗口同时显示一个字符(数字)

#include<reg52.h>
#define GPIO_DIG P0  //断码IO口
#define GPIO_PLACE P2  //位选IO口
#define N  4           //数码管个数
unsigned char LEDBUF[]={22,22,22,22};//数据显示缓冲区
unsigned char code PLACE_CODE[]={0x01,0x02,0x04,0x08};//位信号
//延时函数
void DelayXms(unsigned int xms)
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=124;j>0;j--);
}
//段码表
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};
void Display()
{
	 unsigned char i;
	//unsigned char i;
	//1,送段码
	
	//2.送位选
	
	//3.延时1ms<10ms
	
	//4.消隐
	switch(i)
	{
		case 0:
		  GPIO_DIG=leddata[LEDBUF[0]];
		  GPIO_PLACE=PLACE_CODE[0];
		  DelayXms(1);
		  GPIO_DIG=0xff;
		  i++;
		  break;
			
		case 1:
		  GPIO_DIG=leddata[LEDBUF[1]];
		  GPIO_PLACE=PLACE_CODE[1];
		  DelayXms(1);
		  GPIO_DIG=0xff;
		  i++;
		  break;
			
		case 2:
		  GPIO_DIG=leddata[LEDBUF[2]];
		  GPIO_PLACE=PLACE_CODE[2];
		  DelayXms(1);
		  GPIO_DIG=0xff;
		  i++;
		  break;
			
		case 3:
		  GPIO_DIG=leddata[LEDBUF[3]];
		  GPIO_PLACE=PLACE_CODE[3];
		  DelayXms(1);
		  GPIO_DIG=0xff;
		  i=0;
		  break;	
		default:break;
	}
}
void main()
{
	while(1)
	{
		Display();
	}
}

在这里插入图片描述

2.分屏显示(初步) 效果 0-44->1-55->2-66->3-77

#include<reg52.h>
#define GPIO_DIG P0  //断码IO口
#define GPIO_PLACE P2  //位选IO口
#define N  4           //数码管个数
unsigned char LEDBUF[]={22,22,22,22};//数据显示缓冲区
unsigned char code PLACE_CODE[]={0x01,0x02,0x04,0x08};//位信号
unsigned char wnd;
unsigned char parm1=44;
unsigned char parm2=55;
unsigned char parm3=66;
unsigned char parm4=77;
//延时函数
void DelayXms(unsigned int xms)
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=124;j>0;j--);
}
//段码表
unsigned char leddata[]={ 

						0xC0,  //"0"
						0xF9,  //"1"
						0xA4,  //"2"
						0xB0,  //"3"
						0x99,  //"4"
						0x92,  //"5"
						0x82,  //"6"
						0xF8,  //"7"
						0x80,  //"8"
						0x90,  //"9"
						0x88,  //"A"
						0x83,  //"B"
						0xC6,  //"C"
						0xA1,  //"D"
						0x86,  //"E"
						0x8E,  //"F"
						0x89,  //"H"
						0xC7,  //"L"
						0xC8,  //"n"
						0xC1,  //"u"
						0x8C,  //"P"
						0xA3,  //"o"
						0xBF,  //"-"
						0xFF,  //熄灭
};
void Display()
{
	//static unsigned char i=0;
	unsigned char i;
	//1,送段码
	GPIO_DIG=leddata[LEDBUF[i]];
	//2.送位选
	GPIO_PLACE=PLACE_CODE[i];
	//3.延时1ms<10ms
	DelayXms(1);
	//4.消隐
	GPIO_DIG=0xff;
	i++;
	if(N==i)
	{
		i=0;
	}
}

void main()
{
	unsigned int i;
	for(i=0;i<5000;i++)
	{
		Display();
	}
	while(1)
	{
		switch(wnd)
		{
			case 0:
			  LEDBUF[0]=0;
			  LEDBUF[1]=22;
			  LEDBUF[2]= parm1/10;
			  LEDBUF[3]= parm1%10;
			  for(i=0;i<500;i++)
      	{
		       Display();
	      }
				wnd++;
				break;
			case 1:
			  LEDBUF[0]=1;
			  LEDBUF[1]=22;
			  LEDBUF[2]= parm2/10;
			  LEDBUF[3]= parm2%10;
			  for(i=0;i<500;i++)
      	{
		       Display();
	      }
				wnd++;
				break;
			case 2:
			  LEDBUF[0]=2;
			  LEDBUF[1]=22;
			  LEDBUF[2]= parm3/10;
			  LEDBUF[3]= parm3%10;
			  for(i=0;i<500;i++)
      	{
		       Display();
	      }
				wnd++;
				break;
			case 3:
			  LEDBUF[0]=3;
			  LEDBUF[1]=22;
			  LEDBUF[2]= parm4/10;
			  LEDBUF[3]= parm4%10;
			  for(i=0;i<500;i++)
      	{
		       Display();
	      }
				wnd=0;
			  break;
			default:break;
		}
	}
}

在这里插入图片描述
最后我们抽取出两个模块函数
模块一:延时函数

void DelayXms(unsigned int xms)
{
  unsigned int i,j;
  for(i=xms;i>0;i--)
    for(j=124;j>0;j--);
}

模块二:显示函数

#define GPIO_DIG P0  //断码IO口
#define GPIO_PLACE P2  //位选IO口
#define N  4           //数码管个数
unsigned char LEDBUF[]={22,22,22,22};//数据显示缓冲区
unsigned char code PLACE_CODE[]={0x01,0x02,0x04,0x08};//位信号
void Display()
{
	 unsigned char i;
	//unsigned char i;
	//1,送段码
	
	//2.送位选
	
	//3.延时1ms<10ms
	
	//4.消隐
	switch(i)
	{
		case 0:
		  GPIO_DIG=leddata[LEDBUF[0]];
		  GPIO_PLACE=PLACE_CODE[0];
		  DelayXms(1);
		  GPIO_DIG=0xff;
		  i++;
		  break;
			
		case 1:
		  GPIO_DIG=leddata[LEDBUF[1]];
		  GPIO_PLACE=PLACE_CODE[1];
		  DelayXms(1);
		  GPIO_DIG=0xff;
		  i++;
		  break;
			
		case 2:
		  GPIO_DIG=leddata[LEDBUF[2]];
		  GPIO_PLACE=PLACE_CODE[2];
		  DelayXms(1);
		  GPIO_DIG=0xff;
		  i++;
		  break;
			
		case 3:
		  GPIO_DIG=leddata[LEDBUF[3]];
		  GPIO_PLACE=PLACE_CODE[3];
		  DelayXms(1);
		  GPIO_DIG=0xff;
		  i=0;
		  break;	
		default:break;
	}
}
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值