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

📄 main.c

📁 FOR platform Calc candler
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                	 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			wgejygah
** Modified date:		2007
** Version:
** Descriptions:		RTC万年历实验
**						
**						1、时间范围:2000--2099
**						2、可以任意设置日期、时间和闹铃;
**						3、闰年补偿、定时提醒等功能;
**						4、可以通过PC机设置日期时间和定时提醒时刻;
**						5、可以在PC机上显示日期、时间和提醒时刻;
**						6、在串口软件上显示的格式为:(要求显示中文)
**						        当前日期:X年X月X日
**						        当前时间:X时X分X秒
**						        设置提醒:X时X分X秒
**
********************************************************************************************************/

#include "config.h"
#include "ZLG7290.h"
#include "I2CINT.h"
#include "UART0.h"

uint8 DisplayShift;		//显示切换
uint8 KeyValue;			//键值
uint8 KeySym;			//按键标志

uint8 ALSym;

uint16 YearTemp;
uint8 MonthTemp;
uint8 DomTemp;
uint8 DowTemp;
uint8 HourTemp;
uint8 MinTemp;
uint8 SecTemp;	

uint8 dom_max;			//日的最大值,	范围:28,29,30,31.
uint8 SendSym;

uint32 dly,ii;
uint8 sed_time[32];
uint8 rcv_time[32];
//无奈
	uint8 aALHOUR;
	uint8 aALHOUR;
	uint8 aALMIN;
	uint8 aALMIN;
	uint8 aALSEC;
	uint8 aALSEC;
	uint8 aAMR;
	
void DiplayInit(void)		//全局变量
{
	YearTemp = 0;
	MonthTemp = 0;
	DomTemp = 0;
	DowTemp = 7;
	HourTemp = 24;
	MinTemp = 60;
	SecTemp = 60;
}

void I2CInit(uint32 Fi2c)					//I2C初始化
{
	PINSEL0 = (PINSEL0&0xFFFFFF0F)|0x50;     //设置I2C连接
	
	/*设定I2C时钟*/
	I2SCLH = (Fpclk/Fi2c + 1)/2;
	I2SCLL = (Fpclk/Fi2c)/2;                           
	
	I2CONCLR = 0x2C;                        /*清除AAC  SIC  STAC 位*/
	I2CONSET = 0x40;						// AA=0  主模式	I2EN=1 使能I2C
	
	/*设置I2C中断允许*/		
	VICIntSelect = 0;					//设置所有通道为IRQ中断
	VICVectCntl3 = 0x29;				
	VICVectAddr3 = (uint32)IRQ_I2C;		//设置I2C中断向量
	VICIntEnClr = 1<<9;			   		 //使能I2C中断
}

void __irq IRQ_EXT3(void)
{
	KeySym = 1;						//置按键标志
	ALSym = 1;
	EXTINT |= 0x08;
	VICVectAddr = 0x00;
}

void EXT3Init(void)					//外部中断3初始化
{
	PINSEL1 |= 2<<28;				//P0.30口为外部中断3
	
	VICIntSelect = 0; 
	VICVectCntl1 = (0x20 | 17);     
	VICVectAddr1 = (uint32)IRQ_EXT3;  
	        
	EXTINT = 0x08;    
	EXTMODE = 0x08;    				//下降沿激活
	EXTPOLAR = 0x00;				
	                   
	VICIntEnable = (1 << 17);       //使能外部中断3
}

void RTCInit (void)					//RTC初始化
{
	PREINT = Fpclk / 32768 - 1;	 // 设置基准时钟分频器
	PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
	
	CCR   = 0x00;	// 禁止时间计数器
	
	YEAR  = 2007;	//2007年5月27日
	MONTH = 05;	
	DOM   = 29;
	DOW   = 2;		//星期二
	HOUR  = 23;		//23:59:56
	MIN   = 59;
	SEC   = 15;
	
	aALHOUR  = 23;		//23:59:56
	aALMIN   = 59;
	aALSEC   = 55;
	aAMR = 0x00;	
	
///CIIR = 0x01;	// 设置秒值的增量产生1次中断
	ILR  = 0x03;	// 清除RTC增量和报警中断标志
	CCR  = 0x01;	// 启动RTC
	
	dom_max = 31;
}


void KeySer(void)
{
	KeyValue = 0;
	if(KeySym)
	{	
		KeyValue = ZLG7290_GetKey();	//读取键值	
		KeySym = 0;
		switch (KeyValue)
		{
			case 1:							//显示切换
				if(DisplayShift < 2)
					DisplayShift ++;
				else
					DisplayShift = 0;	
				DiplayInit();				//更新显示
				break;
				
			case 2:							
				if(DisplayShift == 1)	    			//调整年   
					{
					if(YEAR < 2099)
						YEAR ++;	
					else
						YEAR = 2000;
					}	
				else if(DisplayShift == 0)				//调整小时   
					{
					if(HOUR < 23)
						HOUR ++;
					else
						HOUR = 0;
					}
				else if(DisplayShift == 2)					//调整闹铃的小时   
					{
					if(aALHOUR < 23)
						aALHOUR ++;
					else
						aALHOUR = 0;
					}	
				break;	
				
			case 3:							
				if(DisplayShift == 1)						//调整月
					{
					if(MONTH < 12)
						MONTH ++;	
					else
						MONTH = 1;
					}	
				else if(DisplayShift == 0)						//调整分钟   
					{
					if(MIN < 59)
						MIN ++;
					else
						MIN = 0;
					}
				else if(DisplayShift == 2)						//调整闹铃的分钟 
					{
					if(aALMIN < 59)
						aALMIN ++;
					else
						aALMIN = 0;
					}	
				break;
			
			case 4:
				if(DisplayShift == 1)	    				//调整日
					{
					if((MONTH == 1)|(MONTH == 3)|(MONTH ==  5)|(MONTH ==  7)|(MONTH == 8 )|(MONTH == 10)|(MONTH == 12))
						dom_max = 31;
					else if((MONTH == 4)|(MONTH == 6)|(MONTH == 9)|(MONTH == 11))
						dom_max = 30;
					else if((MONTH == 2) & (YEAR % 4))
						dom_max = 28;
					else
						dom_max = 29;
							
					if(DOM < dom_max)	
						DOM ++;
					else
						DOM = 1;
					}				
				else if(DisplayShift == 0)									//调整秒   
					{
					if(SEC < 59)
						SEC ++;
					else
						SEC = 0;
					}
				else if(DisplayShift == 2)	    				//调整闹铃的秒
					{
					if(aALSEC < 59)
						aALSEC ++;
					else
						aALSEC = 0;
					}			
				break;		
				
			case 5:										//调整星期
				if(DOW < 6)
					DOW ++;
				else
					DOW = 0;	
				break;	
			
			case 6:
				//ILR = 0x02;						//清除报警中断标志
				if(aAMR == 1)
					{
					aAMR = 0;
					IO0SET |= 1 << 14;
					IO0SET |= 1 << 10;
					}
				else
					{
					aAMR = 1;						//屏蔽所有报警
					IO0CLR |= 1 << 14;
					//IO0CLR |= 1 << 10;
					}
				break;
			
			case 7:
				SendSym = 1;	
				break;	
					
			default:
			   	break;	
		}
	}
}

void YearMonthDay (void)			//年 月 日
{
	if(DOM != DomTemp)
	{	
		ZLG7290_Download(4, 0, 0, DOM / 10);
		ZLG7290_Download(5, 1, 0, DOM % 10);
		DomTemp = DOM;
	}
	
	if(DOW != DowTemp)
	{
		ZLG7290_Download(6, 0, 0, 0x1F);		//清除星期显示
		ZLG7290_SegOnOff(DOW + 48, 1);          //按星期 日 一 二 三 四 五 六 显示
		DowTemp = DOW;
	}
		
	if(MONTH != MonthTemp)
	{		
		ZLG7290_Download(2, 0, 0, MONTH / 10);
		ZLG7290_Download(3, 1, 0, MONTH % 10);
		MonthTemp = MONTH;
	}
	
	if(YEAR != YearTemp)
	{	
		ZLG7290_Download(0, 0, 0, (YEAR - YEAR / 100 * 100) / 10);
		ZLG7290_Download(1, 1, 0, (YEAR - YEAR / 100 * 100) % 10);
		YearTemp = YEAR;
	}
}

void HourMinSecWeek (void)			//时 分 秒   星期
{
	if(SEC != SecTemp)
	{
		ZLG7290_Download(4, 0, 0, SEC / 10);
		ZLG7290_Download(5, 1, 0, SEC % 10);
		SecTemp = SEC;
	}

	if(MIN != MinTemp)							
	{	
		ZLG7290_Download(2, 0, 0, MIN / 10);
		ZLG7290_Download(3, 1, 0, MIN % 10);
		MinTemp = MIN;	
	}
	
	if(HOUR != HourTemp)
	{
		ZLG7290_Download(0, 0, 0, HOUR / 10);
		ZLG7290_Download(1, 1, 0, HOUR % 10);
		HourTemp = HOUR;
	}
	
	if(DOW != DowTemp)
	{
		ZLG7290_Download(6, 0, 0, 0x1F);		//清除日期显示
		ZLG7290_SegOnOff(DOW + 48, 1);          //按星期 日 一 二 三 四 五 六 显示
		DowTemp = DOW;
	}
}

void ALHourMinSec (void)
{
	uint32 i = 10000;
	uint8  ALSet[6];
	if(ALSym)
	{
	ALSym = 0;
	ALSet[0] = aALHOUR/10;
	ALSet[1] = aALHOUR%10 | 0x80;
	ALSet[2] = aALMIN/10;
	ALSet[3] = aALMIN%10 | 0x80;
	ALSet[4] = aALSEC/10;
	ALSet[5] = aALSEC%10 | 0x80;
	ZLG7290_SendBuf(ALSet,6);
	while ( i -- );
	}
}	

void PCDisplay(void)
{
	if(SendSym == 1)
		{
			SendSym = 0;
			if(aAMR == 1)
			{
				sed_time[0] = aALHOUR / 10 + 48;
				sed_time[1] = aALHOUR % 10 + 48;
				sed_time[2] = 0xCA;
				sed_time[3] = 0xB1;
				sed_time[4] = aALMIN / 10 + 48;
				sed_time[5] = aALMIN % 10 + 48;
				sed_time[6] = 0xB7;
				sed_time[7] = 0xD6;
				sed_time[8] = aALSEC / 10 + 48;
				sed_time[9] = aALSEC % 10 + 48;
				sed_time[10] = 0xC3;
				sed_time[11] = 0xEB;
				sed_time[12] = '\n';
				sed_time[13] = '\0';
			}
			else
			{	
				sed_time[0] = 2+48;
				sed_time[1] = 0+48;
				sed_time[2] = (uint8) (48 + (YEAR - YEAR / 100 * 100) / 10);
				sed_time[3] = (uint8) (48 + (YEAR - YEAR / 100 * 100) % 10);
				sed_time[4] = 0xC4;
				sed_time[5] = 0xEA;
				sed_time[6] = MONTH / 10 + 48;
				sed_time[7] = MONTH % 10 + 48;
				sed_time[8] = 0xD4;
				sed_time[9] = 0xC2;
				sed_time[10] = DOM / 10 + 48;
				sed_time[11] = DOM % 10 + 48;
				sed_time[12] = 0xC8;
				sed_time[13] = 0xD5;
				sed_time[14] = HOUR / 10 + 48;
				sed_time[15] = HOUR % 10 + 48;
				sed_time[16] = 0xCA;
				sed_time[17] = 0xB1;
				sed_time[18] = MIN / 10 + 48;
				sed_time[19] = MIN % 10 + 48;
				sed_time[20] = 0xB7;
				sed_time[21] = 0xD6;
				sed_time[22] = SEC / 10 + 48;
				sed_time[23] = SEC % 10 + 48;
				sed_time[24] = 0xC3;
				sed_time[25] = 0xEB;
				sed_time[26] = '\n';
				sed_time[27] = '\0';
			}
			UART0_SendStr(sed_time);
			for (dly = 10 ; dly>0; dly--)
				for (ii=0; ii<500; ii++);	
		}
}

void PCSet(void)
{
	if(U0LSR & 0x01)
		{
			if(aAMR == 1)
			{
				UART0_GetStr(rcv_time,8);
				aALHOUR  = rcv_time[0] * 10 + rcv_time[1] - 16;
				aALMIN   = rcv_time[3] * 10 + rcv_time[4] - 16;
				aALSEC   = rcv_time[6] * 10 + rcv_time[7] - 16;
			}
			else
			{
				UART0_GetStr(rcv_time,17);
				YEAR = 2000 + rcv_time[0] * 10 + rcv_time[1] - 28;
				MONTH = rcv_time[3] * 10 + rcv_time[4] - 32;
				DOM   = rcv_time[6] * 10 + rcv_time[7] - 16;
				HOUR  = rcv_time[9] * 10 + rcv_time[10] - 16;
				MIN   = rcv_time[12] * 10 + rcv_time[13] - 16;
				SEC   = rcv_time[15] * 10 + rcv_time[16] - 16;
			}
		}			
}

/*********************************************
*************					**************	
*************		main( )	 	**************
*************					**************			
*********************************************/

int main (void)
{		
	UART0_Init();
	
	IO0DIR |= 1 << 14;
	IO0DIR |= 1 << 10;
	IO0SET |= 1 << 14;
	IO0SET |= 1 << 10;	
	
	DisplayShift = 0;		//显示切换
	KeyValue = 0;			//键值
	KeySym = 0;				//按键标志
	ALSym = 0;
	
	SendSym = 0;
	
	DiplayInit();			//初始化全局变量
	
	I2CInit(5000);     
	EXT3Init();
	RTCInit();
	
	dly = 10000;			//延时
	while(dly--);
	
	while(1)
	{
		KeySer();
		
		if(1 == aAMR)
			{
				if((HOUR == aALHOUR)&&(MIN == aALMIN)&&(SEC == aALSEC))
				IO0CLR  |= 1 << 10;
				//aAMR = 0;
			}
	
	PCDisplay();
		
		if(DisplayShift == 1)
			YearMonthDay();
		else if(DisplayShift == 0)	
			HourMinSecWeek();
		else
			ALHourMinSec();					
	
	PCSet();
	
	//dly = 10000;
	//while(dly --);	
	
	}
	return 0;
}
/*********************************************************************************************************
**                            End Of File
*********************************************************************************************************/

⌨️ 快捷键说明

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