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

📄 i2c.lst

📁 主要介绍日历时钟的编程和注意的事项.主要应用于单片机8051.
💻 LST
📖 第 1 页 / 共 2 页
字号:
 165   1      	val1=_cror_(val1,1);
 166   1      	return val1;
 167   1      }
 168          
 169          
 170          void Delay1ms(unsigned char T);
 171          
 172          void I2c_init(void )
 173          {
 174   1        unsigned char  var ;
 175   1          P0MDOUT |= 0x1D; 
 176   1          P1MDOUT |= 0x01; 
 177   1      	
 178   1      	SMB0CN = 0x44;									// Enable SMBus with ACKs on acknowledge cycle
 179   1      	SMB0CR = -80;									// SMBus clock rate = 100kHz.
C51 COMPILER V6.12  I2C                                                                    05/24/2006 15:23:18 PAGE 4   

 180   1      
 181   1      	EIE1 |= 2;										// SMBus interrupt enable
 182   1      	EA = 1;											// Global interrupt enable
 183   1      
 184   1      	SM_BUSY = 0;
 185   1      										// Free SMBus for first transfer.
 186   1      	var = GetRealClockStatus();
 187   1      	ResetRealClock();
 188   1      	var = GetRealClockStatus();
 189   1      	SetRealClockStatus(0xc2);
 190   1      	var = GetRealClockStatus();
 191   1      	GetRealClock();
 192   1      	RealTime.RT.Year=0x02;	
 193   1      	RealTime.RT.Month=0x12;	
 194   1      	RealTime.RT.Day=0x010;	
 195   1      	RealTime.RT.Week=0x05;	
 196   1      	RealTime.RT.Hour=0x12;	
 197   1      	RealTime.RT.Minute=0x59;	
 198   1      	RealTime.RT.Second=0x58;
 199   1      	SetRealClock();
 200   1      	}
 201          
 202          void TestI2C (void)
 203          {
 204   1       char year,month,day,week,hour,minute,second ;
 205   1      
 206   1      
 207   1      		
 208   1      		Delay1ms(100);	
 209   1      		Delay1ms(100);	
 210   1      		Delay1ms(100);	
 211   1      		Delay1ms(100);	
 212   1      		Delay1ms(100);	
 213   1      		Delay1ms(100);
 214   1      		Delay1ms(100);	
 215   1      		Delay1ms(100);	
 216   1      		Delay1ms(100);		
 217   1      			
 218   1      	GetRealClock();
 219   1      
 220   1          year=RealTime.RT.Year;	
 221   1      	month=RealTime.RT.Month;	
 222   1      	day=RealTime.RT.Day;	
 223   1      	week=RealTime.RT.Week;	
 224   1      	hour=RealTime.RT.Hour&0x1f;	
 225   1      	minute=RealTime.RT.Minute;	
 226   1      	second=RealTime.RT.Second;	
 227   1      
 228   1      	
 229   1      }
 230          
 231          
 232          //------------------------------------------------------------------------------------
 233          // Interrupt Service Routine
 234          //------------------------------------------------------------------------------------
 235          void SMBUS_ISR (void) interrupt 7
 236          {
 237   1      	switch (SMB0STA)
 238   1      		{ 	// SMBus 状态码SMB0STA 寄存器
 239   2      			// 主发送器/接收器起始条件已发送
 240   2      		case SMB_START:
 241   2      			SMB0DAT = COMMAND ; // 装入要访问的从器件的地址
C51 COMPILER V6.12  I2C                                                                    05/24/2006 15:23:18 PAGE 5   

 242   2      			STA = 0; 			// 手动清除START 位
 243   2      			break;
 244   2      			//主发送器/接收器重复起始条件已发送
 245   2      			// 该状态只应在读操作期间出现在存储器地址已发送并得到确认之后 ?
 246   2      		case SMB_RP_START:
 247   2      			SMB0DAT = COMMAND; // COMMAND 中应保持从地址 + R.
 248   2      			STA = 0;
 249   2      			break;
 250   2      			// 主发送器从地址 + WRITE 已发送收到ACK
 251   2      		case SMB_MTADDACK:
 252   2      			// 主发送器数据字节已发送收到ACK
 253   2      		case SMB_MTDBACK:
 254   2      			if (BYTE_NUMBER)
 255   2      			{
 256   3      					SMB0DAT = revolve(*I2CDataBuff);					// If R/W=WRITE, load byte to write.
 257   3      					I2CDataBuff++;
 258   3      					BYTE_NUMBER--;			
 259   3      			}
 260   2      			else
 261   2      			{
 262   3      				STO = 1;	SM_BUSY = 0;						// Free SMBus
 263   3      			}
 264   2      			break;
 265   2      			// 主发送器从地址 + WRITE 已发送收到NACK
 266   2      			// 从器件不应答发送STOP + START 重试
 267   2      		case SMB_MTADDNACK:
 268   2      			STO = 1;			STA = 1;
 269   2      		break;
 270   2      			// 主发送器数据字节已发送收到NACK
 271   2      			// 从器件不应答发送STOP + START 重试
 272   2      		case SMB_MTDBNACK:
 273   2      			STO = 1;			STA = 1;
 274   2      		break;
 275   2      			// 主发送器竞争失败
 276   2      			// 不应出现如果出现重新开始传输过程
 277   2      		case SMB_MTARBLOST:
 278   2      			STO = 1;			STA = 1;
 279   2      		break;
 280   2      
 281   2      			// 主接收器从地址 + READ 已发送,收到ACK
 282   2      		case SMB_MRADDACK:
 283   2      			AA = 1; // 在应答周期ACK
 284   2      			if (!BYTE_NUMBER)
 285   2      			{	
 286   3      				STO = 1;	SM_BUSY = 0; // 释放SMBus
 287   3      			}
 288   2      		break;
 289   2      			// 主接收器从地址 + READ 已发送收到NACK
 290   2      			// 从器件不应答发送重复起始条件重试
 291   2      		case SMB_MRADDNACK:
 292   2      			STA = 1;
 293   2      		break;
 294   2      			// 收到数据字节ACK 已发送
 295   2      			// 该状态不应出现因为AA 已在前一状态被清0 如果出现发送停止条件
 296   2      		case SMB_MRDBACK:
 297   2      			if (BYTE_NUMBER)
 298   2      			{
 299   3      				*I2CDataBuff=revolve(SMB0DAT);		
 300   3      				I2CDataBuff++;
 301   3      				BYTE_NUMBER--;			
 302   3      			}
 303   2      			if (!BYTE_NUMBER)	AA= 0;
C51 COMPILER V6.12  I2C                                                                    05/24/2006 15:23:18 PAGE 6   

 304   2      		break;
 305   2      			// 收到数据字节NACK 已发送
 306   2      			// 读操作已完成读数据寄存器后发送停止条件
 307   2      		case SMB_MRDBNACK:
 308   2      			STO = 1;
 309   2      			SM_BUSY = 0; // 释放SMBus
 310   2      		break;
 311   2      			// 在本应用中所有其它状态码没有意义通信复位
 312   2      		default:
 313   2      			STO = 1; // 通信复位
 314   2      			SM_BUSY = 0; 
 315   2      		break;
 316   2      		}
 317   1      	SI=0; // 清除中断标志
 318   1      }
 319          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    576    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14       9
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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