亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? i2c.c

?? 這是新華龍(www.xhl.xom.xn)開發(fā)的
?? C
字號:
#include <c8051f020.h>					// SFR declarations

//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------

#define 	WRITE	0x00						// SMBus WRITE command
#define		READ 	0x01						// SMBus READ command

// Device addresses (7 bits, lsb is a don't care)
#define		CLOCK3530_ADDRESS_RESET		0x60		//1 ack
#define		CLOCK3530_ADDRESS_STATUS	0x62		//2 ack
#define		CLOCK3530_ADDRESS_DATEHOUR	0x64		//8 ack  year month day week hour minute second
#define		CLOCK3530_ADDRESS_HOUR		0x66		//4 ack  hour minute second
#define		CLOCK3530_ADDRESS_INT1		0x68		//3 ack  
#define		CLOCK3530_ADDRESS_INT2		0x6A		//3 ack  

union 
{
unsigned char ClockString[7];
struct RealClock
	{
		unsigned char Year,Month,Day,Week,Hour,Minute,Second;
	} RT;
} RealTime;


// SMBus states:
// MT = Master Transmitter
// MR = Master Receiver
#define	SMB_BUS_ERROR	0x00			// (all modes) BUS ERROR
#define	SMB_START		0x08			// (MT & MR) START transmitted
#define	SMB_RP_START	0x10			// (MT & MR) repeated START
#define	SMB_MTADDACK	0x18			// (MT) Slave address + W transmitted;
										//  ACK received
#define	SMB_MTADDNACK	0x20			// (MT) Slave address + W transmitted;
										//  NACK received
#define	SMB_MTDBACK		0x28			// (MT) data byte transmitted; ACK rec'vd
#define	SMB_MTDBNACK	0x30			// (MT) data byte transmitted; NACK rec'vd
#define	SMB_MTARBLOST	0x38			// (MT) arbitration lost
#define	SMB_MRADDACK	0x40			// (MR) Slave address + R transmitted;
										//  ACK received
#define	SMB_MRADDNACK	0x48			// (MR) Slave address + R transmitted;
										//  NACK received
#define	SMB_MRDBACK		0x50			// (MR) data byte rec'vd; ACK transmitted
#define	SMB_MRDBNACK	0x58			// (MR) data byte rec'vd; NACK transmitted


//-----------------------------------------------------------------------------------
//Global VARIABLES
//-----------------------------------------------------------------------------------
char COMMAND;			// Holds the slave address + R/W bit for use in the SMBus ISR.

unsigned char *I2CDataBuff;						

char BYTE_NUMBER;							// Used by ISR to check what data has just been
												// sent - High address byte, Low byte, or data byte

unsigned char HIGH_ADD, LOW_ADD;		// High & Low byte for EEPROM memory address
				
bit SM_BUSY;								// This bit is set when a send or receive
												// is started. It is cleared by the
												// ISR when the operation is finished.


//------------------------------------------------------------------------------------
// Function PROTOTYPES
//------------------------------------------------------------------------------------

void SMBus_ISR (void);								

//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
//
// Main routine configures the crossbar and SMBus, and tests
// the SMBus interface between the three EEPROMs


void ResetRealClock(void)
{
	while (SM_BUSY);									// Wait for SMBus to be free.
	SM_BUSY = 1;										// Occupy SMBus (set to busy)
	SMB0CN = 0x44;										// SMBus enabled, ACK on acknowledge cycle
	BYTE_NUMBER = 0;									// 2 address bytes.
	COMMAND = (CLOCK3530_ADDRESS_RESET | READ);		// Chip select + READ
	STA = 1;											// Start transfer
	while (SM_BUSY);									// Wait for transfer to finish
}

