📄 ds1337.c
字号:
/*-----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support - ROUSSET -
*------------------------------------------------------------------------------
* The software is delivered "AS IS" without warranty or condition of any
* kind, either express, implied or statutory. This includes without
* limitation any warranty or condition with respect to merchantability or
* fitness for any particular purpose, or against the infringements of
* intellectual property rights of others.
*------------------------------------------------------------------------------
* File Name : ds1337.c
* Object : main application written in C.
* : MAXIM-DALLAS DS1337 RTC Demo Example
* Version | mm | dd | yy | author :
* 1.0 11 23 06 PFi : Creation
* 1.1 11 04 07 PFi : START / STOP bit clean up according to new
* TWI doc.
*
*------------------------------------------------------------------------------
* 1)Description:
*
* This Demo uses the Maxim-Dallas DS1337 I2C RTC connnected
* on the TWI port.
* A set of standalone read or set functions for each RTC parameters (second
* ,minute, day etc..) are provided and also higher functions, SetDateTime and
* ReadDateTime, are provided for size and speed optimization.
*
*
* ------| AT91 / IO | DS1337 / IO
* CLOCK | TWCK / PA3 | SCL / 6
* DATA | TWD / PA4 | SDA / 5
*
*
* * WARNINGS ** :
* - No pull ups are mounted on the board on TWD and TWCK. 2.2K Pull up used
* - By default IAR compiler use the Tiny printf and scanf library format.
* To be able to make print of float variables, you must set the library
* format to large.
*
* 3) Remarks:
*
* No time out loops or good read or write sequence checking is done.
* This example runs in polling mode and makes no use of IRQs. To have further
* details and implementation example about using IRQs, refer to any Interrupt
* project examples, * like AT91SAM7Sxx-Interrupt-IAR4_XX-X_X
* available on www.at91.com --> KIT --> AT91SAM7S-EK --> Software
*
*----------------------------------------------------------------------------*/
/* Include of standard library files */
#include "math.h"
/* Include of chip and board specific header files */
#include "project.h"
#include "..\common\lib_twi.h"
#include "ds1337.h"
char DayOfWeek[7][7] = { // Days of the week
"Sun.",
"Mon.",
"Tues.",
"Wed.",
"Thurs.",
"Fri.",
"Sat."
};
char Month[12][6] = { // Names of the months
"Jan.",
"Feb.",
"Mar.",
"Apr.",
"May ",
"Jun.",
"Jul.",
"Aug.",
"Sept.",
"Oct.",
"Nov.",
"Dec."
};
/*-----------------------------------------------------------------------------
This function converts an 8 bit binary value to an 8 bit BCD value.
The input range must be from 0 to 99.
-----------------------------------------------------------------------------*/
unsigned char AT91F_DS1337_Bin2Bcd(unsigned char BinValue)
{
unsigned char Bcd;
Bcd = (BinValue / 10) << 4;
Bcd |= BinValue % 10;
return (Bcd) ;
}
/*-----------------------------------------------------------------------------
This function converts an 8 bit BCD value to an 8 bit binary value.
The input range must be from 00 to 99.
-----------------------------------------------------------------------------*/
unsigned char AT91F_DS1337_Bcd2Bin(unsigned char BcdValue)
{
return ( (BcdValue & 0x0F) + (((BcdValue & 0xF0)>>4) *10));
}
/*-----------------------------------------------------------------------------
This function sets the control register to configure the RTC.
*** the function does not perform a read-modify-write of the control reg.***
it simply write the control reg.
-----------------------------------------------------------------------------*/
void AT91F_DS1337_SetControlRegister(char ControlReg)
{
/* Then write the new value into the control register */
AT91F_TWI_WriteSingleIadr(AT91C_DS1337_I2C_ADDRESS,
DS1337_CONTROL_REG,
AT91C_TWI_IADRSZ_1_BYTE,
&ControlReg);
}
/*-----------------------------------------------------------------------------
This function sets the seconds register into the RTC
-----------------------------------------------------------------------------*/
void AT91F_DS1337_SetSeconds(char seconds)
{
char data2send;
/* Convert the value to program into the RTC from a bin value to bcd value */
data2send = AT91F_DS1337_Bin2Bcd(seconds);
AT91F_TWI_WriteSingleIadr(AT91C_DS1337_I2C_ADDRESS,
DS1337_SECONDS_REG,
AT91C_TWI_IADRSZ_1_BYTE,
&data2send);
}
/*-----------------------------------------------------------------------------
This function reads the second register from the RTC
-----------------------------------------------------------------------------*/
char AT91F_DS1337_ReadSeconds(void)
{
char data2read;
AT91F_TWI_ReadSingleIadr(AT91C_DS1337_I2C_ADDRESS,
DS1337_SECONDS_REG,
AT91C_TWI_IADRSZ_1_BYTE,
&data2read);
/* Convert the value read from the RTC into a bcd value to a bin value */
return (AT91F_DS1337_Bcd2Bin(data2read) );
}
/*-----------------------------------------------------------------------------
This function sets the minute register into the RTC
-----------------------------------------------------------------------------*/
void AT91F_DS1337_SetMinutes(char minutes)
{
char data2send;
/* Convert the value to program into the RTC from a bin value to bcd value */
data2send = AT91F_DS1337_Bin2Bcd(minutes);
AT91F_TWI_WriteSingleIadr(AT91C_DS1337_I2C_ADDRESS,
DS1337_MINUTES_REG,
AT91C_TWI_IADRSZ_1_BYTE,
&data2send);
}
/*-----------------------------------------------------------------------------
This function reads the minute register from the RTC
-----------------------------------------------------------------------------*/
char AT91F_DS1337_ReadMinutes(void)
{
char data2read;
AT91F_TWI_ReadSingleIadr(AT91C_DS1337_I2C_ADDRESS,
DS1337_MINUTES_REG,
AT91C_TWI_IADRSZ_1_BYTE,
&data2read);
/* Convert the value read from the RTC into a bcd value to a bin value */
return ( AT91F_DS1337_Bcd2Bin(data2read) );
}
/*-----------------------------------------------------------------------------
This function sets the Hour register into the RTC
-----------------------------------------------------------------------------*/
void AT91F_DS1337_SetHours(char hours)
{
char data2send;
/* Convert the value to program into the RTC from a bin value to bcd value */
data2send = AT91F_DS1337_Bin2Bcd(hours);
AT91F_TWI_WriteSingleIadr(AT91C_DS1337_I2C_ADDRESS,
DS1337_HOURS_REG,
AT91C_TWI_IADRSZ_1_BYTE,
&data2send);
}
/*-----------------------------------------------------------------------------
This function reads the Hour register from the RTC
-----------------------------------------------------------------------------*/
char AT91F_DS1337_ReadHours(void)
{
char data2read;
AT91F_TWI_ReadSingleIadr(AT91C_DS1337_I2C_ADDRESS,
DS1337_HOURS_REG&0x3f,
AT91C_TWI_IADRSZ_1_BYTE,
&data2read);
/* Convert the value read from the RTC into a bcd value to a bin value */
return (AT91F_DS1337_Bcd2Bin(data2read) );
}
/*-----------------------------------------------------------------------------
This function sets the Day of the Week register into the RTC
-----------------------------------------------------------------------------*/
void AT91F_DS1337_SetDay(char day)
{
char data2send;
/* Convert the value to program into the RTC from a bin value to bcd value */
data2send = AT91F_DS1337_Bin2Bcd(day);
AT91F_TWI_WriteSingleIadr(AT91C_DS1337_I2C_ADDRESS,
DS1337_DAY_OF_WEEK_REG,
AT91C_TWI_IADRSZ_1_BYTE,
&data2send);
}
/*-----------------------------------------------------------------------------
This function reads the Day of the week register from the RTC
-----------------------------------------------------------------------------*/
char AT91F_DS1337_ReadDay(void)
{
char data2read;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -