📄 clock.c
字号:
/**************************************************************************
File Name: clock.c
Author: liao xu ming
Created: 2007/3/23
Modified: NO
Revision: 1.0
***************************************************************************/
#include"clock.H"
#include"keyboard.h"
#include"lcd1602.h"
#include"ds1302.h"
#include"main.h"
#define ON 1
#define OFF 0
void BurstWrite1302_New(void); //DS1302 时钟芯片 多字节数据写入函数声明
void Display_Adjust_ALARM_Time(void); //显示 调整打玲时间的函数声明
void Display_Time(void); //显示函数 声明
bit Bell_Flag; //打玲标志
bit Bell_Enable; //打玲使能
bit LCD_LIGHT_FLAG; //LCD 背光灯亮标志
unsigned char Bell_f; //蜂呜器响玲频
bit BurstWrite1302_Flag; //多字节数据写入 DS1302 标志
bit Bell_State_switch_flag; //打玲状态切换标志
bit Call_Display_Adjust_ALARM_Time_Bit; //调用显示调整打玲时间标志
unsigned char ClockRtc[8]={0,0,0,0,0,0,0,0}; //时钟数据
unsigned char DateString[9]={0,0,0,0,0,0,0,0,0}; //日期数据
unsigned char TimeString[9]={0,0,0,0,0,0,0,0,0}; //时间数据
unsigned char count_50ms; //50ms 中断计数
//打玲数据
static unsigned char Alarm_Ram[9]={0+'0',0+'0','-',0+'0',0+'0','-',0+'0',0+'0','\0'};
unsigned char code string_input_the_alarm_time[]="Input alarm time"; //字符串显示 输入打玲时间的英文
extern unsigned char code string_clear_line2[]; //字符串 清空
/***********************
宏定义
***********************/
#define HOUR_H 0
#define HOUR_L 1
#define MIN_H 3
#define MIN_L 4
#define SECOND_H 6
#define SECOND_L 7
#define YEAR_H 0
#define YEAR_L 1
#define MONTH_H 3
#define MONTH_L 4
#define DATA_H 6
#define DATA_L 7
#define NORMAL 0
#define SECOND_ADJ_L 1
#define SECOND_ADJ_H 2
#define MINUTE_ADJ_L 3
#define MINUTE_ADJ_H 4
#define HOUR_ADJ_L 5
#define HOUR_ADJ_H 6
#define DATA_ADJ_L 7
#define DATA_ADJ_H 8
#define MONTH_ADJ_L 9
#define MONTH_ADJ_H 10
#define YEAR_ADJ_L 11
#define YEAR_ADJ_H 12
#define ALARM_ADJ_SECOND_L 13
#define ALARM_ADJ_SECOND_H 14
#define ALARM_ADJ_MIN_L 15
#define ALARM_ADJ_MIN_H 16
#define ALARM_ADJ_HOUR_L 17
#define ALARM_ADJ_HOUR_H 18
#define Bell_Enable_ON_OFF 19
#define STATUS_MIN 0 //最小状态数
#define STATUS_MAX 19 //最大状态数
extern bit State_Switch_Flag; //状态切换标志
unsigned char State_ADJ; //状态
void Clock(unsigned char Key_temp) //时钟处理函数
{
if(State_Switch_Flag==1) //状态切换
{
EA=1; //开中断
State_Switch_Flag=0;
LCD_send_command(LCD_CLEAR_SCREEN); //清屏
GotoXY(0,0);
Print("Date: ");
GotoXY(0,1);
Print("Time: ");
}
if(Key_temp==ADD) //如果'+'键按下
{
if(State_ADJ<STATUS_MAX)State_ADJ++; //如果状态值小于对大状态,则状态值加1
else State_ADJ=STATUS_MIN; //否则,状态值置最小状态值
}
if(Key_temp==DEC) //如果'-'键按下
{
if(State_ADJ>STATUS_MIN)State_ADJ--; //如果状态值小于对大状态,则状态值加1
else State_ADJ=STATUS_MIN; //否则,状态值置最小状态值
if(State_ADJ==YEAR_ADJ_H) //如果状态是 YEAR_ADJ_H
{ LCD_send_command(LCD_CLEAR_SCREEN); //清屏
GotoXY(0,0);
Print("Date: ");
GotoXY(0,1);
Print("Time: ");
GotoXY(6,0);
Print(DateString);
GotoXY(6,1);
Print(TimeString);
}
}
if(State_ADJ!=NORMAL) //如果状态不等于常态
{
if(Key_temp==EQUAL) //如果'='键按下
{
BurstWrite1302_New(); //多字节数据写入 DS1302
BurstWrite1302_Flag=0; //
State_ADJ=NORMAL; //状态初始化
LCD_send_command(LCD_CLEAR_SCREEN);//清屏
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);//不显示光标
GotoXY(0,0);
Print("Date: ");
GotoXY(0,1);
Print("Time: ");
GotoXY(6,0);
Print(DateString);
GotoXY(6,1);
Print(TimeString);
EA=1;
}
}
switch(State_ADJ) //状态选择
{
case NORMAL: //常态
//displayTime
{// Bell=0;
if(BurstWrite1302_Flag==1) //多字节写入DS1302标志为1
{
BurstWrite1302_New(); //多字节数据写入DS1302 函数
BurstWrite1302_Flag=0; //多字节数据写入DS1302标志为0
LCD_send_command(LCD_CLEAR_SCREEN); //清屏
GotoXY(0,0);
Print("Date: ");
GotoXY(0,1);
Print("Time: ");
EA=1;
TR0=1;
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);//不显示光标
}
}
break;
case SECOND_ADJ_L: //秒底位调整
{ EA=0; //关中断
/* switch(Key_temp) //根据按键值选择要写入的 !!好像可以很简单的处理就是用一条语句就可以
{
case ZERO : TimeString[SECOND_L]=0+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
case ONE : TimeString[SECOND_L]=1+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
case TWO : TimeString[SECOND_L]=2+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
case THREE: TimeString[SECOND_L]=3+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
case FOUR : TimeString[SECOND_L]=4+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
case FIVE : TimeString[SECOND_L]=5+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
case SIX : TimeString[SECOND_L]=6+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
case SEVEN: TimeString[SECOND_L]=7+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
case EIGHT: TimeString[SECOND_L]=8+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
case NINE : TimeString[SECOND_L]=9+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]); break;
default :break;
}*/
if((Key_temp>=0)&&(Key_temp<=9))
{
TimeString[SECOND_L]=Key_temp+'0';GotoXY(13,1);LCD_send_data(TimeString[SECOND_L]);
}
GotoXY(13,1); //写入秒底位
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
GotoXY(13,1);
Delay1ms(20);
BurstWrite1302_Flag=1;
}
break;
case SECOND_ADJ_H: //秒高位调整
//display
{
if((Key_temp>=0)&&(Key_temp<=5))
{
TimeString[SECOND_H]=Key_temp+'0';GotoXY(12,1);LCD_send_data(TimeString[SECOND_H]);
}
GotoXY(12,1);
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
GotoXY(12,1);
Delay1ms(20);
BurstWrite1302_Flag=1;
}
break;
case MINUTE_ADJ_L: //分钟底位调整
//display
{
if((Key_temp>=0)&&(Key_temp<=9))
{
TimeString[MIN_L]=Key_temp+'0';GotoXY(10,1);LCD_send_data(TimeString[MIN_L]);
}
GotoXY(10,1);
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
GotoXY(10,1);
Delay1ms(20);
BurstWrite1302_Flag=1;
}
break;
case MINUTE_ADJ_H: //分钟高位调整
//display
{
if((Key_temp>=0)&&(Key_temp<=5))
{
TimeString[MIN_H]=Key_temp+'0';GotoXY(9,1);LCD_send_data(TimeString[MIN_H]);
}
GotoXY(9,1);
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
GotoXY(9,1);
Delay1ms(20);
BurstWrite1302_Flag=1;
}
break;
case HOUR_ADJ_L: //小时底位调整
//display
{
if((Key_temp>=0)&&(Key_temp<=9))
{
TimeString[HOUR_L]=Key_temp+'0';GotoXY(7,1);LCD_send_data(TimeString[HOUR_L]);
}
GotoXY(7,1);
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
GotoXY(7,1);
Delay1ms(20);
BurstWrite1302_Flag=1;
}
break;
case HOUR_ADJ_H: //小时高位调整
//display
{
/*switch(Key_temp)
{
case ZERO : TimeString[HOUR_H]=0+'0';GotoXY(6,1);LCD_send_data(TimeString[HOUR_H]); break;
case ONE : TimeString[HOUR_H]=1+'0';GotoXY(6,1);LCD_send_data(TimeString[HOUR_H]); break;
case TWO : TimeString[HOUR_H]=2+'0';GotoXY(6,1);LCD_send_data(TimeString[HOUR_H]); break;
default :break;
}*/
if((Key_temp>=0)&&(Key_temp<=2))
{
TimeString[HOUR_H]=Key_temp+'0';GotoXY(6,1);LCD_send_data(TimeString[HOUR_H]);
}
GotoXY(6,1);
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
GotoXY(6,1);
Delay1ms(20);
BurstWrite1302_Flag=1;
}
break;
case DATA_ADJ_L: //日期底位调整
//display
{
if((TimeString[HOUR_H]-'0'>=2)&&(TimeString[HOUR_L]-'0'>=4))
{
State_ADJ=HOUR_ADJ_L;
}
if((Key_temp>=0)&&(Key_temp<=9))
{
DateString[DATA_L]=Key_temp+'0';GotoXY(13,0);LCD_send_data(DateString[DATA_L]);
}
GotoXY(13,0);
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON);//光标闪烁
GotoXY(13,0);
Delay1ms(20);
BurstWrite1302_Flag=1;
}
break;
case DATA_ADJ_H: //日期高位调整
//display
{
if((Key_temp>=0)&&(Key_temp<=1))
{
DateString[DATA_H]=Key_temp+'0';GotoXY(12,0);LCD_send_data(DateString[DATA_H]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -