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

📄 i2ce2prom.lst

📁 本人改编和测试过的用于AVR mega128关于I2C总线的应用实例--使用EEPROM的读写方法。采用ICCAVR编译器实验。
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0041)  SETBIT(I2C_DIR,SDA);   		   // Set SDA to output	
     114 9A51      SBI	0x0A,1
(0042)  CLEARBIT(I2C_PORT,SDA);		   // Clear SDA
     115 9859      CBI	0x0B,1
     116 9508      RET
(0043) }
(0044) 
(0045) 
(0046) // *********************************************** //
(0047) // *** This routine will send the I2C Stop Bit *** //
(0048) // *********************************************** //
(0049) 
(0050) void I2C_Stop (void)
(0051) {
(0052)  
(0053)  SETBIT(I2C_DIR,SDA);   		   // Set SDA to output
_I2C_Stop:
     117 9A51      SBI	0x0A,1
(0054) 	
(0055)  CLEARBIT(I2C_PORT,SCL);		   // Clear SCL
     118 9858      CBI	0x0B,0
(0056)  CLEARBIT(I2C_PORT,SDA);		   // Clear SDA
     119 9859      CBI	0x0B,1
(0057)  
(0058)  SETBIT(I2C_PORT,SCL);			   // Set SCL High
     11A 9A58      SBI	0x0B,0
(0059)  SETBIT(I2C_PORT,SDA);			   // Set SDA High
     11B 9A59      SBI	0x0B,1
     11C 9508      RET
(0060) }
(0061) 
(0062) 
(0063) 
(0064) 
(0065) 
(0066) // ************************************************** //
(0067) // *** This routine will send the I2C clock pulse *** //
(0068) // ************************************************** //
(0069) 
(0070) void I2C_Clock (void)
(0071) {
(0072)  SETBIT(I2C_PORT,SCL);				// Set SCL high
_I2C_Clock:
     11D 9A58      SBI	0x0B,0
(0073)  NOP();								// Small Delay
     11E 0000      NOP
(0074)  CLEARBIT(I2C_PORT,SCL);			// Set SCL low
     11F 9858      CBI	0x0B,0
     120 9508      RET
_Write_I2C_Byte:
  i                    --> R20
  byte                 --> R22
     121 934A      ST	R20,-Y
     122 936A      ST	R22,-Y
     123 2F60      MOV	R22,R16
(0075) }
(0076) 
(0077) 
(0078) 
(0079) 
(0080) // ******************************************************** //
(0081) // *** This routine will write a byte to the I2C device *** //
(0082) // ******************************************************** //
(0083) 
(0084) void Write_I2C_Byte(unsigned char byte)
(0085) {
(0086)  unsigned char i;
(0087) 
(0088)  SETBIT(I2C_DIR,SDA);   		   // Set SDA to output	
     124 9A51      SBI	0x0A,1
(0089)  CLEARBIT(I2C_PORT,SCL);
     125 9858      CBI	0x0B,0
(0090)  	
(0091)  for (i = 0; i < 8; i++){  		 // Loop for our 8 bits
     126 2744      CLR	R20
     127 C00B      RJMP	0x0133
(0092)  
(0093) 	// Set or Clear SDA pin
(0094) 	 if((byte & 0x80) == 0x80) SETBIT(I2C_PORT, SDA);	// Set I2C SDA PIN
     128 2F86      MOV	R24,R22
     129 7880      ANDI	R24,0x80
     12A 3880      CPI	R24,0x80
     12B F411      BNE	0x012E
     12C 9A59      SBI	0x0B,1
     12D C001      RJMP	0x012F
(0095) 	 else CLEARBIT(I2C_PORT,SDA);		  				// Clear I2C SDA PIN
     12E 9859      CBI	0x0B,1
(0096) 	 
(0097) 	 SETBIT(I2C_PORT,SCL);			   // Set SCL High, Clock data
     12F 9A58      SBI	0x0B,0
(0098) 
(0099) 	 byte = byte << 1;				   // Shift data in buffer right one
     130 0F66      LSL	R22
(0100) 	
(0101)      CLEARBIT(I2C_PORT,SCL);		   // Clear SCL
     131 9858      CBI	0x0B,0
     132 9543      INC	R20
     133 3048      CPI	R20,0x8
     134 F398      BCS	0x0128
(0102) 	}
(0103) 
(0104) 	
(0105)  while(I2C_Ackn() );				   // Check for acknowledge from I2C device	
     135 D019      RCALL	_I2C_Ackn
     136 2300      TST	R16
     137 F7E9      BNE	0x0135
     138 9169      LD	R22,Y+
     139 9149      LD	R20,Y+
     13A 9508      RET
_Read_I2C_Byte:
  i                    --> R22
  buff                 --> R20
     13B 934A      ST	R20,-Y
     13C 936A      ST	R22,-Y
(0106) }
(0107) 
(0108) 
(0109) 
(0110) 
(0111) 
(0112) // ********************************************************* //
(0113) // *** This routine will read a byte from the I2C device *** //
(0114) // ********************************************************* //
(0115) 
(0116) unsigned char Read_I2C_Byte(void)
(0117) {	
(0118)  unsigned char i,buff = 0;
     13D 2744      CLR	R20
(0119) 	
(0120) 	for (i = 0; i < 8; i++){
     13E 2766      CLR	R22
     13F C008      RJMP	0x0148
(0121) 	
(0122) 		buff = buff << 1;
     140 0F44      LSL	R20
(0123) 		
(0124)  		CLEARBIT(I2C_DIR,SDA);   		   // Set SDA to input
     141 9851      CBI	0x0A,1
(0125) 		
(0126) 		SETBIT(I2C_PORT,SCL);	  	  	   // Set SCL High,Clock bit out
     142 9A58      SBI	0x0B,0
(0127) 	
(0128) 		// Read data on SDA pin
(0129) 		if ( CHECKBIT( I2C_IN,SDA ) ) buff = buff | 0x01;	
     143 9B49      SBIS	0x09,1
     144 C001      RJMP	0x0146
     145 6041      ORI	R20,1
(0130) 		
(0131) 		CLEARBIT(I2C_PORT,SCL);	  	  	   // Clear SCL 	
     146 9858      CBI	0x0B,0
     147 9563      INC	R22
     148 3068      CPI	R22,0x8
     149 F3B0      BCS	0x0140
(0132)         }
(0133) 
(0134)  // *** No ACK *** //
(0135)  
(0136)  I2C_Clock();						       // Clock I2C bit
     14A DFD2      RCALL	_I2C_Clock
(0137) 	
(0138)  return buff;							   // Return our I2C byte
     14B 2F04      MOV	R16,R20
     14C 9169      LD	R22,Y+
     14D 9149      LD	R20,Y+
     14E 9508      RET
(0139) }
(0140) 
(0141) 
(0142) 
(0143) 
(0144) // *********************************************************************** //
(0145) // *** This routine returns a 0 if the I2C device sends an acknowledge *** //
(0146) // *********************************************************************** //
(0147) 
(0148) unsigned char I2C_Ackn(void)
(0149) {
(0150)  unsigned char Ackn = 0;		   // Temp RAM for Ackn flag
_I2C_Ackn:
  Ackn                 --> R16
     14F 2700      CLR	R16
(0151) 	
(0152)  CLEARBIT(I2C_PORT,SCL);
     150 9858      CBI	0x0B,0
(0153)  CLEARBIT(I2C_DIR,SDA);   		   // Set SDA to input	
     151 9851      CBI	0x0A,1
(0154)  
(0155)  SETBIT(I2C_PORT,SCL);			   // Clock the ACK bit
     152 9A58      SBI	0x0B,0
(0156) 
(0157)  if ( CHECKBIT( I2C_IN,SDA ) ) Ackn = 1;	  // Check the ACK bit on SDA	
     153 9B49      SBIS	0x09,1
     154 C001      RJMP	0x0156
     155 E001      LDI	R16,1
(0158)  
(0159)  CLEARBIT(I2C_PORT,SCL);	  	   // Clear the clock
     156 9858      CBI	0x0B,0
(0160) 
(0161)  return Ackn;					   // Return our ACK bit
     157 9508      RET
_Write_I2C_Control:
  RW                   --> Y,+2
  H_ADD                --> R20
  D_Code               --> R22
     158 934A      ST	R20,-Y
     159 936A      ST	R22,-Y
     15A 2F42      MOV	R20,R18
     15B 2F60      MOV	R22,R16
(0162) }	
(0163) 
(0164) 
(0165) 
(0166) 
(0167) 
(0168) // ***************************************************** //
(0169) // *** This routine will write the I2C device code,  *** //
(0170) // *** set the device chip select bits, 	   	   	 *** //
(0171) // *** and set or clear the I2C R/W bit				 *** //
(0172) // ***************************************************** //
(0173) 
(0174) void Write_I2C_Control(unsigned char D_Code,unsigned char H_ADD,unsigned char RW)
(0175) {
(0176) 
(0177)  // *** Send the I2C device Control code *** //
(0178) 
(0179)  CLEARBIT(I2C_PORT,SCL);	  	   // Clear SCL clock
     15C 9858      CBI	0x0B,0
(0180)  
(0181)  if( (D_Code & 0x08) == 0x08) SETBIT(I2C_PORT, SDA);	// Set I2C SDA PIN
     15D 2F86      MOV	R24,R22
     15E 7088      ANDI	R24,0x8
     15F 3088      CPI	R24,0x8
     160 F411      BNE	0x0163
     161 9A59      SBI	0x0B,1
     162 C001      RJMP	0x0164
(0182)  else CLEARBIT(I2C_PORT,SDA);		  					// Clear I2C SDA PIN
     163 9859      CBI	0x0B,1
(0183) 
(0184)  I2C_Clock();			// Clock I2C bit
     164 DFB8      RCALL	_I2C_Clock
(0185)  
(0186)  if( (D_Code & 0x04) == 0x04) SETBIT(I2C_PORT, SDA);	// Set I2C SDA PIN
     165 2F86      MOV	R24,R22
     166 7084      ANDI	R24,4
     167 3084      CPI	R24,4
     168 F411      BNE	0x016B
     169 9A59      SBI	0x0B,1
     16A C001      RJMP	0x016C
(0187)  else CLEARBIT(I2C_PORT,SDA);		  					// Clear I2C SDA PIN
     16B 9859      CBI	0x0B,1
(0188) 
(0189)  I2C_Clock();			// Clock I2C bit
     16C DFB0      RCALL	_I2C_Clock
(0190) 	
(0191)  if( (D_Code & 0x02) == 0x02) SETBIT(I2C_PORT, SDA);	// Set I2C SDA PIN
     16D 2F86      MOV	R24,R22
     16E 7082      ANDI	R24,2
     16F 3082      CPI	R24,2
     170 F411      BNE	0x0173
     171 9A59      SBI	0x0B,1
     172 C001      RJMP	0x0174
(0192)  else CLEARBIT(I2C_PORT,SDA);		  					// Clear I2C SDA PIN
     173 9859      CBI	0x0B,1
(0193) 
(0194)  I2C_Clock();			// Clock I2C bit
     174 DFA8      RCALL	_I2C_Clock
(0195)  
(0196)  if( (D_Code & 0x01) == 0x01) SETBIT(I2C_PORT, SDA);	// Set I2C SDA PIN
     175 2F86      MOV	R24,R22
     176 7081      ANDI	R24,1
     177 3081      CPI	R24,1
     178 F411      BNE	0x017B
     179 9A59      SBI	0x0B,1
     17A C001      RJMP	0x017C
(0197)  else CLEARBIT(I2C_PORT,SDA);		  					// Clear I2C SDA PIN
     17B 9859      CBI	0x0B,1
(0198) 
(0199)  I2C_Clock();			// Clock I2C bit
     17C DFA0      RCALL	_I2C_Clock
(0200) 
(0201)  
(0202)  
(0203)  // *** Send the I2C Control byte chip selects bits *** //
(0204) 
(0205)  if( (H_ADD & 0x04) == 0x04) SETBIT(I2C_PORT, SDA);		// Set I2C SDA PIN
     17D 2F84      MOV	R24,R20
     17E 7084      ANDI	R24,4
     17F 3084      CPI	R24,4
     180 F411      BNE	0x0183
     181 9A59      SBI	0x0B,1
     182 C001      RJMP	0x0184
(0206)  else CLEARBIT(I2C_PORT,SDA);		  					// Clear I2C SDA PIN
     183 9859      CBI	0x0B,1
(0207) 
(0208)  I2C_Clock();			// Clock I2C bit
     184 DF98      RCALL	_I2C_Clock
(0209) 	
(0210)  if( (H_ADD & 0x02) == 0x02) SETBIT(I2C_PORT, SDA);		// Set I2C SDA PIN
     185 2F84      MOV	R24,R20
     186 7082      ANDI	R24,2
     187 3082      CPI	R24,2
     188 F411      BNE	0x018B
     189 9A59      SBI	0x0B,1
     18A C001      RJMP	0x018C
(0211)  else CLEARBIT(I2C_PORT,SDA);		  					// Clear I2C SDA PIN
     18B 9859      CBI	0x0B,1
(0212) 
(0213)  I2C_Clock();			// Clock I2C bit
     18C DF90      RCALL	_I2C_Clock
(0214)  
(0215)  if( (H_ADD & 0x01) == 0x01) SETBIT(I2C_PORT, SDA);		// Set I2C SDA PIN
     18D 2F84      MOV	R24,R20
     18E 7081      ANDI	R24,1
     18F 3081      CPI	R24,1
     190 F411      BNE	0x0193
     191 9A59      SBI	0x0B,1
     192 C001      RJMP	0x0194
(0216)  else CLEARBIT(I2C_PORT,SDA);		  					// Clear I2C SDA PIN
     193 9859      CBI	0x0B,1
(0217) 
(0218)  I2C_Clock();			// Clock I2C bit
     194 DF88      RCALL	_I2C_Clock
(0219)  
(0220)  // *** Set or Clear the read / write bit for I2C control *** //
(0221) 	
(0222)  if(RW) SETBIT(I2C_PORT,SDA);		  	  	  		 	 // Set I2C SDA PIN
     195 800A      LDD	R0,Y+2
     196 2000      TST	R0
     197 F011      BEQ	0x019A
     198 9A59      SBI	0x0B,1
     199 C001      RJMP	0x019B
(0223)  else CLEARBIT(I2C_PORT,SDA);							 // Clear I2C SDA PIN
     19A 9859      CBI	0x0B,1
(0224)  
(0225)  I2C_Clock();			// Clock I2C bit
     19B DF81      RCALL	_I2C_Clock
(0226)  
(0227)  while(I2C_Ackn() );				   // Check for acknowledge from I2C device
FILE: <library>
     19C DFB2      RCALL	_I2C_Ackn
     19D 2300      TST	R16
     19E F7E9      BNE	0x019C
     19F 9169      LD	R22,Y+
     1A0 9149      LD	R20,Y+
     1A1 9508      RET
pop_xgset003C:
     1A2 90A9      LD	R10,Y+
     1A3 90B9      LD	R11,Y+
     1A4 90C9      LD	R12,Y+
     1A5 90D9      LD	R13,Y+
     1A6 9508      RET
push_xgsetF0FC:
     1A7 937A      ST	R23,-Y
     1A8 936A      ST	R22,-Y
push_xgset30FC:
     1A9 935A      ST	R21,-Y
     1AA 934A      ST	R20,-Y
push_xgset00FC:
     1AB 92FA      ST	R15,-Y
     1AC 92EA      ST	R14,-Y
push_xgset003C:
     1AD 92DA      ST	R13,-Y
     1AE 92CA      ST	R12,-Y
     1AF 92BA      ST	R11,-Y
     1B0 92AA      ST	R10,-Y
     1B1 9508      RET

⌨️ 快捷键说明

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