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

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

?? i2c 總線的時序和讀寫.txt

?? i2c 總線的時序和讀寫 i2c 總線的時序和讀寫 i2c 總線的時序和讀寫 i2c 總線的時序和讀寫 i2c 總線的時序和讀寫
?? TXT
字號:
i2c 總線的時序和讀寫
#include <w77e58.h>
#include <file.h>
#define I2c_Control 0xa0        //I2C器件控制字節高四位為0x0a
#define Wr2_Address 0xa000

extern bdata byte Yo2_Buf;
extern idata byte TimerOf1ms;

sbit SDA=P1^6;
sbit SCL=P1^7;

//以下是對I2C器件的操作
//SDA及SCL空閑狀態均保持高電平
//允許寫入24LC01
byte idata I2c_Address;
void Wrcs01_Protect_On(void)
{
  byte xdata *px;
  px=Wr2_Address;
  Yo2_Buf&=0xf3;       //允許寫入24LC01
  *px=Yo2_Buf;
}
//禁止寫入24LC01
void Wrcs01_Protect_Off(void)
{
  byte xdata *px;
  px=Wr2_Address;
  Yo2_Buf&=0xf3;
  Yo2_Buf|=0x04;       //禁止寫入24LC01
  *px=Yo2_Buf;
}
//允許寫入24LC02
void Wrcs02_Protect_On(void)
{
  byte xdata *px;
  px=Wr2_Address;
  Yo2_Buf|=0x0c;       //允許寫入24LC02
  *px=Yo2_Buf;
}
//禁止寫入24LC02
void Wrcs02_Protect_Off(void)
{
  byte xdata *px;
  px=Wr2_Address;
  Yo2_Buf&=0xf3;
  Yo2_Buf|=0x04;       //禁止寫入24LC02
  *px=Yo2_Buf;
}
void delay(void)
{
  byte i,j;
  for (i=0;i<2;i++)
    j++;
}
//啟動I2C器件的讀寫
void I2c_Start(void)
{
  SCL=0;
  delay();
  SDA=1;
  delay();
  delay();
  SCL=1;
  delay();
  delay();
  SDA=0;
  delay();
  delay();
}
//停止I2C器件的讀寫
void I2c_Stop(void)
{
  SCL=0;
  delay();
  SDA=0;
  delay();
  delay();
  SCL=1;
  delay();
  delay();
  SDA=1;
  delay();
}
//在SCL的上升沿向I2C總線上發送一位數據
void I2c_Send_Bit(bit b_data)
{
  SCL=0;
  delay();
  SDA=b_data;
  delay();
  delay();
  SCL=1;
  delay();
}
//從I2C總線上接收ACK應答信號
//接收到ACK 則返回true,否則返回false
byte I2c_Receive_ACK(void)
{
  bit i;
  SCL=0;
  delay();
  SDA=1;                //準備接收ACK 應答
  delay();
  delay();
  i=SDA;
  SCL=1;
  delay();
  if (i==0)
    return (1);
  return (0);
}
//在SCL的下降沿向I2C總線上發送一字節數據,并接收ACK 應答信號
//接收到ACK 則返回1,否則返回0
byte I2c_Send_Byte(byte i)
{
  byte j;
  for (j=0;j<8;j++)
  {
    if ((i&0x80)==0)
      I2c_Send_Bit(0);  //發送0
    else
      I2c_Send_Bit(1);  //發送1
    i<<=1;
  }
  if (I2c_Receive_ACK()==0)
    return (0);            //收不到應答信號
  return (1);
}
//在SCL的下降沿從I2C總線上接收一字節數據
byte I2c_Receive_Byte(void)
{
  byte i,j;
  SCL=0;
  delay();
  SDA=1;
  for (i=0,j=0;i<8;i++)
  {
    SCL=0;
    delay();
    j<<=1;
    delay();
    if (SDA==1)
      j++;
    SCL=1;
    delay();
  }
  return (j);
}
//在SCL的下降沿從I2C總線上接收一字節數據,并發送ACK
byte I2c_Receive_Byte1(void)
{
  byte i;
  i=I2c_Receive_Byte();         //接收一字節數據
  I2c_Send_Bit(0);              //發送ACK
  return (i);
}
//在SCL的下降沿從I2C總線上接收一字節數據,但不發送ACK
byte I2c_Receive_Byte2(void)
{
  byte i;
  i=I2c_Receive_Byte();         //接收一字節數據
  I2c_Send_Bit(1);              //不發送ACK
  return (i);
}
//啟動I2C器件寫操作模式
//Device_Add--I2C器件地址
//address--數據要寫入的地址
//成功返回1,否則返回0
byte I2c_Start_Write(byte Device_Add,byte address)
{
  byte i,j;
  for (j=0;j<3;j++)
  {
    I2c_Start();                  //啟動I2C
    i=Device_Add<<1;
    i|=I2c_Control;               //加入控制碼
    i&=0xfe;                      //寫操作
    if (I2c_Send_Byte(i)==1)
    {                             //發送控制字節后有正確應答
      if (I2c_Send_Byte(address)==1)
        return (1);               //發送寫地址后有應答
    }
    I2c_Stop();                   //結束I2C器件的讀寫
    TimerOf1ms=4;
    for (;;)
      if (TimerOf1ms==0) break;   //延時4 毫秒后再次重試
  }
  switch (I2c_Address)
  {
    case 0: Lcd_Display(38);break;
    case 1: Lcd_Display(39);break;
    case 2: Lcd_Display(40);
  }
  return (0);
}
//啟動I2C器件讀操作模式
//Device_Add--I2C器件地址
//成功返回1,否則返回0
byte I2c_Start_Read(byte Device_Add)
{
  byte i;
  I2c_Start();                  //再次啟動I2C
  i=Device_Add<<1;
  i|=I2c_Control;               //加入控制碼
  i|=0x01;                      //讀操作
  if (I2c_Send_Byte(i)==0)
    return (0);                 //發送控制字節后沒有應答
  return (1);
}
//從I2C器件中讀取數據
//device_add--器件地址(0-24LC01,1-8583,2-24LC02)
//read_add--讀數據的起始地址
//save_add--讀出的數據的存儲地址
//block_size--要讀取的數據的長度
//數據全部讀出則返回1,否則返回0
byte I2c_Read(byte Device_Add,byte Read_Add,byte *Save_Add,byte Block_Size)
{
  byte i;
  if (I2c_Start_Write(Device_Add,Read_Add)==0)
    return (0);                 //啟動寫模式失敗
  if (I2c_Start_Read(Device_Add)==0)
    return (0);                 //啟動讀模式失敗
  if (--Block_Size!=0)
  {                             //要讀取的數據長度不為1
    for (i=0;i<Block_Size;i++)
      *Save_Add++=I2c_Receive_Byte1();
  }
  *Save_Add++=I2c_Receive_Byte2();
  I2c_Stop();
  return (1);
}

