EZ430 Chronos 自带程序源码:年月日期示范程序

EZ430 Chronos 自带程序源码:年月日期示范程序

date.c

// *************************************************************************************************
//
//	Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ 
//	 
//	 
//	  Redistribution and use in source and binary forms, with or without 
//	  modification, are permitted provided that the following conditions 
//	  are met:
//	
//	    Redistributions of source code must retain the above copyright 
//	    notice, this list of conditions and the following disclaimer.
//	 
//	    Redistributions in binary form must reproduce the above copyright
//	    notice, this list of conditions and the following disclaimer in the 
//	    documentation and/or other materials provided with the   
//	    distribution.
//	 
//	    Neither the name of Texas Instruments Incorporated nor the names of
//	    its contributors may be used to endorse or promote products derived
//	    from this software without specific prior written permission.
//	
//	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
//	  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
//	  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
//	  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
//	  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
//	  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
//	  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
//	  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
//	  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
//	  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
//	  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// *************************************************************************************************
// Date functions.
// *************************************************************************************************


// *************************************************************************************************
// Include section

// system
#include "project.h"

// driver
#include "display.h"
#include "ports.h"

// logic
#include "date.h"
#include "user.h"


// *************************************************************************************************
// Prototypes section
void reset_date(void);
u8 get_numberOfDays(u8 month, u16 year);
void add_day(void);
void mx_date(u8 line);
void sx_date(u8 line);
void display_date(u8 line, u8 update);


// *************************************************************************************************
// Defines section


// *************************************************************************************************
// Global Variable section
struct date sDate;	


// *************************************************************************************************
// Extern section
extern void (*fptr_lcd_function_line1)(u8 line, u8 update);
extern void (*fptr_lcd_function_line2)(u8 line, u8 update);


// *************************************************************************************************
// @fn          reset_date
// @brief        Reset date to start value.
// @param       none
// @return       none
// *************************************************************************************************
void reset_date(void)
{
	// Set date 
	sDate.year  = 2009;
	sDate.month = 8;
	sDate.day 	= 1;
	
	// Show day and month on display
	sDate.display = DISPLAY_DEFAULT_VIEW;
}


// *************************************************************************************************
// @fn          get_NumberOfDays
// @brief        Return number of days for a given month
// @param       month		month as char
//				year		year as int
// @return       			day count for given month
// *************************************************************************************************
u8 get_numberOfDays(u8 month, u16 year)
{
   switch(month)
   {
      case 1: 	
      case 3: 	
      case 5: 	
      case 7: 	
      case 8: 	
      case 10: 
      case 12: 	return (31);

      case 4: 	
      case 6: 	
      case 9: 	
      case 11: 	return (30);

	  // 1. A year that is divisible by 4 is a leap year. (Y % 4) == 0
	  // 2. Exception to rule 1: a year that is divisible by 100 is not a leap year. (Y % 100) != 0
	  // 3. Exception to rule 2: a year that is divisible by 400 is a leap year. (Y % 400) == 0 
   
      case 2: 	if ((year%4==0) && ((year%100!=0) || (year%400==0)))	
      				return (29);
				else
					return (28);
				
      default: 	return (0);
   }
}


// *************************************************************************************************
// @fn          add_day
// @brief        Add one day to current date. Called when clock changes from 23:59 to 00:00
// @param       none
// @return       none
// *************************************************************************************************
void add_day(void)
{
	// Add 1 day
	sDate.day++;	
	
	// Check if day overflows into next month
	if (sDate.day > get_numberOfDays(sDate.month, sDate.year))
	{
		// Add 1 month and reset to day to 1
		sDate.day = 1;				
		sDate.month++;	
		
		// Check if month overflows into next year
		if (sDate.month > 12)
		{
			// Add 1 year and reset month and day to 1
			sDate.day = 1;				
			sDate.month = 1;	
			sDate.year++;
		}	
	}
	
	// Indicate to display function that new value is available
	display.flag.full_update = 1;
}


