这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » STC51单片机实例之05数码管的各种显示方式(上)

共3条 1/1 1 跳转至

STC51单片机实例之05数码管的各种显示方式(上)

高工
2014-03-06 23:38:17     打赏
/*************************一位共阴数码管静态显示************************************
* 文件名  :  数码管显示.c
* 描述    :  该程序为数码管静态显示程序。
			 程序实现了最右边数码管的显示一个5,大家可以在程序中修改相应的值而在数码管上显示相应的数字。		 

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

//数码管的段码编码
uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//下一行的数组可以显示数值外,还可以显示数码管的点
uchar table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};


/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
	uchar i = 0;
	P2 = 7;						 //通过74HC138来控制数码管的位选,P2=0或1,2,3,4,5,6,7点亮相应的数码管
	P0 = table[5];					 //显示5,大家可以修改里面的数据。
	while(1)
	{		                
	}
}

 

/**************************一位数码管静态显示(带小数点)*************************************
* 文件名  :  数码管显示.c
* 描述    :  该程序为数码管静态显示程序。
			 程序实现了最右边数码管的显示一个5,大家可以在程序中修改相应的值而在数码管上显示相应的数字。		 

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

//数码管的段码编码
uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//下一行的数组可以显示数值外,还可以显示数码管的点
uchar table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};


/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
	uchar i = 0;
	P2 = 7;						 	 //数码管的最后一位显示
	P0 = table_d[5];					 //显示5,大家可以修改里面的数据。
	while(1)
	{		                
	}
}

 

/********************************************************************
* 描述    :  用单个数码管来模拟流水灯。

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

//数码管的段码编码
uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//下一行的数组可以显示数值外,还可以显示数码管的点
uchar table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
	uint i,j;
	for(i=0; i<del; i++)
	for(j=0; j<1827; j++)    
	;
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
	uchar i = 0;
	P2 = 7;						 
	while(1)
	{
		P0 = 0xfe;
		for(i=0;i<8;i++)
		{
			Delay(20);
			P0 = P0 << 1;
			P0 = P0 | 0x01;	  
		}              
	}
}

 

/********************************************************************
* 文件名  : 动态显示.c
* 描述    :  8位数码管低两位交替显示   “1,2”
			 这里是做一个动态的演示实验。
			 最开始,两个数码管闪烁间隔时间为150豪秒,每闪烁一次,
			 间隔时间减少2毫秒,当间隔时间小到一定程度的时候,
			 因为人的视觉暂留现象,就不会发现数码管在闪烁了。

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
	uint x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar i=100;			 //最大闪烁值为0.15秒
	while(1)
	{
		P0 = 0;				 //这里让数码管每段不显示 ,这样可以取掉余晖。
		P2 = 6;		 		 //点亮第二位数码管(从右往左数)
		P0 = table[1];		 // i 值的 个位数		
		Delay(i); 
		P0 = 0;
		P2 = 7;		 		 //点亮第一位数码管
		P0 = table[2];		 // i 值的 个位数	
		Delay(i);
		if(i!=2)			 //假如i没有减小到2,执行括号里的语句
		{
			i=i-2;			 //数码管每闪烁一次,i的值减2
		}
	}
}

 

/********************************************************************
* 文件名  : 动态显示.c
* 描述    :  8位数码管低两位分别显示   1,2

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
	uchar x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	while(1)
	{
		P0 = 0;		 		 //消隐
		P2 = 6;		 		 //点亮第二位数码管(从右往左数)
		P0 = table[1];		 // i 值的 个位数
		Delay(3);
		P0 = 0;		 		 //消隐
		P2 = 7;		 		 //点亮第一位数码管
		P0 = table[2];		 // i 值的 个位数
		Delay(3);
	}
}

 

/********************************************************************
* 文件名  : 动态显示.c
* 描述    :  八位数码管依次显示0,1,2,3,4,5,6,7
             这里是做一个动态的演示实验。
			 最开始,两个数码管闪烁间隔时间为50豪秒,每闪烁一次,
			 间隔时间减少1毫秒,当间隔时间小到一定程度的时候,
			 因为人的视觉暂留现象,就不会发现数码管在闪烁了。

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
	uint x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar i,j=50;
	while(1)
	{
		for(i=0;i<8;i++)
		{
			//每位数码管依次闪烁
			P0 = 0;				 //消隐
			P2 = i;		 //选择哪一位数码管点亮
		    P0 = table[i];		 //赋值段码给P0口
			Delay(j);			 //延时
		}
		if(j>=3)				 //当大于3毫秒的时,执行括号中的语句
		{
			j-=1;				 //延时时间自减1毫秒
		}
	}
}

 

 

 

/********************************************************************
* 文件名  : 动态显示.c
* 描述    :  八位数码管依次显示0,1,2,3,4,5,6,7

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
	uchar x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar i;
	while(1)
	{
		for(i=0;i<8;i++)
		{
			P0 = 0;		
			P2 = i;				 //选择哪一位数码管点亮
			P0 = table[i];		 //赋值段码给P0口
			Delay(2);			 //延时0.02秒
		}
	}
}

 

/********************************************************************
* 文件名  : 数码管滚动显示.c
* 描述    :  八个数码管显示0--7,每个0.5秒钟,数据从左往右移动一位

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
	uint x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar i;
	while(1)
	{
			for(i=0;i<8;i++)
			{
				P0 = table[5];	    			//数码管段值
				P2 = i;		            		//点亮某一位数码管
				Delay(200);
			}
	}
}

 

/********************************************************************
* 文件名  : 数码管滚动显示.c
* 描述    :  八个数码管显示0--7,每个0.64秒钟,数据从左往右移动一位

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint LED_temp = 0;
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
	uchar x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar i,j;
	while(1)
	{											   //j自加一次,在内层循环已经走了16毫秒
		for(j=0;j<40;j++)
		{
			for(i=0;i<8;i++)
			{
				P0 = 0;	   							//消隐
				P2 = i;		                		//点亮某一位数码管
				P0 = table[(i - LED_temp) % 8];	    //数码管段值
				Delay(2);							//延时0.02秒
			}
		}
		LED_temp -=1;							    //LED_temp这个变量自减1
	}
}

 

/********************************************************************
* 文件名  : 数码管滚动显示.c
* 描述    :  八个数码管显示0--7,每个0.64秒钟,数据从左往右移动一位

***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint LED_temp = 0;
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
	uchar x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Main()
* 功能 : 数码管的显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
	uchar i,j;
	while(1)
	{											   
		for(j=0;j<40;j++) 							//j自加一次,在内层循环已经走了16毫秒
		{
			for(i=0;i<8;i++)
			{
				P0 = 0;								//消隐
				P2 = i;		                		//点亮某一位数码管
				P0 = table[(i + LED_temp) % 8];	    //数码管段值
				Delay(2);							//延时0.02秒
			}
		}
		LED_temp +=1;								//LED_temp 自加1
	}
}

 


菜鸟
2017-10-24 08:08:58     打赏
2楼

感谢楼主、幸苦了。


菜鸟
2017-11-11 09:01:55     打赏
3楼

相看01--04的例程


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]