//向I2C 器件中某一頁面寫入數據
byte I2c_Write_Page(byte Device_Add,byte Write_Add,byte *Read_Add,byte Size)
{
  byte i,j;
  byte xdata temp[8];
  for (i=0;i<3;i++)
  {
    if (I2c_Start_Write(Device_Add,Write_Add)==0)
      return (0);                                       //啟動寫模式失敗
    for (j=0;j<Size;j++)
    {
      if (I2c_Send_Byte(Read_Add[j])==0)
        return (0);                                     //發送寫入數據后沒有回應
    }
    I2c_Stop();
    if (I2c_Read(Device_Add,Write_Add,temp,Size)==1)    //將剛剛寫入的一頁讀出
    {
      for (j=0;j<Size;j++)
        if (Read_Add[j]!=temp[j]) break;                //讀出的數據與寫入的不同
      if (j==Size)
        break;                  //數據已經被正確寫入則退出循環,否則再次寫入
    }
    else
      return (0);
  }
  if (i==3)
    return (0);                 //三次寫入不正確
  return (1);
}

//向I2C器件中寫入數據
//device_add--器件地址(0-24LC01、1-8583、2-24LC02)
//Save_add--要寫入數據的起始地址
//Read_add--讀出的數據的存儲地址
//block_size--要寫入的數據的長度
//數據全部讀出則返回1,否則返回0
byte I2c_Write(byte Device_Add,byte Write_Add,byte *Read_Add,byte Block_Size)
{
  byte i,j;
  j=Write_Add&0x07;
  if (j!=0)
  {
    j=8-j;                      //本頁面還可寫入的數據長度
    if (Block_Size<j)
      j=Block_Size;             //要寫入的數據總長度小于本頁面還可寫入的數據長度
    if (I2c_Write_Page(Device_Add,Write_Add,Read_Add,j)==0)
      return (0);
    Write_Add+=j;
    Read_Add+=j;
    Block_Size-=j;              //還需讀出的數據的長度
  }
  if (Block_Size!=0)
  {                             //還有數據需要讀出
    j=Block_Size/8;
    if (j!=0)
    {
      for (i=0;i<j;i++)
      {
        if (I2c_Write_Page(Device_Add,Write_Add,Read_Add,8)==0)
          return (0);
        Write_Add+=8;
        Read_Add+=8;
      }
    }
    j=Block_Size%8;
    if (j!=0)
    {
      if (I2c_Write_Page(Device_Add,Write_Add,Read_Add,j)==0)
        return (0);
    }
  }
  I2c_Stop();
  return (1);
}

//從24LC01中讀取數據
//Read_Add--要讀取數據的首地址
//Save_Add--讀出數據的存儲地址
//Block_Size--要讀數據的長度
//數據不能全部讀出則死循環
byte Cs01_Read(byte Read_Add,byte *Save_Add,byte Block_Size)
{
  I2c_Address=0;
  if (I2c_Read(0,Read_Add,Save_Add,Block_Size)==0)
  {
    Lcd_Display(41);
    return (0);
  }
  return (1);
}

//向24LC01中寫入數據
//Write_Add--要寫入的首地址
//Read_Add--要寫入數據的讀取地址的首地址
//Block_Size--要寫入數據的長度
//數據不能全部寫入則死循環
byte Cs01_Write(byte Write_Add,byte *Read_Add,byte Block_Size)
{
  Wrcs01_Protect_On();
  I2c_Address=0;
  if (I2c_Write(0,Write_Add,Read_Add,Block_Size)==0)
  {
    Lcd_Display(42);
    return (0);
  }
  Wrcs01_Protect_Off();
  return (1);
}

//從24LC02中讀取數據
byte Cs02_Read(byte Read_Add,byte *Save_Add,byte Block_Size)
{
  I2c_Address=2;
  if (I2c_Read(2,Read_Add,Save_Add,Block_Size)==0)
  {
    Lcd_Display(43);
    return (0);
  }
  return (1);
}

//向24LC02中寫入數據
byte Cs02_Write(byte Write_Add,byte *Read_Add,byte Block_Size)
{
  Wrcs02_Protect_On();
  I2c_Address=2;
  if (I2c_Write(2,Write_Add,Read_Add,Block_Size)==0)
  {
    Lcd_Display(44);
    return (0);
  }
  Wrcs02_Protect_Off();
  return (1);
}

//從時鐘芯片8583中讀取數據
//數據不能全部讀出則返回0
byte Read_8583(byte Read_Add,byte *Save_Add,byte Block_Size)
{
  byte i;
  I2c_Address=1;
  if (I2c_Start_Write(1,Read_Add)==0)
    return (0);                 //啟動8583寫模式失敗
  if (I2c_Start_Read(1)==0)
    return (0);                 //啟動8583讀模式失敗
  if (--Block_Size!=0)
  {                             //要讀取的數據長度不為1
    for (i=0;i<Block_Size;i++)
      *Save_Add++=I2c_Receive_Byte1();
  }
  *Save_Add++=I2c_Receive_Byte2();
  I2c_Stop();
  return (1);
}

//向時鐘芯片8583中寫入數據
//數據全部寫入返回1,否則返回0
byte Write_8583(byte Write_Add,byte *Read_Add,byte Block_Size)
{
  byte i;
  I2c_Address=1;
  if (I2c_Start_Write(1,Write_Add)==0)
    return (0);
  for (i=0;i<Block_Size;i++)
  {
    if (I2c_Send_Byte(*Read_Add++)==0)
      return (0);               //發送寫入數據后沒有回應
  }
  I2c_Stop();
  return (1);
}

//啟動8583走時
byte Start_8583_Run(void)
{
  byte xdata *px;
  *px=0;                        //32.768kHz
  return (Write_8583(0,px,1));
}

//停止8583走時
byte Stop_8583_Run(void)
{
  byte xdata *px;
  *px=0x80;
  return (Write_8583(0,px,1));
}

byte xdata buffer_8583[8];     //用于暫存8583時間數據

//BCD 數轉化為二進制數
byte BCD_To_Bin(byte i)
{
  byte j;
  j=i>>4;
  j&=0x0f;
  j*=10;
  j+=i&0x0f;
  return (j);
}
//二進制數轉化為BCD 數
byte Bin_To_BCD(byte i)
{
  byte j;
  j=i/10;
  j<<=4;
  j&=0xf0;
  j|=i%10;
  return (j);
}

//設置8583時間
//8583的16-17單元暫存年的低位及高位字節(以二進制方式)
//設置時間不成功則死循環
void Set_8583_Clock(struct RTC_CLOCK *pclock)
{
  byte i,j;
  Stop_8583_Run();                      //停止8583走時
  buffer_8583[0]=0x80;                  //控制字節
  buffer_8583[1]=0x55;
  buffer_8583[2]=pclock->seconds;       //暫存秒
  buffer_8583[3]=pclock->minutes;       //暫存分
  buffer_8583[4]=pclock->hours;         //24小時模式
  j=BCD_To_Bin(pclock->year_l);         //以二進制方式暫存年的低位字節
  i=j<<6;
  i&=0xc0;
  buffer_8583[5]=i|pclock->day_of_the_month;    //年的最低兩位+日期
  i=pclock->day_of_the_week;
  i<<=5;
  i&=0xe0;
  buffer_8583[6]=i|pclock->months;      //星期+月份
  if (Write_8583(0,buffer_8583,7)==0)
    Lcd_Display(45);
  buffer_8583[0]=j;
  buffer_8583[1]=BCD_To_Bin(pclock->year_h);
  Write_8583(16,buffer_8583,2);         //年數據暫存在8583的16-17地址單元內
  Start_8583_Run();
}

//讀取8583時間
//讀取時間不成功則死循環
void Get_8583_Clock(struct RTC_CLOCK *pclock)
{
  byte i,j,k;
  for (;;)
    if (Stop_8583_Run()==1) break;
  for (;;)
    if (Read_8583(0,buffer_8583,8)==1) break;    //從8583地址0 處讀出8 字節數據
  for (;;)
    if (Start_8583_Run()==1) break;
  pclock->seconds=buffer_8583[2];       //得到秒
  pclock->minutes=buffer_8583[3];       //得到分
  pclock->hours=buffer_8583[4];         //得到小時
  i=buffer_8583[6];
  pclock->months=i&0x1f;                //得到月份
  i>>=5;
  pclock->day_of_the_week=i&0x07;       //得到星期
  i=buffer_8583[5];
  pclock->day_of_the_month=i&0x3f;      //得到日期
  i=i>>6;
  i&=0x03;                              //得到年的低兩位
  Read_8583(16,buffer_8583,2);          //讀取前次存儲的年數據
  j=buffer_8583[0];                     //年的低位字節
  k=j&0x03;
  if (i!=k)
  {                                     //年值已經改變
    if (i>k)
      i-=k;
    else
      i+=4-k;
    j+=i;                               //得到新的年值
    if (j>99)
    {
      j-=100;
      buffer_8583[1]++;
    }
    buffer_8583[0]=j;
    Write_8583(16,buffer_8583,2);       //年數據暫存在8583的16-17地址單元內
  }
  pclock->year_l=Bin_To_BCD(j);
  pclock->year_h=Bin_To_BCD(buffer_8583[1]);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩高清在线电影| 欧美唯美清纯偷拍| 亚洲男人的天堂网| 91精品国产综合久久精品麻豆| 老司机精品视频线观看86| 国产精品九色蝌蚪自拍| 欧美日韩在线三区| 波多野结衣中文一区| 日本中文字幕一区| 亚洲欧美影音先锋| 久久久一区二区三区捆绑**| 欧美日韩一区中文字幕| www.亚洲精品| 国产在线精品一区二区夜色| 亚洲免费观看高清在线观看| 久久久精品2019中文字幕之3| 欧美在线你懂得| 91在线免费播放| 国产凹凸在线观看一区二区| 免费成人在线观看| 亚洲成人av福利| 亚洲欧美日韩在线播放| 精品久久久久久综合日本欧美| 欧美日韩视频专区在线播放| 精品99一区二区三区| 亚洲丝袜美腿综合| 国产精品欧美一级免费| 欧美成人国产一区二区| 7777精品伊人久久久大香线蕉最新版| 91在线视频免费91| jlzzjlzz亚洲女人18| 国产乱一区二区| 国产真实乱子伦精品视频| 日本aⅴ亚洲精品中文乱码| 亚洲成人免费看| 亚洲综合成人网| 亚洲综合激情网| 亚洲一区自拍偷拍| 亚洲尤物视频在线| 亚洲午夜视频在线| 亚洲高清免费一级二级三级| 亚洲综合一区二区三区| 一区二区三区日韩| 亚洲一区二区三区在线播放| 亚洲欧美精品午睡沙发| 国产精品国产馆在线真实露脸 | 国产一区中文字幕| 麻豆国产精品官网| 久久av老司机精品网站导航| 美国十次综合导航| 国产伦精品一区二区三区视频青涩 | 91久久精品国产91性色tv| 成人18视频日本| 99久久99久久精品免费观看| 色综合久久久久综合体| 欧美在线制服丝袜| 在线视频欧美区| 欧美精品一卡两卡| 日韩久久久精品| 2020日本不卡一区二区视频| 久久嫩草精品久久久精品一| 中文子幕无线码一区tr| 亚洲美女一区二区三区| 亚洲精品国产品国语在线app| 亚洲精品久久久久久国产精华液| 亚洲自拍欧美精品| 麻豆国产精品一区二区三区 | 视频一区免费在线观看| 久久草av在线| 成人一二三区视频| 一本久久a久久精品亚洲| 欧美日韩1区2区| 久久久久免费观看| 亚洲日本中文字幕区| 日韩电影在线一区二区| 国产在线一区二区| 日本二三区不卡| 精品日韩99亚洲| 国产精品第13页| 国产乱理伦片在线观看夜一区| 亚洲欧洲韩国日本视频| 亚洲大片精品永久免费| 九九在线精品视频| 色老汉一区二区三区| 日韩一区国产二区欧美三区| 国产精品美女一区二区在线观看| 亚洲免费在线视频| 久久黄色级2电影| 一本大道av伊人久久综合| 欧美一区二区人人喊爽| 国产精品久久久久久妇女6080| 日韩电影免费一区| 91免费版在线| 日韩欧美一二三| 最好看的中文字幕久久| 麻豆一区二区三区| 欧美亚日韩国产aⅴ精品中极品| 日韩精品影音先锋| 国产精品短视频| 国产专区综合网| 欧美挠脚心视频网站| 国产精品色呦呦| 麻豆成人av在线| 精品视频1区2区| 国产精品久久久久久久久免费桃花| 亚洲综合色婷婷| 国产永久精品大片wwwapp| 欧美日韩一区在线| 亚洲猫色日本管| 丁香一区二区三区| 日韩欧美激情在线| 夜夜操天天操亚洲| 99re热这里只有精品免费视频| 欧美一级理论片| 综合激情成人伊人| 国产精品99久久久久久久女警 | 国产精品亚洲一区二区三区在线| 国产精品主播直播| 制服丝袜亚洲色图| 亚洲gay无套男同| 色就色 综合激情| 亚洲人成在线观看一区二区| 国产很黄免费观看久久| 678五月天丁香亚洲综合网| 有坂深雪av一区二区精品| 99精品桃花视频在线观看| 亚洲精品一区二区三区在线观看 | 午夜精品福利一区二区三区av | 亚洲成人精品一区| 在线观看日韩一区| 日韩一区在线播放| 成人黄色小视频| 国产精品丝袜91| 成人网页在线观看| 国产精品网站导航| 成人av网站免费观看| 国产日韩成人精品| 国产成人在线看| 2024国产精品| 国产毛片精品一区| 国产日韩欧美精品电影三级在线 | 9191久久久久久久久久久| 樱桃视频在线观看一区| 在线精品国精品国产尤物884a | 国产一区美女在线| 国产亚洲欧美在线| 国产99久久久国产精品| 亚洲欧美色一区| 激情av综合网| 国产亚洲精品资源在线26u| 成人一级片在线观看| 18欧美乱大交hd1984| 在线观看网站黄不卡| 亚洲成av人在线观看| 欧美精品免费视频| 日韩国产欧美一区二区三区| 日韩欧美在线123| 国产精品一二三四五| 亚洲色图.com| 欧美日韩高清一区二区| 另类小说综合欧美亚洲| 久久精品一二三| 91丨九色丨蝌蚪富婆spa| 亚洲精品一二三| 日韩亚洲电影在线| 国产高清久久久久| 亚洲人成网站色在线观看| 欧美日韩国产综合久久| 激情五月激情综合网| 国产精品国产馆在线真实露脸 | 欧美日韩精品一区二区三区蜜桃 | 国产人成亚洲第一网站在线播放| 丁香六月久久综合狠狠色| 亚洲乱码国产乱码精品精98午夜| 欧美精品电影在线播放| 国产福利91精品一区| 亚洲激情男女视频| 欧美本精品男人aⅴ天堂| av中文字幕一区| 亚洲国产一区二区在线播放| 精品日韩在线观看| 日本精品视频一区二区| 色综合天天在线| 亚洲精品乱码久久久久久黑人 | 91精品国产欧美一区二区18 | 亚洲一区二区三区美女| 在线综合亚洲欧美在线视频| 国产成人自拍高清视频在线免费播放| 亚洲精品美腿丝袜| 久久色在线视频| 欧美三级韩国三级日本一级| 午夜天堂影视香蕉久久| 国产精品免费网站在线观看| 91精品国产日韩91久久久久久| av在线不卡电影| 狠狠色综合色综合网络| 亚洲大尺度视频在线观看| 国产精品久久久久久久久图文区| 欧美一区二区视频网站| 日本韩国一区二区三区视频|