📄 i2c.c
字号:
/*******************************************************************************/
/* */
/* Title: I2C Code */
/* */
/* This example demo code is provided as is and has no warranty, implied */
/* or otherwise. You are free to use/modify any of the provided code at */
/* your own risk in your applications. */
/* */
/* LIMITATION OF LIABILITY: NEITHER STMicroelectronics NOR ITS VENDORS */
/* OR AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOST OF USE, LOSS */
/* OF DATA, INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, */
/* INCIDENTAL OR CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS */
/* AGREEMENT OR OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH */
/* DAMAGES. */
/* */
/* Application Test Program for: */
/* ----------------------------- */
/* */
/* M41T0/T00/T11/T56 (I2C - 8 Bytes RTC Reg. Map) */
/* M41T80/T81 (I2C - 20 Bytes RTC Reg. Map) */
/* M41ST84/ST85 (I2C - 20 Bytes RTC Reg. Map) */
/* M41ST87 (I2C - RTC Reg. Map) */
/* */
/*=============================================================================*/
/* */
/* Rev. Description Date: */
/*=============================================================================*/
/* */
/* 01 - Initial Rev. 03-01-03 */
/* */
/*******************************************************************************/
#include <c:\c51\inc\REG515.H> /* DEFINE 8051 REGISTERS */
#include <c:\c51\inc\STDIO.H> /* DEFINE I/O FUNCTIONS */
#include <c:\c51\inc\CTYPE.H> /* DEFINITIONS FOR CHAR CONVERSION */
#include <c:\c51\inc\ABSACC.H> /* DIRECT ACCESS TO 8051 MEMORY */
#include <c:\c51\inc\STDLIB.H> /* STANDARD LIBRARY */
#include <c:\c51\inc\STRING.H> /* STRING FUNCTIONS */
#include <c:\c51\inc\INTRINS.H>
/********************** PORT ASSIGNMENTS **************************************/
/* */
/* Use Port 1, 4 and 5 for the following signals. */
/* */
/* P4.0 = SDA (Input/Output) */
/* P4.1 = SCL (Input) */
/* */
/******************************************************************************/
/*********************** FUNCTIONS PROTOTYPE **********************************/
/* */
/******************************************************************************/
void main (void);
void Board_Init(void);
/* I2C Functions Prototype */
void I2CStart(void);
void I2C_Init(void);
void Delay(unsigned int count);
unsigned char I2CMasterWrite(unsigned char input_byte);
unsigned char I2CMasterRead(unsigned char ack);
unsigned char I2CStop();
/********************* DEFINE CONSTANTS & GLOBAL VARIABLES ********************/
/* */
/* Define Timekeeper registers constants. */
/* */
/******************************************************************************/
#define Good_Device 1
#define Bad_Device 2
sbit SDA = P4^0;
sbit SCL = P4^1;
/******************************************************************************/
/* Subroutine: Main */
/* */
/* Description: Write and read to the Timekeeper Register and also */
/* write and read to the RAM. */
/* */
/******************************************************************************/
void main(void)
{ /* Start of Main Program */
unsigned char Dev_Sel;
unsigned char Sec_Add_Reg, Min_Add_Reg, Hr_Add_Reg, DOW_Add_Reg, DOM_Add_Reg;
unsigned char Mon_Add_Reg, Yr_Add_Reg, Cont_Add_Reg, Word_Add, RAM_Size;
unsigned char Tenths_Sec_Add_Reg, Wdog_Add_Reg, Al_Mon_Add_Reg;
unsigned char Al_DOM_Add_Reg, Al_Hr_Add_Reg, Al_Min_Add_Reg, Al_Sec_Add_Reg;
unsigned char Flags_Add_Reg, SQW_Add_Reg, Tamper1_Add_Reg, Tamper2_Add_Reg;
unsigned char Sel_RTC_Reg, RTC_Data;
unsigned char Sec_Reg, Min_Reg, Hr_Reg, DOW_Reg, DOM_Reg, Mon_Reg, Yr_Reg;
unsigned char Cont_Reg, Tenths_Sec_Reg, Wdog_Reg, Al_Mon_Reg, Al_DOM_Reg;
unsigned char Al_Hr_Reg, Al_Min_Reg, Al_Sec_Reg, Flags_Reg, SQW_Reg;
unsigned char Tamper1_Reg, Tamper2_Reg, Interrupts;
unsigned char Sec_Data, Min_Data, Hr_Data, DOW_Data, DOM_Data, Mon_Data, Yr_Data;
unsigned char j, i, Number_Bytes, Error_Flag;
unsigned char RAM_Data_In, RAM_Add, RAM_Data_Out, Dev_Add, RTC_Reg_Size, RAM_Density;
Board_Init();
Dev_Add = 0xD0;
/* Start of I2C Mode */
I2C_Init();
Dev_Sel = _getkey();
switch (Dev_Sel)
{ /* Start of Device Selection */
case 1 : /* T0/T00/T11/T56 RTC Address Location */
/* T0 & T00 device have no memory */
/* T11 & T56 have 56 bytes of memory */
P5 = 0xFF;
Sec_Add_Reg = _getkey();
Min_Add_Reg = _getkey();
Hr_Add_Reg = _getkey();
DOW_Add_Reg = _getkey();
DOM_Add_Reg = _getkey();
Mon_Add_Reg = _getkey();
Yr_Add_Reg = _getkey();
Cont_Add_Reg = _getkey();
Word_Add = _getkey();
RAM_Size = _getkey();
break ;
case 2 : /* M41T80/T81/ST84/ST85 RTC Address Location */
/* T80 & T81 device have no memory */
/* ST84 & ST85 have 56 bytes of memory */
P5 = 0xFF;
Tenths_Sec_Add_Reg = _getkey();
Sec_Add_Reg = _getkey();
Min_Add_Reg = _getkey();
Hr_Add_Reg = _getkey();
DOW_Add_Reg = _getkey();
DOM_Add_Reg = _getkey();
Mon_Add_Reg = _getkey();
Yr_Add_Reg = _getkey();
Cont_Add_Reg = _getkey();
Wdog_Add_Reg = _getkey();
Al_Mon_Add_Reg = _getkey();
Al_DOM_Add_Reg = _getkey();
Al_Hr_Add_Reg = _getkey();
Al_Min_Add_Reg = _getkey();
Al_Sec_Add_Reg = _getkey();
Flags_Add_Reg = _getkey();
SQW_Add_Reg = _getkey();
Word_Add = _getkey();
RAM_Size = _getkey();
break ;
case 3 : /* M41ST87 RTC Address Location */
/* ST87 has 144 bytes of memory */
P5 = 0xEF;
Tenths_Sec_Add_Reg = _getkey();
Sec_Add_Reg = _getkey();
Min_Add_Reg = _getkey();
Hr_Add_Reg = _getkey();
DOW_Add_Reg = _getkey();
DOM_Add_Reg = _getkey();
Mon_Add_Reg = _getkey();
Yr_Add_Reg = _getkey();
Cont_Add_Reg = _getkey();
Wdog_Add_Reg = _getkey();
Al_Mon_Add_Reg = _getkey();
Al_DOM_Add_Reg = _getkey();
Al_Hr_Add_Reg = _getkey();
Al_Min_Add_Reg = _getkey();
Al_Sec_Add_Reg = _getkey();
Flags_Add_Reg = _getkey();
SQW_Add_Reg = _getkey();
Tamper1_Add_Reg = _getkey();
Tamper2_Add_Reg = _getkey();
Word_Add = _getkey();
RAM_Size = _getkey();
break ;
default:
break ;
}
/* End of Device Selection */
while(1)
{ /* Start of Input Selection */
Sel_RTC_Reg = _getkey ();
switch (Sel_RTC_Reg)
{ /* Start of RTC Reg. Selection */
case 11: /* write to seconds register */
RTC_Data = _getkey();
I2CStart();
if (I2CMasterWrite(Dev_Add))
I2CStop();
if (I2CMasterWrite(Sec_Add_Reg))
I2CStop();
if (I2CMasterWrite(RTC_Data))
I2CStop();
I2CStop();
break;
case 12: /* write to minutes register */
RTC_Data = _getkey();
I2CStart();
if (I2CMasterWrite(Dev_Add))
I2CStop();
if (I2CMasterWrite(Min_Add_Reg))
I2CStop();
if (I2CMasterWrite(RTC_Data))
I2CStop();
I2CStop();
break;
case 13: /* write to hours register */
RTC_Data = _getkey();
I2CStart();
if (I2CMasterWrite(Dev_Add))
I2CStop();
if (I2CMasterWrite(Hr_Add_Reg))
I2CStop();
if (I2CMasterWrite(RTC_Data))
I2CStop();
I2CStop();
break;
case 14: /* write to day register */
RTC_Data = _getkey();
I2CStart();
if (I2CMasterWrite(Dev_Add))
I2CStop();
if (I2CMasterWrite(DOW_Add_Reg))
I2CStop();
if (I2CMasterWrite(RTC_Data))
I2CStop();
I2CStop();
break;
case 15: /* write to date register */
RTC_Data = _getkey();
I2CStart();
if (I2CMasterWrite(Dev_Add))
I2CStop();
if (I2CMasterWrite(DOM_Add_Reg))
I2CStop();
if (I2CMasterWrite(RTC_Data))
I2CStop();
I2CStop();
break;
case 16: /* write to month register */
RTC_Data = _getkey();
I2CStart();
if (I2CMasterWrite(Dev_Add))
I2CStop();
if (I2CMasterWrite(Mon_Add_Reg))
I2CStop();
if (I2CMasterWrite(RTC_Data))
I2CStop();
I2CStop();
break;
case 17: /* write to year register */
RTC_Data = _getkey();
I2CStart();
if (I2CMasterWrite(Dev_Add))
I2CStop();
if (I2CMasterWrite(Yr_Add_Reg))
I2CStop();
if (I2CMasterWrite(RTC_Data))
I2CStop();
I2CStop();
break;
case 18: /* write to control register */
RTC_Data = _getkey();
I2CStart();
if (I2CMasterWrite(Dev_Add))
I2CStop();
if (I2CMasterWrite(Cont_Add_Reg))
I2CStop();
if (I2CMasterWrite(RTC_Data))
I2CStop();
I2CStop();
break;
case 19: /* write to watchdog register */
RTC_Data = _getkey();
I2CStart();
if (I2CMasterWrite(Dev_Add))
I2CStop();
if (I2CMasterWrite(Wdog_Add_Reg))
I2CStop();
if (I2CMasterWrite(RTC_Data))
I2CStop();
I2CStop();
break;
case 20: /* write to alarm month register */
RTC_Data = _getkey();
I2CStart();
if (I2CMasterWrite(Dev_Add))
I2CStop();
if (I2CMasterWrite(Al_Mon_Add_Reg))
I2CStop();
if (I2CMasterWrite(RTC_Data))
I2CStop();
I2CStop();
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -