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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? isr_i2c.c

?? 51單片機C語言常用模塊與綜合系統設計實例精講
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include <./Atmel/at89x52.h>
#include    "source.h"
#define 	SDA_SET() 		(SDA=1)
#define 	SDA_CLR() 		(SDA=0)
//#define 	SDA_VAL()		(PDDR  &0x2)

#define 	SCL_SET() 		(SCL=1)
#define 	SCL_CLR() 		(SCL=0)


I2Cdesc	I2c;	//the device decriptor

extern void I2cFinish(I2Cdesc *I2C_pt);
unsigned int idata I2c_timer_cnt=0;
void Init_I2c_Timer(unsigned int us){//MCLK@18.432MHz
	//(((MCLK/12))*(256-TH0))us
    TH0=TIMER0H;//20us
	TL0=TH0;
	I2c_timer_cnt=us/20;
	TR0=1; // let timer 0 run      // TCON /
}
void Start_I2c_Timer(unsigned int us){
	I2c_timer_cnt=us/20;
	TL0=TH0;
	TR0=1; // let timer 0 run      // TCON /
}
void Stop_I2c_Timer(void){
	TR0=0;
}
unsigned char SDA_VAL(void){
	return SDA;	
}
//*-----------------------------------------------------------------------------
//* 函數名稱  : I2CWrite (I2Cdesc *I2C_pt, u_short loadAddress, u_char nbByte)
//* Object    : I2C
//* 輸入參數  : <I2C_pt> =   為I2C的描述指針,其結構定義在source.h中
//*			      : loadAddress  為I2C的輸入的存儲單元的地址
//*			      : nbByte       為要寫入I2C的字節(jié)數
//* 輸出變量  : 無
//* 功能       :把TxEnd中的數據的nbByte字節(jié)寫到loadAddress地址
//*-----------------------------------------------------------------------------
void I2CWrite (I2Cdesc *I2C_pt, unsigned int loadAddress, unsigned int nbByte){	
    I2C_pt->state = NOK;
	  I2C_pt->operate=WRITE_BIT;
	  I2C_pt->Error=0;	
									    //* initialize state
    SCL_SET();			  //* set SCL line
    SDA_SET();		    //* set SDA line

    I2C_pt->I2CByte = I2C_pt->deviceAddress | WRITE_BIT ;	    //* get byte to transmit
    I2C_pt->loadAddress = loadAddress;					    //* get address
    I2C_pt->mode = HIGH_ADDRESS_WRITE;					    //* next mode
    I2C_pt->nbI2CByte = nbByte;							    //* get number of byte to transmit
    I2C_pt->countBit = 8;								    //* initialize countBit
    I2C_pt->nb_ACK = 10;								    //* initialize nb_ACK
    //* change interrupt handler to I2CTxSendStartSDA
    I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
    //* Enable RC compare interrupt
    Start_I2c_Timer(I2C_pt->Timer_Gap_us);//start Timer
}
//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CRead (I2Cdesc *I2C_pt, u_short loadAddress, u_char nbByte)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//*			           : loadAddress 為I2C的輸入的存儲單元的地址
//*			           : nbByte      為要寫入I2C的字節(jié)數
//* 輸出變量       : 無
//* 功能           :從loadAddress地址中讀nbByted放到RxEnd中
//*-----------------------------------------------------------------------------
void I2CRead (I2Cdesc *I2C_pt, unsigned int loadAddress, unsigned int nbByte){

    I2C_pt->state = NOK;            //* initialize state
	  I2C_pt->operate=READ_BIT;
	  I2C_pt->Error=0;

    SCL_SET();			//* set SCL line
    SDA_SET();		  //* set SDA line

    I2C_pt->I2CByte = I2C_pt->deviceAddress | WRITE_BIT ;     //* get byte to read
    I2C_pt->loadAddress = loadAddress;                  //* get address
    I2C_pt->mode = HIGH_ADDRESS_READ;               //* next mode
    I2C_pt->nbI2CByte = nbByte;         //* get nb byte to transmit

    I2C_pt->countBit = 8;       //* initialize countBit
    I2C_pt->nb_ACK = 10;        //* initialize nb_ACK
    //* change interrupt handler to I2CTxSendStartSDA 
    I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
    //* Enable RC compare interrupt
	 Start_I2c_Timer(I2C_pt->Timer_Gap_us);//start Timer
}

//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CDeviceRead (I2Cdesc *I2C_pt)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//* 輸出變量       : 無
//* 功能           :為在讀字節(jié)操作時通知I2C設備,以下的操作為讀操作
//*-----------------------------------------------------------------------------
void I2CDeviceRead (I2Cdesc *I2C_pt){
    SDA_SET();     //* set SDA line
    SCL_SET();      //* set SCL line
    
    I2C_pt->I2CByte = I2C_pt->deviceAddress | READ_BIT;      //* get byte to transmit
    I2C_pt->mode = DATA_READ;   //* next mode
    I2C_pt->countBit = 8;       //* initialize countBit
    I2C_pt->nb_ACK = 10;           //* initialize nb_ACK
    //* change interrupt handler to I2CTxSendStartSDA
    I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
}

//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CDeviceRead (I2Cdesc *I2C_pt)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//* 輸出變量       : 無
//* 功能           :為在寫字節(jié)操作時通知I2C設備,以下的操作為寫操作
//*-----------------------------------------------------------------------------
void I2CDeviceWrite (I2Cdesc *I2C_pt){
    SDA_SET();;     //* set SDA line
    SCL_SET();;        //* set SCL line

    I2C_pt->I2CByte = I2C_pt->deviceAddress | WRITE_BIT;      //* get byte to transmit
    I2C_pt->mode = DATA;   		//* next mode
    I2C_pt->countBit = 8;       //* initialize countBit
    I2C_pt->nb_ACK = 10;           //* initialize nb_ACK
    //* change interrupt handler to I2CTxSendStartSDA
    I2C_pt->I2CTCHandler = I2CTxSendStartSDA;
}
//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CTxSendByte (I2Cdesc *I2C_pt)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//* 輸出變量       : 無
//* 功能           :為把狀態(tài)字節(jié),數據,地址等字節(jié)寫到I2C設備中
//*-----------------------------------------------------------------------------
void I2CTxSendByte (I2Cdesc *I2C_pt){

    SDA_SET();;        //* set SDA line
    switch(I2C_pt->mode){           //* get byte to transmit
	    case DATA :     //Writing data byte now...
	        I2C_pt->I2CByte = *(I2C_pt->TxEnd++);
    	    I2C_pt->nbI2CByte--;
	        if(I2C_pt->nbI2CByte == 0)
                I2C_pt->mode = STOP;               //* next mode
    	    break;
    	case HIGH_ADDRESS_WRITE :   //Write high byte of address (Write operation)...
	        I2C_pt->I2CByte = (unsigned char)(I2C_pt->loadAddress >> 8);
            I2C_pt->mode    = LOW_ADDRESS_WRITE;   //* next mode
	        break;
	    case LOW_ADDRESS_WRITE :    //Write low byte of address (Write operation)...
	        I2C_pt->I2CByte = (unsigned char) I2C_pt->loadAddress;
	        I2C_pt->mode    = DATA;                //* next mode
	        break;
	    case HIGH_ADDRESS_READ :    //Write high byte of address (Read operation)... 
	        I2C_pt->I2CByte = (unsigned char) (I2C_pt->loadAddress >> 8);
            I2C_pt->mode    = LOW_ADDRESS_READ;    //* next mode
	        break;
	    case LOW_ADDRESS_READ :     //Write low byte of address (Read operation)...
	        I2C_pt->I2CByte = (unsigned char) I2C_pt->loadAddress;
	        I2C_pt->mode    = DEVICE_READ;         //* next mode
	        break;
    }
    I2C_pt->countBit = 8;         //* initialize countBit
    I2C_pt->nb_ACK   = 10;        //* initialize nb_ACK
    //* change interrupt handler to I2CTxSendBit
    I2C_pt->I2CTCHandler = I2CTxSendBit;
}


//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CTxSendBit (I2Cdesc *I2C_pt)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//* 輸出變量       : 無
//* 功能           :根據發(fā)送數據的BIT位來判斷要發(fā)送什么數據在SDA線上
//*-----------------------------------------------------------------------------
void I2CTxSendBit (I2Cdesc *I2C_pt){
    unsigned char bit_val;
    SCL_CLR();		    //* Clear SCL line
    I2C_pt->countBit--;									    //* decrement countBit
    if(I2C_pt->countBit >= 0){				    //* if bit counter = 0 ...
		bit_val = (I2C_pt->I2CByte >> I2C_pt->countBit) & 1;	//* get bit to transfert
		//* Send 0 or 1
		if (bit_val){
   	    SDA_SET();		//* Set SDA line
		}
   else{
		    SDA_CLR();	    //* Clear SDA line
		}
 		//* change interrupt handler to I2CTxSetSCL
		I2C_pt->I2CTCHandler = I2CTxSetSCL;
    }
    else{										//All the bits has been sent...
		//SDA_INPUT();		   	//* set SDA line as an input
		//* change interrupt handler to I2CTxPrepareACK
		I2C_pt->I2CTCHandler = I2CTxPrepareACK;
    }
}
//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CTxSendStartSDA (I2Cdesc *I2C_pt)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//* 輸出變量       : 無
//* 功能           :為I2C的開始時序SDA的變化
//*-----------------------------------------------------------------------------
void I2CTxSendStartSDA (I2Cdesc *I2C_pt){	
    SDA_CLR();		    //* clear SDA line
    //* change interrupt handler to I2CTxSendStartSCL
    I2C_pt->I2CTCHandler = I2CTxSendStartSCL;
}

