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

📄 main.c

📁 用DS12C887RTC芯片实现高精度数字时钟的1602显示
💻 C
字号:
/*************************************************************************
文件名  :main.c
作	  者:eleclike
修改日期:2008-9-9
版	  本:v1.00
编译软件:KEIL uVision2
处理器:  AT89S52
版权说明:本程序只供学习使用,未经作者许可,不得用于其它任何用途
备    注:
**************************************************************************/

#include "my52.h"
#include "ds12887.h"
#include "mmi.h"

//时钟闹钟调整模式宏定义
#define ADJUST_DISABLE		0x00
#define ADJUST_HOUR			0x01
#define ADJUST_MINUTE		0x02
#define ADJUST_MONTH		0x03
#define ADJUST_DATE			0x04
#define ADJUST_YEAR			0x05
#define ADJUST_DAY			0x06
#define ADJUST_ALARM_HOUR	0x07
#define ADJUST_ALARM_MINUTE	0x08

//全局变量定义
uchar DisplayAlarm = 0;		
uchar AdjustMode = ADJUST_DISABLE;

//函数声明
void DeelDisplay(void);
void DeelPressKey(void);
void DdaInc(uchar* temp);
void DdaDec(uchar* temp);
void DeelKey(uchar* temp);
void DeelAlarm(void);

/*********************************************************
							main
*********************************************************/
void main(void)
{	

	IsInitDs12887();
	AlarmEnable = 0;

	while(1)
	{
		ReadDs12887();				//读DS12887有关时钟的内容
	
		ReadAlarmFlag();			//读闹钟标志

		ReadKey();					//读按键值
		
		if(KeyValue != 0xff)	
		{
			DeelPressKey();			//处理按键
		}

		DeelAlarm();				//处理闹钟

		DeelDisplay();				//处理时钟显示			
	}

}

