⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eclock.c

📁 基于at89c52单片机及max7219的电子时钟源程序
💻 C
字号:
#include <reg52.h>
#define uchar unsigned char
typedef struct 
{	uchar hour;
	uchar min;
	uchar second;
}time;
time now ={12,30,00};
uchar idata disbuf[10];
uchar code addr[6]={0x06,0x05,0x04,0x03,0x02,0x01};
uchar keyval;
uchar times = 0;
bit adjh = 0;
bit adjm = 0;
sbit Data = P2^5;
sbit Clk = P2^6;
sbit Load = P2^7;
void ini7219(void);
void bytedin(uchar x);
void sdin(uchar a,uchar d);
void adj(void);
void inc(void);
void delay10(void);

void initiate(void)
{	P1 = 0xff;
	P2 = P2 & 0x1f;
	TMOD = 0x11;
	TH0 = (65536 - 25000) / 256;
	TL0 = (65536 - 25000) % 256;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
}

void display(void)
{	uchar i;
	disbuf[0] = now.second % 10;
	disbuf[1] = now.second / 10;
	disbuf[6] = now.min % 10;
	disbuf[7] = now.min / 10;
	disbuf[8] = now.hour % 10;
	disbuf[9] = now.hour / 10;
	if((adjm)&&(now.second % 2))
	{	disbuf[2] = 0xff;
		disbuf[3] = 0xff;
	}
	else 
	{	disbuf[2] = disbuf[6];
		disbuf[3] = disbuf[7];
	}
	if((adjh)&&(now.second % 2))
	{	disbuf[4] = 0xff;
		disbuf[5] = 0xff;
	}
	else
	{	disbuf[4] = disbuf[8];
		disbuf[5] = disbuf[9];
	}
	ini7219();
	for(i = 0;i < 6;i++)
	sdin(addr[i],disbuf[5-i]);
}

void timer0(void) interrupt 1 using 1
{	TH0 = (65536 - 25000) / 256;
	TL0 = (65536 - 25000) % 256;
    times++;
	if(times >= 20)
	{	now.second++;
		times = 0;
		if(now.second >= 60)
		{	now.min++;
			now.second = 0;
			if(now.min >= 60)
			{	now.hour++;
				now.min = 0;
				if(now.hour >= 24)
				now.hour = 0;
			}
		}
	}
}

void keyproc(void)
{	ET0 = 0;
	keyval = (P1 & 0x03);
	switch(keyval)
	{	case 0x02:	adj();	break;
		case 0x01:	inc();	break;
		default:;
	}
	ET0 = 1;
}

void adj(void)
{	if((~adjh) & (~adjm))
	adjh = 1;
	else if(adjh)
	{	adjm = 1;
		adjh = 0;
	}
	else if(adjm)
	{	adjm = 0;
		adjh = 0;
	}
}

void inc(void)
{	if(adjh)
	{	now.hour++;
		if(now.hour >= 24)
		now.hour = 0;
  	}
	if(adjm)
	{	now.min++;
		if(now.min >= 60)
		now.min = 0;
   	}
}

void main()
{	initiate();
	for(;;)
	{	display();
		if(keyval != 0x03)
		{	delay10();
			if(keyval != 0x03)
			keyproc();
	  	}
 	}
}

void delay10(void)
{	TH1 = (65536 - 5000) / 256;
	TL1 = (65536 - 5000) % 256;
	TR1 = 1;
	while(!TF1);
	TR1 = 0;
	TF1 = 0;
}

void bytedin(uchar x)
{	uchar i,a;
	a = x;
	for(i = 0;i < 8;i++)
	{	Data = (bit)(a & 0x80);
		a = a << 1;
		Clk = 0;
		Clk = 1;
  	}
}

void sdin(uchar a,uchar d)
{	bytedin(a);
	bytedin(d);
	Load = 0;
	Load = 1;
}

void ini7219(void)
{	sdin(0x09,0xff);
	sdin(0x0a,0x07);
	sdin(0x0b,0x05);
	sdin(0x0c,0x01);
}















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -