51任务17:定时器控制数码管从00-59,1秒增一

51任务17:定时器控制数码管从00-59,1秒增一

#include "reg52.h"			

//数据类型声明
typedef unsigned int u16;	  
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//数码表
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

u8 DisplayData[8];
u8 s,ms;//秒 毫秒
			
//延时函数 i=1 延时10us							
void delay(u16 i)
{
	while(i--);	
}

//数码管动态扫描函数,循环扫描八个数码管
void DigDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //选位置
		{
			case(0):
				LSA=1;LSB=1;LSC=1; break;
			case(1):
				LSA=0;LSB=1;LSC=1; break;
			case(2):
				LSA=1;LSB=0;LSC=1; break;
			case(3):
				LSA=0;LSB=0;LSC=1; break;
			case(4):
				LSA=1;LSB=1;LSC=0; break;
			case(5):
				LSA=0;LSB=1;LSC=0; break;
			case(6):
				LSA=1;LSB=0;LSC=0; break;
			case(7):
				LSA=0;LSB=0;LSC=0; break;
		}
		P0=DisplayData[i];//发送断码
		delay(100); 
		P0=0x00;//消隐
	}
}

void datapros()
{	
    //第7 6 位显示数字
	DisplayData[0]=smgduan[s/10];  //个位
	DisplayData[1]=smgduan[s%10];  //十位
}

void Timer0Init()
{
	TMOD|=0X01;//定时器0模式 

	TH0=0Xd8;	//定时器赋值10ms
	TL0=0Xf0;	
	ET0=1;//定时器0中断允许被打开
	EA=1;//总中断
	TR0=1;//定时器		
}


void main()
{	
	Timer0Init(); //定时器初始化
	while(1)
    {
	    datapros();
    	DigDisplay();	
	}
}

void Timer0()  interrupt 1
{
		
      TH0=0Xd8;	//10ms
	  TL0=0Xf0;
      ms++;
	  if(ms>=100)  //100*ms=1s
	 {
		ms=0;
		s++;
		if(s>=60)
		{
		   //清0
			s=0;
		}	
	}	
}

猜你喜欢

转载自blog.csdn.net/wang2395/article/details/107470162