//======================寫S-3530A內(nèi)部實(shí)時(shí)數(shù)據(jù)寄存器程序=====================
//功能:將設(shè)定年、月、日、星期、時(shí)、分、秒數(shù)據(jù)寫入S-3530A                  |
//入口:發(fā)送數(shù)據(jù)放在年、月、日、星期、時(shí)、分、秒各寄存器                   |
//出口:NONE                                                               |
//==========================================================================
void SetRealClock(void)
{
	while (SM_BUSY);									// Wait for SMBus to be free.
	SM_BUSY = 1;										// Occupy SMBus (set to busy)
	SMB0CN = 0x44;										// SMBus enabled, ACK on acknowledge cycle
	BYTE_NUMBER = 7;									// 2 address bytes.
	COMMAND = (CLOCK3530_ADDRESS_DATEHOUR | WRITE);		// Chip select + WRITE
	I2CDataBuff = &RealTime.ClockString[0];				// Data to be writen
	STA = 1;
	while (SM_BUSY);											// Start transfer
}

//==================讀S-3530A實(shí)時(shí)數(shù)據(jù)寄存器子程序===========================
//功能:從S-3530A讀入當(dāng)前時(shí)間數(shù)據(jù)                                          |
//入口:NONE                                                               |
//出口:接收數(shù)據(jù)放在年、月、日、星期、時(shí)、分、秒各寄存器                   |
//==========================================================================
void GetRealClock(void)
{
	while (SM_BUSY);									// Wait for SMBus to be free.
	SM_BUSY = 1;										// Occupy SMBus (set to busy)
	SMB0CN = 0x44;										// SMBus enabled, ACK on acknowledge cycle
	BYTE_NUMBER = 7;									// 2 address bytes.
	COMMAND = (CLOCK3530_ADDRESS_DATEHOUR | READ);		// Chip select + READ
	I2CDataBuff = &RealTime.ClockString[0];				// Data to be writen
	STA = 1;											// Start transfer
	while (SM_BUSY);									// Wait for transfer to finish
}

//============================寫狀態(tài)寄存器程序==============================
//功能:讀/寫S-3530A狀態(tài)寄存器,對S-3530A進(jìn)行設(shè)置                          |
//入口:NONE           出口:NONE                                          |
//==========================================================================
unsigned char  GetRealClockStatus(void)
{
	unsigned char result; 
	while (SM_BUSY);									// Wait for SMBus to be free.
	SM_BUSY = 1;										// Occupy SMBus (set to busy)
	SMB0CN = 0x44;										// SMBus enabled, ACK on acknowledge cycle
	BYTE_NUMBER = 1;									
	COMMAND = (CLOCK3530_ADDRESS_STATUS | READ);		
	I2CDataBuff = &result;								
	STA = 1;											// Start transfer
	while (SM_BUSY);									// Wait for transfer to finish
	return result;
}
void SetRealClockStatus(unsigned char status)
{
	while (SM_BUSY);									// Wait for SMBus to be free.
	SM_BUSY = 1;										// Occupy SMBus (set to busy)
	SMB0CN = 0x44;										// SMBus enabled, ACK on acknowledge cycle
	BYTE_NUMBER = 1;									
	COMMAND = (CLOCK3530_ADDRESS_STATUS | WRITE);		
	I2CDataBuff = &status;								
	STA = 1;											// Start transfer
}
/*
void  SetRealClockINT1(unsigned int Int1)
{
	while (SM_BUSY);									// Wait for SMBus to be free.
	SM_BUSY = 1;										// Occupy SMBus (set to busy)
	SMB0CN = 0x44;										// SMBus enabled, ACK on acknowledge cycle
	BYTE_NUMBER = 2;									
	COMMAND = (CLOCK3530_ADDRESS_INT1 | WRITE);		
	I2CDataBuff = (unsigned char*)&Int1;								
	STA = 1;											// Start transfer
}
*/
#include "INTRINS.H"

unsigned char revolve(unsigned char val)
{
char i;
unsigned char val1=0;
	for (i=0;i<8;i++)
	{
		if (val&0x1)
			val1++;
		val1=_crol_(val1,1);
		val=_cror_(val,1);
	}
	val1=_cror_(val1,1);
	return val1;
}