/*********************************************************
函数名称:DeelAlarm()
函数功能:处理闹钟
入口参数:无
出口参数:无
备    注:
*********************************************************/
void DeelAlarm(void)
{
	if(AlarmEnable == 1)		//处理闹钟
	{
		AlarmLedShine();	
		AlarmBellShine();
	}
	else
	{
		AlarmLedOff();
		AlarmBellOff();
	}
}
/*********************************************************
函数名称:DeelPressKey()
函数功能:处理按键
入口参数:无
出口参数:无
备    注:
*********************************************************/
void DeelPressKey(void)
{
	//调整模式变量处理
	if (KeyValue == KEY_MODE)				
	{
		AdjustMode ++;
		if(AdjustMode >= 9)
		{
			AdjustMode = ADJUST_DISABLE;
		}
	}
	//如果按下显示闹钟键
	if(KeyValue == KEY_DISPLAY_ALARM)
	{
		DisplayAlarm ++;		
		if(DisplayAlarm >= 2)	//按键交替为1或0,使能显示闹钟或其他时间信息
		{
			DisplayAlarm =0;
		}	
	}

	//根据调整模式决定调整的参数
	switch(AdjustMode)					
	{	
		case ADJUST_HOUR:
			DeelKey(&Hour);
			if(Hour >= 0x24)
				Hour = 0;
			TIME_HOUR = Hour;
			break;	
		case ADJUST_MINUTE:	
			DeelKey(&Minute);
			if(Minute >= 0x60)
				Minute = 0;	
			TIME_MINUTE = Minute;	
			break;	
		case ADJUST_MONTH	:
			DeelKey(&Month);
			if(Month >= 0x13)
				Month = 0;	
			TIME_MONTH = Month;				
			break;	
		case ADJUST_DATE:
			DeelKey(&Date);
			if(Date >= 0x32)
				Date = 0;	
			TIME_DATE = Date;		
			break;	
		case ADJUST_YEAR:	
			DeelKey(&Year);
			if(Year >= 0x100)
				Year = 0;
			TIME_YEAR = Year;			
			break;	
		case ADJUST_DAY:
			DeelKey(&Day);
			if(Day >= 0x8)
				Day = 0;
			TIME_DAY = Day;			
			break;	
		case ADJUST_ALARM_HOUR:
			DeelKey(&AlmHour);
			if(AlmHour >= 0x24)
				AlmHour = 0;
			ALARM_HOUR = AlmHour;
			break;	
		case ADJUST_ALARM_MINUTE: 
			DeelKey(&AlmMinute);
			if(AlmMinute >= 0x60)
				AlmMinute = 0;			
			ALARM_MINUTE = AlmMinute;
			break;
		default:
			break;
	}

	//显示闹钟的控制变量处理
	if(AdjustMode != ADJUST_DISABLE)		
		DisplayAlarm=0;	

}
/*********************************************************
函数名称:DeelKey()
函数功能:处理调整按键的加一或减一
入口参数:无
出口参数:无
备    注:
*********************************************************/
void DeelKey(uchar *temp)
{
	switch(KeyValue)
	{
		case KEY_INC:			//如果为"增加"按键
			DdaInc(temp);
			break;
		case KEY_DEC:			//如果为"减少"按键
			DdaDec(temp);
			break;
		/*case KEY_DISPLAY_ALARM:	//如果为"显示闹钟"按键
			DisplayAlarm = 1;
			break;	*/
		default: 
			break;
	}
}
/*********************************************************
函数名称:DeelDisplay()
函数功能:根据调整的模式处理显示数据
入口参数:无
出口参数:无
备    注:
*********************************************************/
void DeelDisplay(void)
{
	//显示闹钟的数值
	if(DisplayAlarm==1)
	{
		DynamicDisplay(AlmHour,AlmMinute);	
		AlarmLedShine();
		SecondLedOff();
	}
	//根据调整模式显示
	else
	{
		switch(AdjustMode)
		{
			case ADJUST_HOUR:				//显示时钟的时,分灭零处理,一下过程类似
				DynamicDisplay(Hour,0xff);
				SecondLedShine();
				break;	
			case ADJUST_MINUTE	:
				DynamicDisplay(0xff,Minute);
				SecondLedShine();
				break;	
			case ADJUST_MONTH: 	
				DynamicDisplay(Month,0xff);		
				break;	
			case ADJUST_DATE:
				DynamicDisplay(0xff,Date);		
				break;	
			case ADJUST_YEAR:	
				DynamicDisplay(Year,0xff);		
				break;	
			case ADJUST_DAY:
				DynamicDisplay(0xff,Day|0xf0);		
				break;	
			case ADJUST_ALARM_HOUR	:			//显示闹钟的时
				DynamicDisplay(AlmHour,0xff);
				AlarmLedShine();
				break;	
			case ADJUST_ALARM_MINUTE:
				DynamicDisplay(0xff,AlmMinute);
				AlarmLedShine();			
				break;
			case ADJUST_DISABLE:
				if( (Second<0x10) && (Second>=0) )		//显示时钟的时分
				{
					DynamicDisplay(Hour,Minute);
					SecondLedShine();
				}
				if( (Second<0x20) && (Second>=0x10) )	//显示时钟的月日
				{
					DynamicDisplay(Month,Date);//月日
				}
				if( (Second<0x40) && (Second>=0x20) )	//显示时分
				{
					DynamicDisplay(Hour,Minute);
					SecondLedShine();
				}
				if( (Second<0x50) && (Second>=0x40) )	//显示时钟的年星期
				{		
					DynamicDisplay(Year,Day|0xf0);	//星期的十位灭零
				}
				if( (Second<=0x59) && (Second>=0x50) )	//显示时分
				{
					DynamicDisplay(Hour,Minute);
					SecondLedShine();
				}			
				break;
			default:
				break;
		}
	}

}
/*********************************************************
函数名称:DdaInc()
函数功能:十六进制数据加1调整成BCD码
入口参数:需要调整的十六进制数值
出口参数:无
备    注:在DS12887中各时间参数采用BCD码,所以需要调整
*********************************************************/
void DdaInc(uchar* temp)
{
	uchar temp2;
	temp2 = *temp;
	(*temp) ++;
	if( (*temp%16) >= 10)
	{
		*temp = temp2 + 0x10 - (temp2 %0x10);
	}
}
/*********************************************************
函数名称:DdaDec()
函数功能:十六进制数据减1调整成BCD码
入口参数:需要调整的十六进制数值
出口参数:无
备    注:在DS12887中各时间参数采用BCD码,所以需要调整
*********************************************************/
void DdaDec(uchar* temp)
{
	uchar temp2;
	temp2 = *temp;
	(*temp) --;
	if( (*temp%16) >= 10)
	{
		*temp = temp2 - 0x10 +9 ;
	}
}
/*********************************************************
函数名称:()
函数功能:
入口参数:
出口参数:无
备    注:
*********************************************************/

⌨️ 快捷键说明

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