日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
I2C驅(qū)動(dòng)程序( C51 )
I2C驅(qū)動(dòng)程序( C51 )
 更新時(shí)間:2008-7-27 16:02:03  點(diǎn)擊數(shù):4
【字體: 字體顏色
來(lái)源:網(wǎng)上轉(zhuǎn)載     作者:佚名

//****************************I2C驅(qū)動(dòng)程序****************************//
void Set_SCL(uchar i)                  //定義MAX6959時(shí)鐘線為PA^7
{if(i)   PORTA |=0x80;
 else    PORTA &=0x7f;
}
 
void Set_SDA(uchar i)                  //定義MAX6959數(shù)據(jù)線為PA^6
{if(i)   PORTA |=0x40;
 else    PORTA &=0xbf;
}

void Start()                           //I2C總線的開(kāi)始條件
{Set_SDA(1);                        //SDA=1;
 Set_SCL(1);                        //SCL=1;
 delay(100);                        //等待時(shí)鐘信號(hào)變高
 Set_SDA(0);                        //SDA=0;
 delay(100);
 Set_SCL(0);                        // SCL=0;
}

void Stop()                            //I2C總線結(jié)束條件
{Set_SDA(0);                        //SDA=0;
 delay(100);
 Set_SCL(1);                        //SCL=1;
 delay(100);                        //等待時(shí)鐘信號(hào)變低
 Set_SDA(1);                        //SDA=1;
 delay(100);
 Set_SCL(0);                        //SCL=0;
}

void Ack()                             //I2C總線應(yīng)答
{Set_SDA(0);                        //SDA=0;
 delay(50);
 Set_SCL(1);                        //SCL=1;
 delay(100);
 Set_SCL(0);                        //SCL=0;
 delay(50);
 Set_SDA(1);                        //SDA=1;
}

void Nack()                            //I2C總線應(yīng)答非
{Set_SDA(1);                        //SDA=1;
 delay(50);
 Set_SCL(1);                        //SCL=1;
 delay(100);
 Set_SCL(0);                        //SCL=0;
 delay(50);
 Set_SDA(0);                        //SDA=0;
}

void Check_Ack()                       //I2C總線應(yīng)答檢查
{Set_SDA(1);                        //SDA=1;
 Set_SCL(1);                        //SCL=1;
 Ack_Flag=0;                        //清除應(yīng)答標(biāo)志;
 DDRA&=0xbf;                         //設(shè)置SDA為輸入
 if(!((PINA & 0x40)>>6))
   {delay(50);
    Set_SCL(0);                        //SCL=0;
    delay(100);}
 else
   {Ack_Flag=1;                        //收到應(yīng)答;
    delay(50);
    Set_SCL(0);                        //SCL=0;
    delay(100);}
 DDRA |=0xff;                         //重新設(shè)置SDA為輸出 
}

void Write_Bit0()                      //寫(xiě)1bit數(shù)據(jù):0   
{Set_SDA(0);                        //SDA=0;
 Set_SCL(1);                        //SCL=1;
 delay(100);
 Set_SCL(0);                        //SCL=0;
}

void Write_Bit1()                      //寫(xiě)1bit數(shù)據(jù):1      
{Set_SDA(1);                        //SDA=1;
 Set_SCL(1);                        //SCL=1;
 delay(100);
 Set_SCL(0);                        //SCL=0;
 Set_SDA(0);                        //SDA=0;
}

void Write_Byte(uchar Data)            //寫(xiě)一字節(jié)數(shù)據(jù)Data 
{uchar i;
 for(i=0;i<8;i++)
  {if(Data & 0x80)  Write_Bit1();      //傳輸位從高位到低位,先傳最高位
   else             Write_Bit0();
   Data <<=1;}                         //數(shù)據(jù)左移            
}

uchar Read_Byte()                      //讀一字節(jié)數(shù)據(jù):返回值即讀的數(shù)據(jù)          
{uchar Read_Data=0xff;             // Read_Data為讀入的數(shù)據(jù),初始值為0xff
 uchar j;
 for (j=0;j<8;j++)
  {Set_SDA(1);   
   Set_SCL(1);   
   DDRA &=0xbf;   
   if((PINA & 0x40)==0)
     {Read_Data <<=1;
      Read_Data=(Read_Data & 0xfe);                
      Set_SCL(0);}
   else
    {Read_Data <<=1;
     Read_Data =( Read_Data  | 0x01);
     Set_SCL(0);}}
 DDRA |=0x40;               
 return(Read_Data);              
}

//***************************寫(xiě)一字節(jié)數(shù)據(jù)****************************//
//向從地址為Slave的IIC器件的Address地址寫(xiě)一字節(jié)數(shù)據(jù)Data
void Write_1byte(uchar Slave,uchar Address,uchar Data)
{Start();                         //開(kāi)始
 Write_Byte(Slave);                 //寫(xiě)I2C器件地址
 do Check_Ack();                 //檢查應(yīng)答位
 while(Ack_Flag==1);
 Write_Byte(Address);                  //送寄存器地址
 do Check_Ack();                 //檢查應(yīng)答位
 while(Ack_Flag==1);
 Write_Byte(Data);                 //寫(xiě)入一字節(jié)數(shù)據(jù)
 do Check_Ack();                       //檢查應(yīng)答位
 while(Ack_Flag==1);
 Stop();                               //停止
}

//***************************寫(xiě)兩字節(jié)數(shù)據(jù)****************************//
//向從地址為Slave的IIC器件的Address地址開(kāi)始寫(xiě)兩字節(jié)數(shù)據(jù)Data0,Data1
void Write_2byte(uchar Slave,uchar Address,uchar Data0,uchar Data1)
{Start();                         //開(kāi)始
 Write_Byte(Slave);                 //寫(xiě)I2C器件地址
 do Check_Ack();                 //檢查應(yīng)答位
 while(Ack_Flag==1);                 
 Write_Byte(Address);                  //送寄存器地址
 do Check_Ack();                 //檢查應(yīng)答位
 while(Ack_Flag==1);
 Write_Byte(Data0);
 do Check_Ack();                  //檢查應(yīng)答位
 while(Ack_Flag==1);
 Write_Byte(Data1);
 do Check_Ack();                 //檢查應(yīng)答位
 while(Ack_Flag==1);
 Stop();                         //停止信號(hào)
}

//***************************讀一字節(jié)數(shù)據(jù)****************************//
//從從地址為Slave的IIC器件的Address地址處讀一字節(jié)數(shù)據(jù)
uchar Read_1byte(uchar Slave,uchar Address)
{uchar data0,x;
 do{
    Start();                     //開(kāi)始信號(hào)
    Write_Byte(Slave);             //寫(xiě)I2C器件地址
    Check_Ack();                 //檢查應(yīng)答位
   }while(Ack_Flag);             
 do{
    Write_Byte(Address);         //寫(xiě)寄存器地址
    Check_Ack();                 //檢查應(yīng)答位
   }while(Ack_Flag);                  
 do{
    Start();                     //開(kāi)始
    Write_Byte(Slave+1);         //寫(xiě)I2C器件地址(+1表示為讀操作)
    Check_Ack();                 //檢查應(yīng)答位
   }while(Ack_Flag);
 data0=Read_Byte();                 //讀1字節(jié)
 Nack();                         //讀完發(fā)送一個(gè)Not Ack應(yīng)答
 Stop();                         //停止
 return data0;                        //返回讀取數(shù)據(jù)
}

 

  • 上一篇: C51寫(xiě)的公歷轉(zhuǎn)農(nóng)歷和星期
  • 下一篇: 128x64液晶KS0108驅(qū)動(dòng)程序(C51)
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1