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

📄 i2ce2prom.lst

📁 本人改编和测试过的用于AVR mega128关于I2C总线的应用实例--使用EEPROM的读写方法。采用ICCAVR编译器实验。
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
      66 EFCF      LDI	R28,0xFF
      67 E2D1      LDI	R29,0x21
      68 BFCD      OUT	0x3D,R28
      69 BFDE      OUT	0x3E,R29
      6A 52C0      SUBI	R28,0x20
      6B 40D0      SBCI	R29,0
      6C EA0A      LDI	R16,0xAA
      6D 8308      STD	Y+0,R16
      6E 2400      CLR	R0
      6F E0E0      LDI	R30,0
      70 E0F2      LDI	R31,2
      71 E012      LDI	R17,2
      72 31EA      CPI	R30,0x1A
      73 07F1      CPC	R31,R17
      74 F011      BEQ	0x0077
      75 9201      ST	R0,Z+
      76 CFFB      RJMP	0x0072
      77 8300      STD	Z+0,R16
      78 ECEC      LDI	R30,0xCC
      79 E0F0      LDI	R31,0
      7A E0A0      LDI	R26,0
      7B E0B2      LDI	R27,2
      7C E010      LDI	R17,0
      7D E000      LDI	R16,0
      7E BF0B      OUT	0x3B,R16
      7F 3CEC      CPI	R30,0xCC
      80 07F1      CPC	R31,R17
      81 F021      BEQ	0x0086
      82 95C8      LPM
      83 9631      ADIW	R30,1
      84 920D      ST	R0,X+
      85 CFF9      RJMP	0x007F
      86 940E 00CC CALL	_main
_exit:
      88 CFFF      RJMP	_exit
_EEPROM_Write:
  Data                 --> Y,+5
  M_ADD                --> R10
  H_ADD                --> R12
      89 940E 01AD CALL	push_xgset003C
      8B 0159      MOVW	R10,R18
      8C 2EC0      MOV	R12,R16
      8D 9721      SBIW	R28,1