// *************************************************************************************************
// @fn          mx_date
// @brief        Date set routine.
// @param       line		LINE1, LINE2
// @return       none
// *************************************************************************************************
void mx_date(u8 line)
{
	u8 select;
	s32 day;
	s32 month;
	s32 year;
	s16 max_days;
	u8 * str;
	u8 * str1;
			
	// Clear display
	clear_display_all();
			
	// Convert global to local variables
	day 	= sDate.day;
	month 	= sDate.month;
	year 	= sDate.year;
		
	// Init value index
	select = 0;	
	
	// Init display
	// LINE1: DD.MM (metric units) or MM.DD (English units)
	// LINE2: YYYY (will be drawn by set_value)
	
	if (sys.flag.use_metric_units)
	{
		str = itoa(day, 2, 0);
		display_chars(LCD_SEG_L1_3_2, str, SEG_ON);

		str1 = itoa(month, 2, 0);
		display_chars(LCD_SEG_L1_1_0, str1, SEG_ON);
	}
	else // English units
	{
		str = itoa(day, 2, 0);
		display_chars(LCD_SEG_L1_1_0, str, SEG_ON);

		str1 = itoa(month, 2, 0);
		display_chars(LCD_SEG_L1_3_2, str1, SEG_ON);
	}
	display_symbol(LCD_SEG_L1_DP1, SEG_ON);

	// Loop values until all are set or user breaks	set
	while(1) 
	{
		// Idle timeout: exit without saving 
		if (sys.flag.idle_timeout) break;

		// Button STAR (short): save, then exit 
		if (button.flag.star) 
		{
			// Copy local variables to global variables
			sDate.day = day;
			sDate.month = month;
			sDate.year = year;
			
			// Full display update is done when returning from function
			break;
		}

		switch (select)
		{
			case 0:		// Set year
						set_value(&year, 4, 0, 2008, 2100, SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE, LCD_SEG_L2_3_0, display_value1);
						select = 1;
						break;
			case 1:		// Set month
						if (sys.flag.use_metric_units) 
						{
							set_value(&month, 2, 0, 1, 12, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE, LCD_SEG_L1_1_0, display_value1);
						}
						else // English units
						{
							set_value(&month, 2, 0, 1, 12, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_2, display_value1);
						}
						select = 2;
						break;
			case 2:		// Set day
						if (sys.flag.use_metric_units)
						{
							set_value(&day, 2, 0, 1, max_days, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE, LCD_SEG_L1_3_2, display_value1);
						}
						else // English units
						{
							set_value(&day, 2, 0, 1, max_days, SETVALUE_ROLLOVER_VALUE + SETVALUE_DISPLAY_VALUE + SETVALUE_NEXT_VALUE, LCD_SEG_L1_1_0, display_value1);
						}
						select = 0;
						break;
		}
		
		// Check if day is still valid, if not clamp to last day of current month
		max_days = get_numberOfDays(month, year);
		if (day > max_days) day = max_days;
	}
	
	// Clear button flag
	button.all_flags = 0;
}


// *************************************************************************************************
// @fn          sx_date
// @brief        Date user routine. Toggles view between DD.MM and YYYY.
// @param       line		LINE1, LINE2
// @return       none
// *************************************************************************************************
void sx_date(u8 line)
{
	// Toggle display items
	if (sDate.display == DISPLAY_DEFAULT_VIEW) 	sDate.display = DISPLAY_ALTERNATIVE_VIEW;
	else 										sDate.display = DISPLAY_DEFAULT_VIEW;
}


// *************************************************************************************************
// @fn          display_date
// @brief        Display date in DD.MM format (metric units) or MM.DD (English units).
// @param       u8 line			LINE1, LINE2
//				u8 update		DISPLAY_LINE_UPDATE_FULL, DISPLAY_LINE_UPDATE_PARTIAL
// @return       none
// *************************************************************************************************
void display_date(u8 line, u8 update)
{
	u8 * str;
	
	if (update == DISPLAY_LINE_UPDATE_FULL)			
	{
		if (sDate.display == DISPLAY_DEFAULT_VIEW)
		{
			// Convert day to string
			str = itoa(sDate.day, 2, 0);
			if (sys.flag.use_metric_units)
			{ 	
				display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);
			}
			else
			{
				display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);
			}

			// Convert month to string
			str = itoa(sDate.month, 2, 0);
			if (sys.flag.use_metric_units)
			{ 
				display_chars(switch_seg(line, LCD_SEG_L1_1_0, LCD_SEG_L2_1_0), str, SEG_ON);
			}
			else
			{
				display_chars(switch_seg(line, LCD_SEG_L1_3_2, LCD_SEG_L2_3_2), str, SEG_ON);
			}
			
			// Display "." to separate day and month
			display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_ON);
		}
		else
		{
			// Convert year to string
			str = itoa(sDate.year, 4, 0);
			display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_3_0), str, SEG_ON);

			// Clear "." 
			display_symbol(switch_seg(line, LCD_SEG_L1_DP1, LCD_SEG_L2_DP), SEG_OFF);
		}
	}
	else if (update == DISPLAY_LINE_CLEAR)
	{
		// Show day and month on display when coming around next time
		sDate.display = DISPLAY_DEFAULT_VIEW;
	}	
}


date.h

// *************************************************************************************************
//
//	Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ 
//	 
//	 
//	  Redistribution and use in source and binary forms, with or without 
//	  modification, are permitted provided that the following conditions 
//	  are met:
//	
//	    Redistributions of source code must retain the above copyright 
//	    notice, this list of conditions and the following disclaimer.
//	 
//	    Redistributions in binary form must reproduce the above copyright
//	    notice, this list of conditions and the following disclaimer in the 
//	    documentation and/or other materials provided with the   
//	    distribution.
//	 
//	    Neither the name of Texas Instruments Incorporated nor the names of
//	    its contributors may be used to endorse or promote products derived
//	    from this software without specific prior written permission.
//	
//	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
//	  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
//	  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
//	  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
//	  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
//	  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
//	  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
//	  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
//	  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
//	  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
//	  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// *************************************************************************************************

#ifndef DATE_H_
#define DATE_H_


// *************************************************************************************************
// Include section


// *************************************************************************************************
// Prototypes section
extern void reset_date(void);
extern void add_day(void);
extern void mx_date(u8 line);
extern void sx_date(u8 line);
extern void display_date(u8 line, u8 update);


// *************************************************************************************************
// Defines section


// *************************************************************************************************
// Global Variable section
struct date
{
	u8  display;
	u8  day;
	u8  month;
	u16 year;
};
extern struct date sDate;


// *************************************************************************************************
// Extern section


#endif /*DATE_H_*/

你可能感兴趣的:(EZ430 Chronos 自带程序源码:年月日期示范程序)