51单片机004:用定时器以间隔500MS在3位数码管上依次显示0、1、2、3……C、D、E、F,重复。

        题目:用定时器以间隔500MS在3位数码管上依次显示0、1、2、3……C、D、E、F,重复。

思路:

1、要用到定时器,进行定时器初始化,配置相关寄存器,并编写中断服务函数

2、“在3位数码管上依次显示……”,属于数码管的动态显示知识,要用到位选和段选

涉及原理图:

代码:

#include "reg52.h"

//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

static unsigned int i;//定义静态变量i


//共阴极数码管显示0~F的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void time0_init(void)
{
	TMOD|=0X01;               //选择为定时器0模式,工作方式1
	TH0=(65535-50000)/256;    //50ms定时10次
	TL0=(65535-50000)%256;
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器		
}

void smg_display(unsigned char location,num)
{
	P0=0x00;
  switch(location)
	{ 
	  case 8:LSC=0;LSB=0;LSA=0;break;
		case 7:LSC=0;LSB=0;LSA=1;break;
	  case 6:LSC=0;LSB=1;LSA=0;break;
	  case 5:LSC=0;LSB=1;LSA=1;break;
		case 4:LSC=1;LSB=0;LSA=0;break;
		case 3:LSC=1;LSB=0;LSA=1;break;
		case 2:LSC=1;LSB=1;LSA=0;break;
		case 1:LSC=1;LSB=1;LSA=1;break;
	}
	P0=gsmg_code[num];
}

void main()
{	
	time0_init();//定时器0中断配置

	while(1)
	{			
		
	}		
}

void time0() interrupt 1 //定时器0中断函数
{
	static unsigned int location=1,num=0,count;	
	TH0=(65535-50000)/256;    //50ms定时10次
	TL0=(65535-50000)%256;
	count++;
	if(count == 10)
	{
		count = 0;
		smg_display(location,num);
		location++;
		num++;
		if(location>3)
		{
		 location=1;
		}
		if(num>15)
		{
		 num=0;
		}	 

	}
}

其中,smg_display函数是和小蜜蜂老师学的,小蜜蜂老师yyds!location代表要亮的数码管的位置,num代表该数码管要显示的数字,一步到位,不需要每次进行位选和段选,简单快捷。

猜你喜欢

转载自blog.csdn.net/chenhuifei/article/details/134841905