//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CTxSendStartSDA (I2Cdesc *I2C_pt)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//* 輸出變量       : 無
//* 功能           :為I2C的開始時序SCL的變化
//*-----------------------------------------------------------------------------
void I2CTxSendStartSCL (I2Cdesc *I2C_pt){
    SCL_CLR();		    //* clear SCL line
    //* change interrupt handler to I2CTxSendBit
    I2C_pt->I2CTCHandler = I2CTxSendBit;
}

//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CTxPrepareSTOP (I2Cdesc *I2C_pt)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//* 輸出變量       : 無
//* 功能           :為I2C的發(fā)送準備停止
//*-----------------------------------------------------------------------------
void I2CTxPrepareSTOP (I2Cdesc *I2C_pt)
//* Begin
{
    //* clear SDA line
    SDA_CLR();

    //* set SCL line
    SCL_SET();

    //* change interrupt handler to I2CTxSendStopSDA
    I2C_pt->I2CTCHandler = I2CTxSendStopSDA;

//* End
}


//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CTxSendStopSCL (I2Cdesc *I2C_pt)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//* 輸出變量       : 無
//* 功能           :為I2C的停止時序SCL的變化
//*-----------------------------------------------------------------------------
void I2CTxSendStopSCL (I2Cdesc *I2C_pt){
    SCL_SET();;    //* set SCL line
    //* change interrupt handler to I2CTxSendStopSDA
    I2C_pt->I2CTCHandler = I2CTxSendStopSDA;
}

//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CTxSendStopSDA (I2Cdesc *I2C_pt)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//* 輸出變量       : 無
//* 功能           :為I2C的停止時序SDA的變化
//*-----------------------------------------------------------------------------
void I2CTxSendStopSDA (I2Cdesc *I2C_pt){
    SDA_SET();;         	//Set SDA line high
    I2C_pt->state = OK;								//Return to "OK"(Idle) state

    I2C_pt->I2CTCHandler = I2C_pt->I2cFinish;		//change interrupt handler
}

