欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2767|回復: 0
打印 上一主題 下一主題
收起左側

AT24C02 IIC驅動 C代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:75926 發表于 2015-4-10 17:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #define SCL_L  //拉低SCL線的宏
  2. #define SCL_H  //拉高SCL線的宏
  3. #define SDA_L  //拉低SDA線的宏
  4. #define SDA_H  //拉高SDA線的宏
  5. #define SDA_Read //讀SDA線的宏
  6. #define Wait //延時宏 大約為5us

  7. void IIC_Start(void)//啟動IIC函數
  8. {
  9.     SDA_H;
  10.     SCL_H;
  11.     Wait;
  12.     SDA_L;
  13.     Wait;
  14.     SCL_L;
  15.     Wait;
  16. }
  17. void IIC_Stop(void)//停止IIC函數
  18. {
  19.     SDA_L;
  20.     SCL_H;
  21.     Wait;
  22.     SDA_H;
  23. }
  24. void IIC_Send_Byte(uint8_t data)//想IIC器件發送8個位數據
  25. {
  26.     uint8_t i;
  27.     for(i=0;i<8;i++)
  28.     {
  29.         if(data&(0x80>>i))
  30.             SDA_H;
  31.         else
  32.              SDA_L;
  33.         Wait;
  34.         SCL_H;
  35.         Wait;
  36.         SCL_L;
  37.         Wait;
  38.     }
  39.         SDA_H;
  40.         Wait;
  41. }

  42. uint8_t IIC_Read_Byte()//讀取8位數據
  43. {
  44.     uint8_t i,buff=0x00;
  45.     for(i=0;i<8;i++)
  46.     {
  47.         buff<<=1;
  48.         SCL_H;
  49.         Wait;
  50.         if(SDA_Read)
  51.             buff|=0x01;
  52.         SCL_L;
  53.         Wait;
  54.     }
  55.     return buff;
  56. }

  57. uint8_t Wait_Ack(void)//等待應答
  58. {
  59.     uint8_t flag;
  60.     SDA_H;
  61.     Wait;
  62.     SCL_H;
  63.     Wait;
  64.     if(SDA_Read)
  65.         flag=1;
  66.     else
  67.         flag=0;
  68.     SCL_L;
  69.     Wait;
  70.     return flag;
  71. }

  72. void Ack(void)//發送應答
  73. {
  74.     SDA_L;
  75.     Wait;
  76.     SCL_H;
  77.     Wait;
  78.     SCL_L;
  79.     Wait;
  80.     SDA_H;
  81. }

  82. void NAck(void)//發送非應答
  83. {
  84.     SDA_H;
  85.     Wait;
  86.     SCL_H;
  87.     Wait;
  88.     SCL_L;
  89.     Wait;
  90. }

  91. uint8_t AT24C02_Pag_Write(uint8_t address,uint8_t *data,uint8_t size)//AT24C02寫數據函數  第一個參數是 AT24C02的要寫頁的地址 0-255,第二個參數是 緩沖區指針,第三個參數是 要寫的字節數//不能超過8個字節
  92. {
  93.     uint8_t i;
  94.     IIC_Stop();
  95.     for(i=0;i<100;i++)
  96.     {
  97.         IIC_Start();
  98.         IIC_Send_Byte(0xa0);
  99.         if(Wait_Ack()==0)
  100.             {
  101.                 break;
  102.             }
  103.     }
  104.     if(m=100)
  105.     {
  106.         IIC_Stop();
  107.         return 0;   
  108.     }
  109.     IIC_Send_Byte(address);
  110.     if(Wait_Ack())
  111.         {
  112.                IIC_Stop();
  113.             return 0;
  114.         }
  115.     for(i=0;i<size;i++)
  116.     {
  117.         IIC_Send_Byte(*(data+i));
  118.         if(Wait_Ack())
  119.             {
  120.                 IIC_Stop();
  121.                 return 0;
  122.             }
  123.     }
  124.     IIC_Stpo();
  125.     return 1;
  126. }
  127. uint8_t AT24C02_Write(uint8_t address,uint8_t *data,uint8_t size)//對任意AT24C02的地址進行寫操作  其中第一個參數是 AT24C02要寫的地址 第二個參數是 緩沖區指針 第三個參數是 要寫的字節數 0-255;
  128. {
  129.     uint8_t Page=0;//所需要的頁數
  130.     uint8_t Cont=0;//不足一頁的字節數
  131.     uint8_t Add_Pag=0;//某一頁已經寫了的字節數
  132.     uint8_t Sur=0;//某一頁還能寫的字節數
  133.    
  134.     Page=size/8;
  135.     Cont=size%8;
  136.     Add_Pag=address%8;
  137.     Sur=8-Add_Pag;
  138.    
  139.     if(Add_Pag==0)
  140.     {
  141.         if(Page==0)
  142.         {
  143.             AT24C02_Pag_Write(address,data,size);
  144.             Delay();//此函數沒有定義 需要自己定義 大約延時2000us
  145.         }
  146.         else
  147.         {
  148.             while(Page--)
  149.             {
  150.                 AT24C02_Pag_Write(address,data,8);
  151.                 Delay();
  152.                 address+=8;
  153.                 data+=8;
  154.             }
  155.             if(Cont!=0)
  156.             {
  157.                 AT24C02_Pag_Write(address,data,Cont);
  158. Delay(2000);
  159.             }
  160.         }
  161.     }
  162.     else
  163.     {
  164.         if(Page==0)
  165.         {
  166.             if(Sur>=size)
  167.             {
  168.                 AT24C02_Pag_Write(address,data,size);
  169.                 Delay;
  170.             }
  171.             else
  172.             {
  173.                 AT24C02_Pag_Write(address,data,Sur);
  174.                 Delay;
  175.                 address+=Sur;
  176.                 data+=Sur;
  177.                 AT24C02_Pag_Write(address,data,size-Sur) ;
  178.                 Delay;
  179.             }
  180.         }
  181.         else
  182.         {
  183.             AT24C02_Pag_Write(address,data,Sur);
  184. Delay(2000);
  185. address+=Sur;
  186. data+=Sur;
  187. Page=size/8;
  188. Cont=size%8;
  189. Add_Page=address%8;
  190. Sur=8-Add_Page;
  191. if(Page==0)//
  192. {
  193.         AT24C02_Pag_Write(address,data,size);
  194.         Delay(2000);
  195. }
  196. else//
  197. {
  198. while(Page--)
  199. {
  200. AT24C02_Pag_Write(address,data,8);
  201. Delay(2000);
  202. address+=8;
  203. data+=8;
  204. }
  205.             if(Cont!=0)
  206. {
  207. AT24C02_Pag_Write(address,data,Cont);
  208. Delay(2000);
  209. }
  210. }
  211.         }
  212.     }
  213. }


  214. uint8_t AT24C02_Read(uint8_t address,uint8_t *data,uint8_t size)//從AT24C02讀取size個字節 第一個參數是 讀AT24C02 的數據的首地址 第二個參數是 緩沖區指針 第三個參數是 要讀取的字節數
  215. {
  216.     uint8_t i;
  217.     IIC_Start();
  218.     IIC_Send_Byte(0xa0);
  219.     if(Wait_Ack())
  220.     {
  221.         IIC_Stop();
  222.         return 0;
  223.     }
  224.     IIC_Send_Byte(address)
  225.     if(Wait_Ack())
  226.     {
  227.         IIC_Stop();
  228.         return 0;
  229.     }
  230.     IIC_Start();
  231.     IIC_Send_Byte(0xa1);
  232.     if(Wait_Ack())
  233.     {
  234.         IIC_Stop();
  235.         return 0;
  236.     }
  237.     for(i=0;i<size;i++)
  238.     {
  239.         *(data+i)=IIC_Read_Byte();
  240.         if(i!=size-1)
  241.         {
  242.             Ack();
  243.         }
  244.         else
  245.         {
  246.             NAck();
  247.         }
  248.     }
  249.     IIC_Stop();
  250.     return 1;
  251. }
復制代碼


評分

參與人數 1黑幣 +5 收起 理由
細風 + 5 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表