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

📄 example_setrtc.c

📁 C8051F020单片机开发板演示程序
💻 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 + -