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

共6条 1/1 1 跳转至

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

高工
2014-03-06 23:42:18     打赏
/********************************************************************
* 文件名  :  数码管显示.c
* 描述    :  该程序为单位数码管静态显示程序。
			 程序实现了单个数码管的显示。每隔0.5秒依次显示:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f.			 

***********************************************************************/
#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};

/********************************************************************
* 名称 : 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 = table[i % 16];	         //在这里取 i 的个位数,不带点显示
		i++;
		Delay(50); 			         //延时0.5秒后显示下一个数		                
	}
}

 

/********************************************************************
* 文件名  :  数码管显示.c
* 描述    :  该程序为数码管静态显示程序。
			 两位数码管进行自加显示			 

***********************************************************************/
#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};

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
	uchar x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
	uint i = 0,j;
	while(1)
	{
		for(j=0;j<100;j++)
		{
			P0 = 0;							 //消隐
			P2 = 6;						 	 //第6位数码管显示
			P0 = table[(i / 10)%10];	     //在这里取 i 的个位数
			Delay_1ms(3);			         //延时3毫秒后显示下一个数
			P0 = 0;	        	 			 //消隐
			P2 = 7;						 	 //第7位数码管显示
			P0 = table[i % 10];	        	 //在这里取 i 的个位数
			Delay_1ms(3);			         //延时3毫秒后显示下一个数	
		}
		i++;	                
	}
}

 

/********************************************************************
* 文件名  :  数码管显示.c
* 描述    :  该程序为数码管静态显示程序。
			 三位数码管进行自加显示。0--999			 
* 杜邦线接法:用8针排线把P0口和J12的1-8连接(P0.0接J12的1端)。
			   用单排针P2.0接J13的8端,P2.1接J13的7端。P2.2接J13的6端。
***********************************************************************/
#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};

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
	uchar x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
	uint i = 0,j;
	while(1)
	{
		for(j=0;j<10;j++)
		{
			P0 = 0;                          //消隐
			P2 = 5;						 	 //第6位数码管显示
			P0 = table[(i / 100)%10];	     //在这里取 i 的百位数
			Delay_1ms(3);			         //延时0.5秒后显示下一个数
			P0 = 0;	      					 //消隐
			P2 = 6;						 	 //第7位数码管显示
			P0 = table[(i / 10)%10];	     //在这里取 i 的十位数
			Delay_1ms(3);			         //延时0.5秒后显示下一个数
			P0 = 0;	       	   				 //消隐
			P2 = 7;						 	 //第8位数码管显示
			P0 = table[i % 10];	       	     //在这里取 i 的个位数
			Delay_1ms(3);			         //延时0.5秒后显示下一个数	
		}
		i++;		                
	}
}

 

/********************************************************************
* 文件名  : 数码管字符显示.c
* 描述    :  这个代码可以实现数码管的字符显示。
			 这个是数码管的一个扩展实验,可以让数码管显示一些简单的字符。
			 这里实验中,我们在数码管的右边5位,现实了“HELLO

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

//uchar code table[8] = {0x00,0x00,0x00,0x00,0x73,0x77,0x6d,0x6d};	 //显示PASS编码
uchar code table[8] = {0x00,0x00,0x00,0x76,0x79,0x38,0x38,0x3f};	 //显示HELL0编码
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)
{
	uchar i;
	while(1)
	{
		for(i=0;i<8;i++)
		{
		    P0 = 0;								//消隐
			P2 = i;		            			//点亮某一位数码管
			P0 = table[i];	    				//数码管段值
			Delay(2);
		}
	}
}

 

/********************************************************************
* 文件名  : 动态显示.c
* 描述    :  在数码管上的每位每个0.3秒,显示7,6,5,4,3,2,1,0.
             如果按下S19不放(独立按键左边的那个),这时,数码管段选被锁存,
			 这个时候,虽然代码在改变段选的值,但是,我们看到数码管上的值是不变的。

***********************************************************************/
#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};

sbit KEY1 = P3^2;
sbit LOCKDuan = P3^7;
/********************************************************************
* 名称 : 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++)
		{
			//每位数码管依次闪烁			
			P2 = i;		 //选择哪一位数码管点亮
			P0 = table[i];		 //赋值段码给P0口
			Delay(300);			 //延时0.3秒
			if(KEY1 == 0)		 //按下S19,这时数码管段选锁存
			{
				LOCKDuan = 0;	  //给74HC573段选芯片锁存端口赋值低电平
			}
			else
			{
				LOCKDuan = 1;
			}
		}
	}
}

 

/********************************************************************
* 文件名  :  数码管显示.c
* 描述    :  在最右端的三位数码管显示倒计时。
             到计时到0时,三个数码管一起闪烁。			 
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar i=200;
//数码管的段码编码
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_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
	uint x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}
/********************************************************************
* 名称 : DisLED(void)
* 功能 : 三位数码管显示,一共消耗了9毫秒
* 输入 : 无
* 输出 : 无
***********************************************************************/
void DisLED(void)
{
	P0 = 0;                          //消隐
	P2 = 5;						 //第6位数码管显示
	P0 = table[(i / 100)%10];	     //在这里取 i 的百位数
	Delay(3);			         	 //延时0.5秒后显示下一个数
	P0 = 0;	      					 //消隐
	P2 = 6;						 //第7位数码管显示
	P0 = table_d[(i / 10)%10];	     //在这里取 i 的十位数
	Delay(3);			             //延时0.5秒后显示下一个数
	P0 = 0;	       	   				 //消隐
	P2 = 7;						 //第8位数码管显示
	P0 = table[i % 10];	       	     //在这里取 i 的个位数
	Delay(4);			             //延时0.5秒后显示下一个数		
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
	uchar j;
	while(1)
	{
		if(i != 0)					//i不等于0,那么 进行数码管的显示,10* 10=100毫秒
		{
			for(j=0;j<10;j++)
			{
				DisLED();		   	//调用数码管显示代码
			}
			i--;
		}
		else
		{
			for(j=0;j<8;j++)
			{
				DisLED();			 //数码管显示
			}
			P0 = 0x00;				 //数码管不显示
			Delay(200);	
		}             
	}
}

 


院士
2014-03-07 20:10:53     打赏
2楼
看着51单片机的程序还是挺可爱的

高工
2014-03-07 23:52:02     打赏
3楼
其实需要画个图,但是实在不想画

院士
2014-03-08 07:49:23     打赏
4楼
我觉得这就够了 有什么不懂的在问呗

高工
2014-03-08 08:11:17     打赏
5楼
鼓励贴程序~

专家
2016-05-29 11:23:12     打赏
6楼
很好。支持。

共6条 1/1 1 跳转至

回复

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