void TestI2C (void)
{
unsigned char var ;
	WDTCN = 0xde;									// disable watchdog timer
	WDTCN = 0xad;
	
	OSCICN |= 0x03;								// Set internal oscillator to highest setting
														// (16 MHz)

	XBR0 |= 0x07;									// Route SMBus to GPIO pins through crossbar
	XBR2 |= 0x44;									// Enable crossbar and weak pull-ups

    P0MDOUT |= 0x1D; 
    P1MDOUT |= 0x01; 
	
	SMB0CN = 0x44;									// Enable SMBus with ACKs on acknowledge cycle
	SMB0CR = -80;									// SMBus clock rate = 100kHz.

	EIE1 |= 2;										// SMBus interrupt enable
	EA = 1;											// Global interrupt enable

	SM_BUSY = 0;									// Free SMBus for first transfer.

//	SetRealClockINT1(0x8000);
	var = GetRealClockStatus();
	ResetRealClock();
	var = GetRealClockStatus();
	SetRealClockStatus(0x82);
	var = GetRealClockStatus();
	RealTime.RT.Year=0x02;	
	RealTime.RT.Month=0x06;	
	RealTime.RT.Day=0x05;	
	RealTime.RT.Week=0x02;	
	RealTime.RT.Hour=0x11;	
	RealTime.RT.Minute=0x14;	
	RealTime.RT.Second=0x45;	
	SetRealClock();
	RealTime.RT.Year=0x0;	
	RealTime.RT.Month=0x0;	
	RealTime.RT.Day=0x0;	
	RealTime.RT.Week=0x0;	
	RealTime.RT.Hour=0x0;	
	RealTime.RT.Minute=0x0;	
	RealTime.RT.Second=0x0;	
	GetRealClock();
/*	RealTime.RT.Year=0x02;	
	RealTime.RT.Month=0x06;	
	RealTime.RT.Day=0x05;	
	RealTime.RT.Week=0x02;	
	RealTime.RT.Hour=0x11;	
	RealTime.RT.Minute=0x14;	
	RealTime.RT.Second=0x45;	
*/	SetRealClock();
	GetRealClock();
	GetRealClock();
	GetRealClock();
	GetRealClock();
}