//*-----------------------------------------------------------------------------
//* 函數名稱       : I2CTxPrepareACK (I2Cdesc *I2C_pt)
//* Object         : I2C
//* 輸入參數       : <I2C_pt> =  為I2C的描述指針,其結構定義在source.h中
//* 輸出變量       : 無
//* 功能           :為I2C的發(fā)送應答時序的前的準備
//*-----------------------------------------------------------------------------
void I2CTxPrepareACK (I2Cdesc *I2C_pt){
    SCL_SET();		    //* set SCL line
    //* change interrupt handler to I2CTxWaitACK
    I2C_pt->I2CTCHandler = I2CTxWaitACK;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
老汉av免费一区二区三区 | 91精品国产美女浴室洗澡无遮挡| 欧美色精品天天在线观看视频| 日韩三级精品电影久久久| 国产欧美日本一区二区三区| 亚洲一卡二卡三卡四卡| 日韩三级在线观看| 国产精品三级av| 捆绑紧缚一区二区三区视频| 色综合色狠狠天天综合色| 26uuu色噜噜精品一区二区| 欧美电视剧在线看免费| 一区二区三区在线观看动漫 | 成人丝袜18视频在线观看| 欧美一级久久久| 亚洲综合成人网| 99精品视频免费在线观看| 国产成人啪午夜精品网站男同| 福利一区二区在线| 日韩天堂在线观看| 一区二区三区.www| 成人av电影在线网| 国产欧美综合在线观看第十页| 日韩午夜激情电影| 午夜免费欧美电影| 欧美三级视频在线| 一区二区在线观看不卡| 夜色激情一区二区| 青青国产91久久久久久 | 国产欧美日韩不卡免费| 1区2区3区国产精品| 亚洲成av人影院| 日韩一区二区三区三四区视频在线观看 | 久久人人爽人人爽| 国产激情91久久精品导航| 久久久久青草大香线综合精品| 国产精品久久久久久久久晋中| 五月天激情小说综合| 欧美手机在线视频| 欧美国产精品中文字幕| 东方aⅴ免费观看久久av| 欧美高清在线一区二区| 五月婷婷激情综合网| 91精品国产乱| 久久 天天综合| 国产欧美精品日韩区二区麻豆天美 | 97精品久久久久中文字幕| 亚洲素人一区二区| 欧美日韩日本视频| 日本欧美在线看| 精品成人在线观看| 一区二区三区四区视频精品免费 | 亚洲欧洲精品成人久久奇米网| 日本在线观看不卡视频| 色综合久久天天综合网| 精品国产一区二区三区忘忧草| 国产在线不卡一区| 91精品国产美女浴室洗澡无遮挡| 久久99久久精品| 欧美精品丝袜中出| 免费国产亚洲视频| 欧美丰满一区二区免费视频| 日韩av不卡一区二区| 日本电影欧美片| 免费成人美女在线观看| 成人综合日日夜夜| 国产精品无遮挡| 欧美在线free| 亚洲精品欧美综合四区| 91精品久久久久久蜜臀| 成人精品电影在线观看| 午夜影院久久久| 国产亚洲女人久久久久毛片| 欧美中文字幕一二三区视频| 国产精品一区2区| 亚洲成人先锋电影| 国产精品免费aⅴ片在线观看| 欧美男生操女生| 色综合久久久久综合| 久久爱www久久做| 亚洲一区二区三区四区的| 日本成人超碰在线观看| 亚洲视频你懂的| 欧美亚洲日本国产| 国产精品资源在线| 日韩激情av在线| 亚洲精品国产无套在线观| 精品国产污污免费网站入口| 欧美综合一区二区三区| 高清不卡在线观看| 亚洲欧洲日本在线| 日韩视频一区二区三区| 91视频观看免费| 中文字幕在线不卡国产视频| 精品国产免费人成电影在线观看四季| 日韩精品一级中文字幕精品视频免费观看| 欧美亚洲自拍偷拍| 一区二区三区四区不卡在线| 久久综合色综合88| 69av一区二区三区| 精品视频999| 天堂在线一区二区| 亚洲一区二区黄色| 亚洲一区二区三区小说| 欧美日韩国产小视频| 色美美综合视频| 色综合久久久久综合| 99国产精品久久久久久久久久久| 成人综合在线视频| 亚洲成人免费电影| 精品三级av在线| 日韩亚洲欧美成人一区| 成人一区二区三区在线观看| 极品少妇xxxx精品少妇| 欧美bbbbb| 亚洲色欲色欲www在线观看| 中文无字幕一区二区三区| 国产无遮挡一区二区三区毛片日本| 色先锋资源久久综合| 国产在线国偷精品产拍免费yy| 另类欧美日韩国产在线| 中文字幕亚洲视频| 亚洲区小说区图片区qvod| 91精品国产乱码| 日韩精品专区在线| 在线看不卡av| 欧美日本精品一区二区三区| 欧美一级免费大片| 99re热视频这里只精品| 亚洲欧洲精品一区二区精品久久久| 国产午夜精品一区二区| 欧美视频一区二区三区四区| 欧美午夜精品免费| 日韩精品中文字幕一区| 国产亚洲制服色| 日韩一区二区在线免费观看| 成人理论电影网| 色婷婷精品大在线视频| 国产精品99久久久久久似苏梦涵| 福利91精品一区二区三区| 免费不卡在线视频| 国产成人综合在线| 一本大道久久a久久精品综合| 欧美三级韩国三级日本一级| 91蜜桃免费观看视频| 欧美日韩一区二区欧美激情| 国产欧美一区二区精品仙草咪| 国产日韩一级二级三级| 亚洲午夜激情av| 韩国毛片一区二区三区| 91色在线porny| 大胆欧美人体老妇| 欧美性色欧美a在线播放| 日韩欧美激情四射| 亚洲青青青在线视频| 麻豆精品新av中文字幕| 成人精品电影在线观看| 国产成人aaa| 欧美情侣在线播放| 91精品国产综合久久国产大片| 色呦呦国产精品| 久久久亚洲精品一区二区三区| 亚洲欧美日韩系列| 国产真实乱对白精彩久久| 91天堂素人约啪| 久久综合久久综合久久综合| 亚洲第一在线综合网站| 丝袜a∨在线一区二区三区不卡| 国产精品一区二区久久精品爱涩| 欧美视频在线一区二区三区| 久久九九国产精品| 毛片av中文字幕一区二区| 色婷婷综合久久久久中文一区二区 | 精品国精品自拍自在线| 亚洲综合偷拍欧美一区色| 成人一二三区视频| 色婷婷av一区二区三区大白胸| 337p日本欧洲亚洲大胆精品| 视频一区二区三区在线| 色婷婷香蕉在线一区二区| 欧美视频一区二区三区| 欧美一区二区在线看| 久久综合成人精品亚洲另类欧美 | 亚洲国产高清在线观看视频| 日韩在线一二三区| 欧美在线啊v一区| 日韩一级免费一区| 国产农村妇女毛片精品久久麻豆| 国产精品国产自产拍高清av| 国产精品一区二区免费不卡| 精品国产污污免费网站入口| 日本成人在线视频网站| 不卡的av在线播放| 亚洲国产高清不卡| 激情国产一区二区| 色婷婷综合久久久中文一区二区| 7777精品久久久大香线蕉| 国产女主播一区| 成人av在线一区二区| 欧美一二三四在线|