📄 main.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 + -