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

📄 i2c.c

📁 I2C实用源代码。KEIL C51编译器编写。
💻 C
📖 第 1 页 / 共 3 页
字号:
/*******************************************************************************/
/*									       */
/*	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 + -