FILE: E:\MyWorks\SOFT\I2C_E2PROM\I2C_Demo.c
(0001) // ***************   I2C driver Demo V 1.0   *************
(0002) // IO模拟方式的I2C接口操作
(0003) // *******************************************************
(0004) 
(0005) #include <iom1281v.h>
(0006) #include <MACROS.h>
(0007) 
(0008) #include <DC_Defines.h>
(0009) 
(0010) #include "I2C.h"
(0011) 
(0012) 
(0013) 
(0014) void EEPROM_Write(unsigned char, unsigned int, unsigned char);
(0015) unsigned char EEPROM_Read(unsigned char, unsigned int);
(0016) 
(0017) 
(0018) // **************************************************************** //
(0019) // ***                     Init_I2C();							*** //
(0020) // *** This routine will setup the I2C port direction registers *** //
(0021) // **************************************************************** //
(0022) 
(0023) // ***************************************************************** //
(0024) // ***                     I2C_Start();	 		  		 	   	 *** //
(0025) // *** This routine will set the I2C start condition on the bus, *** //
(0026) // *** All commands must be preceded by a START condition 		 *** //
(0027) // ***************************************************************** //
(0028) 
(0029) // ***************************************************************** //
(0030) // ***                     I2C_Stop();	 		  		 	   	 *** //
(0031) // *** This routine will set the I2C stop condition on the bus,  *** //
(0032) // *** All commands must end with a STOP condition 		         *** //
(0033) // ***************************************************************** //
(0034) 
(0035) // *********************************************************************** //
(0036) // ***                Write_I2C_Control(0x0A,0,0);	  		  	       *** //
(0037) // *** This routine will write the I2C device code, the device address *** //
(0038) // *** setup on the hardware pins A0,A1 & A2, and also the W/R bit     *** //
(0039) // *** So for an external EEPROM, such as the 24LC04B you would need   *** //
(0040) // *** a device code of 1010 (0x0A),   	  	  		  	  			   *** //
(0041) // *** hardware address 0 (if pins A0,A1 & A2 are left unconnected,    *** //
(0042) // *** and the last parameter is R/W. Write is active low			   *** //
(0043) // *********************************************************************** //
(0044) 
(0045) // *********************************************************************** //
(0046) // ***                          I2C_Ackn();							   *** //
(0047) // *** This routine will clock the ACK bit from the I2C slave device   *** //
(0048) // *** it will return TRUE for a fail, and FALSE for a correct ACK bit *** //
(0049) // *********************************************************************** //
(0050) 
(0051) // ************************************************************** //
(0052) // ***                     Write_I2C_Byte();				  *** //
(0053) // *** This routine will clock a byte to the slave I2C device *** //
(0054) // ************************************************************** //
(0055) 
(0056) // ************************************************************************** //
(0057) // ***                       Read_I2C_Byte();					          *** //
(0058) // *** This routine will read and return a byte from the I2C slave device *** //
(0059) // ************************************************************************** //
(0060) 
(0061) 
(0062) 
(0063) // *********************************************************************** //
(0064) // ***                 Example of using Imagecraft I2C driver          *** //
(0065) // ***              to write to an external 8 bit address EEPROM       *** //
(0066) // *** H_ADD is the hardware address set on the device A0,A1 & A2 pins *** //
(0067) // *** M_ADD is the devices internal memory address                    *** //
(0068) // *** Data is user data to be writen 								   *** //
(0069) // *********************************************************************** //
(0070) 
(0071) void EEPROM_Write(unsigned char H_ADD, unsigned int M_ADD, unsigned char Data)
(0072) {
(0073)  I2C_Start();			   			   // Set I2C start condition
      8E 940E 0112 CALL	_I2C_Start
(0074) 
(0075)  Write_I2C_Control(0x0A,H_ADD,0);	   // Send the EEPROM control Byte
      90 2422      CLR	R2
      91 8228      STD	Y+0,R2
      92 2D2C      MOV	R18,R12
      93 E00A      LDI	R16,0xA
      94 940E 0158 CALL	_Write_I2C_Control
(0076) 
(0077)  Write_I2C_Byte(M_ADD>>8);				   // Send the EEPROM internal Address higher byte.
      96 0185      MOVW	R16,R10
      97 2F01      MOV	R16,R17
      98 2711      CLR	R17
      99 940E 0121 CALL	_Write_I2C_Byte
(0078)  
(0079)  Write_I2C_Byte(M_ADD);            // Send the EEPROM internal Address lower byte.
      9B 2D0A      MOV	R16,R10
      9C 940E 0121 CALL	_Write_I2C_Byte
(0080)  
(0081)  Write_I2C_Byte(Data);				   // Send the EEPROM Data
      9E 810D      LDD	R16,Y+5
      9F 940E 0121 CALL	_Write_I2C_Byte
(0082)  
(0083)  I2C_Stop();	  					   // Set I2C Stop condition
      A1 940E 0117 CALL	_I2C_Stop
      A3 9621      ADIW	R28,1
      A4 940C 01A2 JMP	pop_xgset003C
_EEPROM_Read:
  Temp                 --> R10
  M_ADD                --> R12
  H_ADD                --> R10
      A6 940E 01AD CALL	push_xgset003C
      A8 0169      MOVW	R12,R18
      A9 2EA0      MOV	R10,R16
      AA 9721      SBIW	R28,1
(0084) }
(0085) 
(0086) 
(0087) 
(0088) // *********************************************************************** //
(0089) // ***              Example of using Imagecraft I2C driver             *** //
(0090) // ***            to Read an external 8 bit address EEPROM             *** //
(0091) // *** H_ADD is the hardware address set on the device A0,A1 & A2 pins *** //
(0092) // *** M_ADD is the devices internal memory address                    *** //
(0093) // *** Data is user data to be writen 								   *** //
(0094) // *********************************************************************** //
(0095) 
(0096) unsigned char EEPROM_Read(unsigned char H_ADD, unsigned int M_ADD)
(0097) {
(0098)  unsigned char Temp;			   		// Temp RAM for EEPROM Read
(0099)  
(0100)  I2C_Start();			   			   // Set I2C start condition
      AB 940E 0112 CALL	_I2C_Start
(0101) 
(0102)  Write_I2C_Control(0x0A,H_ADD,0);	   // Send the EEPROM control Byte
      AD 2422      CLR	R2
      AE 8228      STD	Y+0,R2
      AF 2D2A      MOV	R18,R10
      B0 E00A      LDI	R16,0xA
      B1 940E 0158 CALL	_Write_I2C_Control
(0103)  									   // Dummy write to set address
(0104) 
(0105)  Write_I2C_Byte(M_ADD>>8);				// Send the EEPROM internal Address Higher byte.
      B3 0186      MOVW	R16,R12
      B4 2F01      MOV	R16,R17
      B5 2711      CLR	R17
      B6 940E 0121 CALL	_Write_I2C_Byte
(0106)  Write_I2C_Byte(M_ADD);     // Send the EEPROM internal Address lower byte.
      B8 2D0C      MOV	R16,R12
      B9 940E 0121 CALL	_Write_I2C_Byte
(0107)  
(0108)  I2C_Start();			   			   // Set I2C start condition
      BB 940E 0112 CALL	_I2C_Start
(0109)  
(0110)  Write_I2C_Control(0x0A,H_ADD,1);	   // Send the EEPROM control Byte
      BD E081      LDI	R24,1
      BE 8388      STD	Y+0,R24
      BF 2D2A      MOV	R18,R10
      C0 E00A      LDI	R16,0xA
      C1 940E 0158 CALL	_Write_I2C_Control
(0111)  
(0112)  Temp = Read_I2C_Byte();			   // Read data from EEPROM
      C3 940E 013B CALL	_Read_I2C_Byte
      C5 2EA0      MOV	R10,R16
(0113)  
(0114)  I2C_Stop();	  					   // Set I2C Stop condition
      C6 940E 0117 CALL	_I2C_Stop
(0115) 
(0116)  return Temp;						   // Return data from EEPROM
      C8 2D0A      MOV	R16,R10
      C9 9621      ADIW	R28,1
      CA 940C 01A2 JMP	pop_xgset003C
_main:
  k                    --> R12
  data                 --> Y,+1
  j                    --> R10
  i                    --> R22
  c                    --> R20
      CC 9722      SBIW	R28,2
(0117) }
(0118) 
(0119) 
(0120) 
(0121) 
(0122) //AT24C512B使用2BYTE片内地址。
(0123) unsigned char bf[26];
(0124) void main (void)
(0125) {
(0126)   unsigned int i;
(0127)   unsigned char j, k;
(0128)   unsigned int c;			  // Temp Ram used for write delay
(0129)   volatile unsigned char data;
(0130)   
(0131)   DDRG |=BIT(PG1);
      CD 9A99      SBI	0x13,1
(0132)   PORTG |=BIT(PG1); //VCC =high.
      CE 9AA1      SBI	0x14,1
(0133)   
(0134)   I2C_DIR |= BIT(PD0)|BIT(PD1);  	 			  // Set Port B to Outputs
      CF B18A      IN	R24,0x0A
      D0 6083      ORI	R24,3
      D1 B98A      OUT	0x0A,R24
(0135)   
(0136)   Init_I2C();	   			  // Setup the hardware port
      D2 940E 010D CALL	_Init_I2C
      D4 C035      RJMP	0x010A
(0137)   
(0138)   while (true)
(0139)   {
(0140)     for (k=0,i=0x1050, j='A'; 1; i++,j++ )
      D5 24CC      CLR	R12
      D6 E560      LDI	R22,0x50
      D7 E170      LDI	R23,0x10
      D8 E481      LDI	R24,0x41
      D9 2EA8      MOV	R10,R24
      DA C025      RJMP	0x0100
(0141)     {
(0142)     	EEPROM_Write( 1 , i , j );
      DB 82A8      STD	Y+0,R10
      DC 019B      MOVW	R18,R22
      DD E001      LDI	R16,1
      DE DFAA      RCALL	_EEPROM_Write
(0143)     	
(0144)     	for(c=0;c<5000;c++);		  // Delay for EEPROM Write
      DF 2744      CLR	R20
      E0 2755      CLR	R21
      E1 C002      RJMP	0x00E4
      E2 5F4F      SUBI	R20,0xFF
      E3 4F5F      SBCI	R21,0xFF
      E4 3848      CPI	R20,0x88
      E5 E1E3      LDI	R30,0x13
      E6 075E      CPC	R21,R30
      E7 F3D0      BCS	0x00E2
(0145)     	
(0146)     	data = EEPROM_Read( 1, i );	  // Read device 1, memory address 1
      E8 019B      MOVW	R18,R22
      E9 E001      LDI	R16,1
      EA DFBB      RCALL	_EEPROM_Read
      EB 8309      STD	Y+1,R16
(0147)     	bf[k++] =data;
      EC 2C2C      MOV	R2,R12
      ED 2433      CLR	R3
      EE 2D82      MOV	R24,R2
      EF 5F8F      SUBI	R24,0xFF
      F0 2EC8      MOV	R12,R24
      F1 E080      LDI	R24,0
      F2 E092      LDI	R25,2
      F3 2DE2      MOV	R30,R2
      F4 27FF      CLR	R31
      F5 0FE8      ADD	R30,R24
      F6 1FF9      ADC	R31,R25
      F7 2E20      MOV	R2,R16
      F8 8220      STD	Z+0,R2
(0148)     	if (j=='Z') break;
      F9 2D8A      MOV	R24,R10
      FA 358A      CPI	R24,0x5A
      FB F409      BNE	0x00FD
      FC C004      RJMP	0x0101
      FD 5F6F      SUBI	R22,0xFF
      FE 4F7F      SBCI	R23,0xFF
      FF 94A3      INC	R10
     100 CFDA      RJMP	0x00DB
(0149)     	
(0150)     }
(0151)     
(0152)     for(c=0;c<5000;c++);		  // Delay for EEPROM Write
     101 2744      CLR	R20
     102 2755      CLR	R21
     103 C002      RJMP	0x0106
     104 5F4F      SUBI	R20,0xFF
     105 4F5F      SBCI	R21,0xFF
     106 3848      CPI	R20,0x88
     107 E1E3      LDI	R30,0x13
     108 075E      CPC	R21,R30
     109 F3D0      BCS	0x0104
     10A CFCA      RJMP	0x00D5
     10B 9622      ADIW	R28,2
     10C 9508      RET
FILE: E:\MyWorks\SOFT\I2C_E2PROM\I2C.c
(0001) // ***************     I2C driver V 1.0    ***************
(0002) // ***           Written By P. Fletcher-Jones          ***
(0003) // ***                Written on 16/11/01			   ***
(0004) // ***                 Last MOD 21/11/01			   ***
(0005) // ***       Compiled using ImageCraft C Comiler       ***
(0006) // *******************************************************
(0007) 
(0008) #include <iom1281v.h>
(0009) #include <MACROS.h>
(0010) 
(0011) #include "DC_Defines.h"
(0012) 
(0013) 
(0014) #include "I2C.h"
(0015) 
(0016) 
(0017) // ******************************************** //
(0018) // *** This routine will setup the I2C Port *** //
(0019) // ******************************************** //
(0020) 
(0021) void Init_I2C(void)
(0022) {
(0023)  SETBIT(I2C_DIR,SCL);   	   // Set SCL to output	
_Init_I2C:
     10D 9A50      SBI	0x0A,0
(0024)  SETBIT(I2C_DIR,SDA );	   // Set SDA to output
     10E 9A51      SBI	0x0A,1
(0025) 	
(0026)  SETBIT(I2C_PORT,SCL);		   // Set SCL high
     10F 9A58      SBI	0x0B,0
(0027)  SETBIT(I2C_PORT,SDA );		   // Set SDA high
     110 9A59      SBI	0x0B,1
     111 9508      RET
(0028) }
(0029) 
(0030) 
(0031) 
(0032) // ************************************************ //
(0033) // *** This routine will send the I2C Start Bit *** //
(0034) // ************************************************ //
(0035) 
(0036) void I2C_Start (void)
(0037) {
(0038)  SETBIT(I2C_PORT,SCL);				// Set SCL High
_I2C_Start:
     112 9A58      SBI	0x0B,0
(0039)  SETBIT(I2C_PORT,SDA);				// Set SDA High
     113 9A59      SBI	0x0B,1
(0040)  

⌨️ 快捷键说明

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