📄 example_setrtc.c
字号:
/************************************************************************************
* Copyright (c), 2004-2007,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* Http: www.mlarm.com
* Email: mlarm@mlarm.com
*
* File name: Example_SetRTC.c
*
* Project : ML-F020ICB
* Processor: C8051F020
* Compiler : Keil C51 Compiler
*
* Author: EagleC
* Version: 1.00
* Date: 2007.07.05
* Email:
*
* Description: 本文件是RCT时间校准程序;
*
* Others: none;
*
* Function List:
*
* History:
* 1. Author: Eagle Cao
* Version: 1.00
* Date: 2007.07.05
* Modification: 建立文件
*
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "driver.h"
#include "api.h"
#include "ShowLCD.h"
/************************************************************************************/
extern unsigned char code ASCII[16];
extern RTC_TIME g_stRtctime; //当前RTC
extern unsigned char g_nOldSecond; //前一秒数值,用于比较秒位是否更新了
#define RTC_X 48
#define RTC_Y 88
#define RTC_X_ 65
/***********************************************************************************
* Function: SetRTC_Proc;
*
* Description: RCT时间校准程序
*
* Input: none;
*
* Return: none;
*
* Note: none;
************************************************************************************/
void SetRTC_Proc(void)
{
RTC_TIME rtc;
unsigned char i,cmd,j;
unsigned char sRtc[19]={0};
unsigned char Show_flag;// 是否实时显示时间
unsigned char bChenge; // 是否已更改设置
unsigned char Set_flag; // 是否进入设置状态
unsigned char CurPos; // 当前数据位置
unsigned char Data[12];
unsigned char AddresY[12];
unsigned char nX;
unsigned char *pItem;
LCDB_ClearScreen();
Show_Title();
LCDB_DispFWord(32,8*(20-5),"时 间 校 准");
for(i=0,j=-1;i<12;i++)
{
if(i%2==0) j++;
AddresY[i] = RTC_Y+8*(i+j);
}
RTC_Read(&g_stRtctime);
g_nOldSecond = g_stRtctime.second-1;
Show_flag = 1;
bChenge = 0;
Set_flag = 0;
nX = 80;
pItem = "本测试程序主要校准RCT的日期和时间,结果显示在最下边。";
LCDB_DispFWord(nX, 32,pItem);
pItem = "0~9:设置当前光标的数值";
LCDB_DispFWord(nX+16*2, 56,pItem);
pItem = "A:光标后移";
LCDB_DispFWord(nX+16*3, 56,pItem);
pItem = "B:光标前移";
LCDB_DispFWord(nX+16*4, 56,pItem);
pItem = "D:确认";
LCDB_DispFWord(nX+16*5, 56,pItem);
pItem = "E:帮助";
LCDB_DispFWord(nX+16*6, 56,pItem);
pItem = "F:返回";
LCDB_DispFWord(nX+16*7, 56,pItem);
while(1)
{
EWachdog_Clear();
cmd = Key_Read();
if(cmd != CH452_KEY_INVAL)
{
ALARM_Ctrl(1);
Delay_ms(20);
ALARM_Ctrl(0);
switch (cmd)
{
case 0x00://set 0
if(Set_flag)
{
Data[CurPos]=0;
bChenge = 1;
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x01://set 1
if(Set_flag)
{
Data[CurPos]=1;
bChenge = 1;
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x02://set 2
if(Set_flag)
{
if(CurPos==2) break;
Data[CurPos]=2;
bChenge = 1;
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x03://set 3
if(Set_flag)
{
if(CurPos==2 || CurPos==6) break;
if((Data[2]<<4+Data[3]) == 2) break;
Data[CurPos]=3;
bChenge = 1;
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x04://set 4
if(Set_flag)
{
if(CurPos==2 || CurPos==4 || CurPos==6) break;
Data[CurPos]=4;
bChenge = 1;
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x05://set 5
if(Set_flag)
{
if(CurPos==2 || CurPos==4 || CurPos==6) break;
Data[CurPos]=5;
bChenge = 1;
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x06://set 6
if(Set_flag)
{
if(CurPos==2 || CurPos==4 || CurPos==6 || CurPos==8 || CurPos==10) break;
Data[CurPos]=6;
bChenge = 1;
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x07://set 7
if(Set_flag)
{
if(CurPos==2 || CurPos==4 || CurPos==6 || CurPos==8 || CurPos==10) break;
Data[CurPos]=7;
bChenge = 1;
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x08://set 8
if(Set_flag)
{
if(CurPos==2 || CurPos==4 || CurPos==6 || CurPos==8 || CurPos==10) break;
Data[CurPos]=8;
bChenge = 1;
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x09://set 9
if(Set_flag)
{
if(CurPos==2 || CurPos==4 || CurPos==6 || CurPos==8 || CurPos==10) break;
Data[CurPos]=9;
bChenge = 1;
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x0A://CurPos++
if(Set_flag)
{
if(CurPos<11)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos++;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x0B://CurPos--
if(Set_flag)
{
if(CurPos>0)
{
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
CurPos--;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
}
}
break;
case 0x0D://进入校准模式and确认校准
if(Set_flag)//确认校准
{
Show_flag = 1;
Set_flag = 0;
bChenge = 0;
rtc.year = Data[0]*10+Data[1];
rtc.month = Data[2]*10+Data[3];
rtc.day = Data[4]*10+Data[5];
rtc.hour = Data[6]*10+Data[7];
rtc.minute = Data[8]*10+Data[9];
rtc.second = Data[10]*10+Data[11];
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
g_nOldSecond = rtc.second-1;
if(rtc.month == 0 || rtc.day==0)
{
LCDB_DispFWord(240-16, 16*2,"时间设置失败");
break;
}
if(rtc.month==4 || rtc.month==6 || rtc.month==9 || rtc.month==11)
{ if(rtc.day>=0x31)
{
LCDB_DispFWord(240-16, 16*2,"时间设置失败");
break;
}
}
if(rtc.month==2)
{ if(rtc.day>=0x29)
{
LCDB_DispFWord(240-16, 16*2,"时间设置失败");
break;
}
}
if(rtc.month<=0x12 && rtc.day<=0x31 && rtc.hour<=0x23)
{
RTC_Write(&rtc);
LCDB_DispFWord(240-16, 16*2,"时间设置成功");
}
else
{
LCDB_DispFWord(240-16, 16*2,"时间设置失败");
}
}
else
{//进入校准模式
Set_flag = 1;
Show_flag = 0; //实时显示停止
RTC_Read(&g_stRtctime);
Data[0] = g_stRtctime.year/10;Data[1] = g_stRtctime.year%10;
Data[2] = g_stRtctime.month/10;Data[3] = g_stRtctime.month%10;
Data[4] = g_stRtctime.day/10;Data[5] = g_stRtctime.day%10;
Data[6] = g_stRtctime.hour/10;Data[7] = g_stRtctime.hour%10;
Data[8] = g_stRtctime.minute/10;Data[9] = g_stRtctime.minute%10;
Data[10] = g_stRtctime.second/10;Data[11] = g_stRtctime.second%10;
bChenge = 1;
CurPos = 0;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,1);
LCDB_DispFWord(240-16, 16*2,"进入时间设置");
}
break;
case 0x0F:
if(Set_flag)
{
Show_flag = 1;
Set_flag = 0;
bChenge = 0;
LCDB_DrawLine(RTC_X_, AddresY[CurPos],RTC_X_,AddresY[CurPos]+8,0);
LCDB_DispFWord(240-16, 16*2,"取消时间设置");
}
else
return;
break;
}
}
if(Show_flag)//实时显示
{
RTC_Read(&g_stRtctime);
if(g_nOldSecond != g_stRtctime.second) //秒位更新
{
g_nOldSecond = g_stRtctime.second;
LCDB_DispFWord(RTC_X, RTC_Y,sRtc);
sRtc[0] = ASCII[g_stRtctime.year/10]; sRtc[1] = ASCII[g_stRtctime.year%10];
sRtc[2] = '-';
sRtc[3] = ASCII[g_stRtctime.month/10]; sRtc[4] = ASCII[g_stRtctime.month%10];
sRtc[5] = '-';
sRtc[6] = ASCII[g_stRtctime.day/10]; sRtc[7] = ASCII[g_stRtctime.day%10];
sRtc[8] = ' ';
sRtc[9] = ASCII[g_stRtctime.hour/10]; sRtc[10] = ASCII[g_stRtctime.hour%10];
sRtc[11] = ':';
sRtc[12] = ASCII[g_stRtctime.minute/10] ;sRtc[13] = ASCII[g_stRtctime.minute%10];
sRtc[14] = ':';
sRtc[15] = ASCII[g_stRtctime.second/10] ;sRtc[16] = ASCII[g_stRtctime.second%10];
sRtc[17] = '\0';
}
Delay_ms(1);
}
if(bChenge && Set_flag)//是否被改变 && 进入修改状态
{
bChenge = 0;
sRtc[0] = ASCII[Data[0]&0x0f];sRtc[1] = ASCII[Data[1]&0x0f];
sRtc[2] = '-';
sRtc[3] = ASCII[Data[2]&0x01];sRtc[4] = ASCII[Data[3]&0x0f];
sRtc[5] = '-';
sRtc[6] = ASCII[Data[4]&0x03];sRtc[7] = ASCII[Data[5]&0x0f];
sRtc[8] = ' ';
sRtc[9] = ASCII[Data[6]&0x03];sRtc[10] = ASCII[Data[7]&0x0f];
sRtc[11] = ':';
sRtc[12] = ASCII[Data[8]&0x07];sRtc[13] = ASCII[Data[9]&0x0f];
sRtc[14] = ':';
sRtc[15] = ASCII[Data[10]&0x07];sRtc[16] = ASCII[Data[11]&0x0f];
sRtc[17] = '\0';
LCDB_DispFWord(RTC_X, RTC_Y,sRtc);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -