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

📄 interru.c

📁 好东西与大家分享……关于单片机驱动微型打印机和液晶屏的程序!!已经测试过!绝对没有问题
💻 C
字号:
#include <head.h> // SFR declarations
/*
void Timer2_ISR (void) interrupt 5
{
     TF2    = 0;
}
*/
void SMBUS_ISR (void) interrupt 7
{
	switch (SMB0STA) // Status code for the SMBus 
	{
      	// 起始条件已发出,典型操作:
		// 将从地址+R/W装入到SMB0DAT,STA=0                                    
		case SMB_START://0x08
			if(StartReadflag)
			{
				SMB0DAT = 0xa3;      		// read
			}
			else	SMB0DAT = 0xa2;     	// write
			STA = 0;                        // Manually clear STA bit
			SI = 0;                         // Clear interrupt flag
		   	break;
		// 重复起始条件已发出,典型操作:
		// 将从地址+R/W装入到SMB0DAT,STA=0
      	case SMB_RP_START://0x10
         	if(StartReadflag)
			{	SMB0DAT = 0xa3;  }
			else	SMB0DAT = 0xa2;      	// write
			STA = 0;                        // Manually clear START bit.
			SI = 0;
			break;
		// 从地址+W 已发出,收到ACK,典型操作:
		// 将要发送的数据装入SMB0DAT
      	case SMB_MTADDACK://0x18
			if(RWflag == I2CREAD)
			{	SMB0DAT = 0x00;	} 			// 从地址0x00开始读
			if(RWflag == I2CWRITE)
			{	PcfPoint =0;SMB0DAT = 0x00;}// 从地址0x00开始写
		   	SI = 0;                         // Clear interrupt flag
         	break;
      	// 从地址+W 已发出,收到NACK,典型操作:
		// 确认查询重试,置位STO+STA
      	case SMB_MTADDNACK://0x20
			STO = 1;
			//	delay(2000);
			STA = 1;
			SI = 0;                         // Clear interrupt flag
			break;
		// 数据字节已发出,收到ACK,典型操作:将下一字节装入到
		// SMB0DAT,或置位STO,或置位STA,以发送重复起始条件
      	case SMB_MTDBACK://0x28
			if(RWflag == I2CREAD)
			{
				STO = 1;
				delay(100);
				STA = 1;
				PcfPoint = 0;
				StartReadflag = 1;
			}
			else if(PcfPoint == 0x10)
			{ 
				RWflag = I2CREAD; // read
				STO = 1;
				delay(100);
				STA = 1;
				PcfPoint = 0;
			}
			else
			{
				SMB0DAT = Pcf8563.Time[PcfPoint++];
			}
			SI = 0;
			break;
		// 数据字节已发出,收到NACK,典型操作:重试传输或置位STO
		case SMB_MTDBNACK://0x30
			STO = 1;
			delay(100);
			STA = 1;
			SI = 0;                          // Clear interrupt flag
			break;
		// 竞争失败,典型操作:保存当前数据
		case SMB_MTARBLOST://0x38
         	SI = 0;                          // Clear interrupt flag
         	break;
		// 从地址+R已发出,收到ACK,典型操作:如果只接收一个字节,
		// 清AA位(收到字节后发送NACK),等待接收数据
		case SMB_MRADDACK://0x40
         	PcfPoint = 0x00;                     // NACK sent during acknowledge cycle.
         	SI = 0;
         	break;
		// 从地址+R已发出,收到NACK,典型操作:确认查询重试,
		// 置位STO+STA
      	case SMB_MRADDNACK://0x48
         	STO = 1;
		//	delay(2000);
			STA = 1;
			SI = 0;
			break;
		// 数据字节已收到,ACK已发出,典型操作:读SMB0DAT,
		// 等待下一字节,若下一字节是最后字节,清楚AA
      	case SMB_MRDBACK://0x50
			Pcf8563.Time[PcfPoint++] = SMB0DAT;
			if(PcfPoint == 0x0f)
			{ AA = 0;PcfPoint = 0;StartReadflag = 0;}
         	SI = 0;
         	break;
		// 数据字节已收到,NACK已发出,典型操作:置位STO
 		case SMB_MRDBNACK://0x58
			STO = 1;
			Pcf8563.Time[0x0f] = SMB0DAT;
			Readoverflag = 1;					// 已经读完
			AA = 1;                          // Set AA for next transfer
			SI = 0;
         	break;
		default:
			SI = 0;
			break;
	}
}

⌨️ 快捷键说明

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