//------------------------------------------------------------------------------------
// Interrupt Service Routine
//------------------------------------------------------------------------------------
void SMBUS_ISR (void) interrupt 7
{
	switch (SMB0STA)
		{ 	// SMBus 狀態(tài)碼SMB0STA 寄存器
			// 主發(fā)送器/接收器起始條件已發(fā)送
		case SMB_START:
			SMB0DAT = COMMAND ; // 裝入要訪問的從器件的地址
			STA = 0; 			// 手動(dòng)清除START 位
			break;
			//主發(fā)送器/接收器重復(fù)起始條件已發(fā)送
			// 該狀態(tài)只應(yīng)在讀操作期間出現(xiàn)在存儲(chǔ)器地址已發(fā)送并得到確認(rèn)之后 ?
		case SMB_RP_START:
			SMB0DAT = COMMAND; // COMMAND 中應(yīng)保持從地址 + R.
			STA = 0;
			break;
			// 主發(fā)送器從地址 + WRITE 已發(fā)送收到ACK
		case SMB_MTADDACK:
			// 主發(fā)送器數(shù)據(jù)字節(jié)已發(fā)送收到ACK
		case SMB_MTDBACK:
			if (BYTE_NUMBER)
			{
					SMB0DAT = revolve(*I2CDataBuff);					// If R/W=WRITE, load byte to write.
					I2CDataBuff++;
					BYTE_NUMBER--;			
			}
			else
			{
				STO = 1;	SM_BUSY = 0;						// Free SMBus
			}
			break;
			// 主發(fā)送器從地址 + WRITE 已發(fā)送收到NACK
			// 從器件不應(yīng)答發(fā)送STOP + START 重試
		case SMB_MTADDNACK:
			STO = 1;			STA = 1;
		break;
			// 主發(fā)送器數(shù)據(jù)字節(jié)已發(fā)送收到NACK
			// 從器件不應(yīng)答發(fā)送STOP + START 重試
		case SMB_MTDBNACK:
			STO = 1;			STA = 1;
		break;
			// 主發(fā)送器競爭失敗
			// 不應(yīng)出現(xiàn)如果出現(xiàn)重新開始傳輸過程
		case SMB_MTARBLOST:
			STO = 1;			STA = 1;
		break;

			// 主接收器從地址 + READ 已發(fā)送,收到ACK
		case SMB_MRADDACK:
			AA = 1; // 在應(yīng)答周期ACK
			if (!BYTE_NUMBER)
			{	
				STO = 1;	SM_BUSY = 0; // 釋放SMBus
			}
		break;
			// 主接收器從地址 + READ 已發(fā)送收到NACK
			// 從器件不應(yīng)答發(fā)送重復(fù)起始條件重試
		case SMB_MRADDNACK:
			STA = 1;
		break;
			// 收到數(shù)據(jù)字節(jié)ACK 已發(fā)送
			// 該狀態(tài)不應(yīng)出現(xiàn)因?yàn)锳A 已在前一狀態(tài)被清0 如果出現(xiàn)發(fā)送停止條件
		case SMB_MRDBACK:
			if (BYTE_NUMBER)
			{
				*I2CDataBuff=revolve(SMB0DAT);		
				I2CDataBuff++;
				BYTE_NUMBER--;			
			}
			if (!BYTE_NUMBER)	AA= 0;
		break;
			// 收到數(shù)據(jù)字節(jié)NACK 已發(fā)送
			// 讀操作已完成讀數(shù)據(jù)寄存器后發(fā)送停止條件
		case SMB_MRDBNACK:
			STO = 1;
			SM_BUSY = 0; // 釋放SMBus
		break;
			// 在本應(yīng)用中所有其它狀態(tài)碼沒有意義通信復(fù)位
		default:
			STO = 1; // 通信復(fù)位
			SM_BUSY = 0; 
		break;
		}
	SI=0; // 清除中斷標(biāo)志
}
/*
{
	switch (SMB0STA){			// Status code for the SMBus (SMB0STA register)
		case SMB_START:					
			SMB0DAT = COMMAND;					// COMMAND should hold slave address + R.
			break;
		case SMB_MTADDNACK:
			STO = 1;
			STA = 1;
			break;
		case SMB_RP_START:
//			SMB0DAT = COMMAND;					// COMMAND should hold slave address + R.
//			STA = 0;											
//			break;
		case SMB_MTADDACK:
		case SMB_MTDBACK:
			if (BYTE_NUMBER)
			{
					if (COMMAND & 0x01)					// If R/W=READ, 
					{
						STA = 1;
					}
					else
					{
						SMB0DAT = *I2CDataBuff;					// If R/W=WRITE, load byte to write.
						I2CDataBuff++;
						BYTE_NUMBER--;			
					}
			}
			else
			{
				STO = 1;
				SM_BUSY = 0;						// Free SMBus
			}
			break;
		
		// Master Transmitter: Data byte transmitted.  NACK received.
		// Slave not responding.  Send STOP followed by START to try again.
		case SMB_MTDBNACK:
			STO = 1;
			STA = 1;
			break;
		
		// Master Transmitter: Arbitration lost.
		// Should not occur.  If so, restart transfer.
		case SMB_MTARBLOST:
			STO = 1;
			STA = 1;
			break;

		// Master Receiver: Slave address + READ transmitted.  NACK received.
		// Slave not responding.  Send repeated start to try again.
		case SMB_MRADDNACK:
			STA = 1;
			break;

		// Data byte received.  ACK transmitted.
		// State should not occur because AA is set to zero in previous state.
		// Send STOP if state does occur.
		case SMB_MRDBACK:
			STO = 1;
			SM_BUSY = 0;
			break;

		// Master Receiver: Slave address + READ transmitted.  ACK received.
		// Set to transmit NACK after next transfer since it will be the last (only) byte.
		case SMB_MRADDACK:
//			AA = 0;										// NACK sent on acknowledge cycle.
//			break;

		// Data byte received.  NACK transmitted.
		// Read operation has completed.  Read data register and send STOP.
		case SMB_MRDBNACK:
			if (BYTE_NUMBER)
			{
					if (COMMAND & 0x01)					// If R/W=READ, 
					{
						*I2CDataBuff=SMB0DAT;		
						I2CDataBuff++;
					}
					BYTE_NUMBER--;			
			}
			else
			{
				STO = 1;
				SM_BUSY = 0;						// Free SMBus
			}
			break;
		// All other status codes meaningless in this application. Reset communication.
		default:
			STO = 1;										// Reset communication.
			SM_BUSY = 0;
			break;
		}
	
	SI=0;													// clear interrupt flag
}
*/

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美福利一区二区| 在线视频国内自拍亚洲视频| 日韩精品一区二区三区在线观看| 性感美女久久精品| 911精品国产一区二区在线| 日本亚洲电影天堂| 欧美成人性战久久| 国产精品综合二区| 亚洲欧洲精品一区二区精品久久久| 暴力调教一区二区三区| 亚洲精品国产精华液| 欧美另类videos死尸| 精品一区二区三区免费观看| 久久精品免费在线观看| 本田岬高潮一区二区三区| 亚洲欧美一区二区三区孕妇| 欧美日韩国产123区| 蜜臀精品一区二区三区在线观看| ww亚洲ww在线观看国产| 99久久久免费精品国产一区二区| 一区二区三区电影在线播| 制服丝袜中文字幕亚洲| 高清在线不卡av| 亚洲一区二区精品久久av| 日韩三级中文字幕| 成人深夜在线观看| 日韩国产在线一| 国产蜜臀av在线一区二区三区| 91豆麻精品91久久久久久| 麻豆精品一区二区| 亚洲乱码中文字幕综合| 日韩欧美国产三级电影视频| 91丨porny丨户外露出| 欧美aⅴ一区二区三区视频| 国产精品护士白丝一区av| 在线综合+亚洲+欧美中文字幕| 高清在线成人网| 视频一区在线视频| 成人欧美一区二区三区1314| 欧美韩国日本不卡| 欧美美女一区二区三区| 99久久亚洲一区二区三区青草| 日本一区中文字幕| 一区二区三区在线观看动漫| 久久综合九色综合97婷婷女人| 欧美专区日韩专区| 成人美女视频在线看| 久久精品国产秦先生| 一区二区三区精品视频在线| 中文在线免费一区三区高中清不卡| 欧美精品在线观看一区二区| 91老师片黄在线观看| 国产麻豆视频一区二区| 青青草97国产精品免费观看| 一区二区日韩av| 亚洲三级在线看| 国产人久久人人人人爽| 26uuu欧美| 日韩欧美色综合| 欧美精品丝袜中出| 在线这里只有精品| 色婷婷亚洲综合| 99久久综合国产精品| 福利一区在线观看| 国产黄色成人av| 国产在线一区观看| 久久aⅴ国产欧美74aaa| 日韩高清一级片| 丝袜国产日韩另类美女| 亚洲成人自拍一区| 亚洲成av人片在线| 亚洲国产欧美在线| 亚洲高清久久久| 亚洲一级二级三级| 亚洲午夜在线视频| 亚洲成年人网站在线观看| 夜夜夜精品看看| 亚洲一区日韩精品中文字幕| 亚洲狠狠爱一区二区三区| 国产精品99久久久久久久女警| 久久精品国产亚洲高清剧情介绍 | 欧美日韩精品福利| 欧美影院一区二区三区| 欧美午夜精品一区二区蜜桃| 欧美日韩三级视频| 制服丝袜亚洲播放| 精品少妇一区二区三区在线视频 | 狠狠色狠狠色合久久伊人| 美女被吸乳得到大胸91| 青青草一区二区三区| 国内久久精品视频| 国产精品77777| 成人激情开心网| 日本韩国欧美在线| 7777女厕盗摄久久久| 日韩精品一区二区三区视频播放| 精品国产污污免费网站入口 | 日韩一二三区视频| 久久一区二区三区国产精品| 国产三区在线成人av| 激情久久久久久久久久久久久久久久| 激情五月激情综合网| 国产白丝网站精品污在线入口| 99re这里都是精品| 欧美福利视频一区| 久久久久久久精| 亚洲免费观看高清完整版在线观看| 亚洲成av人综合在线观看| 狠狠色伊人亚洲综合成人| 99久久国产综合色|国产精品| 欧美亚一区二区| 精品成人一区二区三区四区| 中文字幕视频一区二区三区久| 亚洲成人av在线电影| 国产在线麻豆精品观看| 色婷婷综合激情| 精品久久久久久最新网址| 中文字幕一区二区三区蜜月| 午夜欧美大尺度福利影院在线看| 国产一区亚洲一区| 欧美又粗又大又爽| 国产偷国产偷亚洲高清人白洁 | 亚洲.国产.中文慕字在线| 加勒比av一区二区| 欧美中文字幕一区| 久久久久高清精品| 视频一区视频二区在线观看| 成人小视频在线观看| 欧美一区二区三区色| 国产精品成人午夜| 久久99精品久久久久久国产越南 | 欧美日韩在线三级| 国产日本欧美一区二区| 日本强好片久久久久久aaa| av在线播放成人| 久久综合色婷婷| 日韩精品免费视频人成| 精品成人一区二区三区| 亚洲v中文字幕| 色综合色狠狠天天综合色| 久久一区二区三区国产精品| 日韩精品视频网| 亚洲少妇最新在线视频| 中文字幕亚洲一区二区va在线| 久久免费看少妇高潮| 亚洲成人免费影院| 成人不卡免费av| 久久综合丝袜日本网| 免费观看成人鲁鲁鲁鲁鲁视频| 日本高清不卡视频| 国产精品三级久久久久三级| 国产一二精品视频| 欧美白人最猛性xxxxx69交| 天堂影院一区二区| 欧美亚日韩国产aⅴ精品中极品| √…a在线天堂一区| 国产99一区视频免费| 欧美精品一区二区三区高清aⅴ| 奇米在线7777在线精品 | 蜜臀a∨国产成人精品| 欧美视频在线播放| 一区二区成人在线| 色婷婷激情久久| 一区二区在线免费| 色香色香欲天天天影视综合网| 中文字幕亚洲成人| 92国产精品观看| 亚洲美女淫视频| 色婷婷亚洲综合| 亚洲五码中文字幕| 欧美色老头old∨ideo| 成人午夜免费电影| 一区在线播放视频| 91极品视觉盛宴| 亚洲第四色夜色| 欧美一级国产精品| 捆绑调教一区二区三区| 日韩免费看的电影| 国内成人精品2018免费看| 久久久另类综合| 成人一区在线看| 亚洲日本va午夜在线影院| 一本大道久久精品懂色aⅴ| 亚洲欧美偷拍三级| 欧美日韩一区二区在线视频| 日韩中文字幕一区二区三区| 日韩欧美123| 国产+成+人+亚洲欧洲自线| 自拍偷拍亚洲综合| 欧美视频自拍偷拍| 蜜桃视频在线观看一区| 久久精子c满五个校花| av中文字幕在线不卡| 亚洲午夜久久久久中文字幕久| 欧美精品自拍偷拍动漫精品| 国产在线不卡视频| 综合色中文字幕| 91精品国产一区二区三区香蕉| 国内精品伊人久久久久av影院| 中文字幕制服丝袜成人av|