/*------------------------------------------------------------------------------
為了安全起見,程式中很多NOP是冗餘的,希望讀者能進一步精簡,但必須經過驗證。
        Atmel 24C01 比較特殊,為簡約型.
        51晶振為11.0592MHz
------------------------------------------------------------------------------*/

#include "reg51.h"
#include "intrins.h"

sbit SCL= P1^;
sbit SDA= P1^;

delay()
{
  unsigned ;
  while(i--);
}

/*------------------------------------------------------------------------------
調用方式:write_8bit(unsigned char ch)
函數說明:內函數,私有,用戶不直接調用。
------------------------------------------------------------------------------*/
void  write_8bit(unsigned char ch)
{
    unsigned ;
    SCL=;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    while (i--)
    {
        SDA=(bit)(ch&0x80);

        _nop_();_nop_();_nop_();_nop_();_nop_();

        ch<<=;
        SCL=;

        _nop_();_nop_();_nop_();_nop_();_nop_();

        SCL=;

        _nop_();_nop_();_nop_();_nop_();_nop_();
    }

    _nop_();_nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();
}

/*------------------------------------------------------------------------------
調用方式:void ACK(void)
函數說明:內函數,私有,用戶不直接調用。
------------------------------------------------------------------------------*/
void ACK(void)
{
   unsigned char time_1;

    SDA=;
    SCL=;

    _nop_();_nop_();_nop_();_nop_();_nop_();

    SCL=;
    time_1=;

    while(SDA) {if (!time_1) break;}             //ACK

    SCL=;

    _nop_();_nop_();_nop_();_nop_();_nop_();
}

unsigned char ReadIIC_24C01(unsigned char address)
{
    unsigned ;
    unsigned ;

    SCL=;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();    //Tsu:STA
    SDA=;
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();    //Thd:STA
    SCL=;                                                 //START

    write_8bit( (address<<) | 0x01);                     //寫頁位址和操作方式
    ACK();

    while (i--)
    {
        SDA=;
        ddata<<=;
        SCL=;

        _nop_();_nop_();_nop_();_nop_();_nop_();

        SCL=;

        if (SDA)
            ddata|=0x01;
    }

    SCL=;
    _nop_();
    SCL=;
    _nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SDA=;
    _nop_();
    SCL=;
    _nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SDA=;                                       //STOP
    delay();
    return ddata;

}

void WriteIIC_24C01(unsigned char address,unsigned char ddata)
{
    SCL=;
    _nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();    //Tsu:STA
    SDA=;
    _nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();    //Thd:STA
    SCL=;                                        //START

    write_8bit( (address<<) & 0xfe);            //寫頁位址和操作方式,對於24C32-24C256,page不起作用
    ACK();
    write_8bit(ddata);                            //發送資料
    ACK();
    SDA=;
    _nop_();
    SCL=;
    _nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SDA=;                                        //STOP
    delay();
}

24C01的IIC 讀寫的c51程式的更多相关文章

  1. mysql proxy讀寫分流(二)-加入RW splitting

    上一篇中提到 安裝LUA及MySQL Proxy後,接下來就是RW splitting(讀寫分流)的部份了 整體的概念圖跟上一篇MySQL Proxy安裝方式相同,丫忠再補上一個對應port的圖表: ...

  2. 使用Device IO Control 讀寫 USB Mass Storage

    http://www.ezblog.idv.tw/Download/USBStorage.rar 這是一個不透過檔案系統,去讀寫USB Mass Storage 任何位置(包含FAT)的方式 首先需安 ...

  3. (C/C++) FILE 讀寫檔案操作

    在C/C++ 讀寫檔案操作比較常見應該是利用 FILE.ifstream.ofstream 在這篇筆記裡頭記錄 FILE.fstream 使用方法及操作 #include <iostream&g ...

  4. 安卓初級教程(2):SD創建file,儲存與讀寫的方法(1)

    package com.sdmadik; import java.io.*; import android.app.Activity; import android.os.Bundle; import ...

  5. [ASP.NET] 檔案讀寫權限問題

    今天遇到一個問題,環境如下: IIS Server: Server 2008 R2 沒加域 File Server: Server 2003 加域 當我的Web程序需要把位於File Server的一 ...

  6. IIS ApplicationPoolIdentity(配置IIS讀寫網站文件)

    原创地址:http://www.cnblogs.com/jfzhu/p/4067297.html 转载请注明出处 从IIS 7.5开始,Application Pool Identity的Built- ...

  7. Caffe 源碼閱讀(一) Blob.hpp

    Blob 四維度(N K H W) N : SGD 一次 mini-batch 個數 K : 如果是圖片表示圖片通道數 如果是中間結果 則理解爲 feature map 個數 H.W : 如果是圖片理 ...

  8. 無法使用 system/bin/r 讀取 pmic pm8937 hardware regitster 的原因

    Platform Qualcomm MSM8917 + PM8937 + PMI8940 起因 同事問我 PM8937 的 VREG_L17 如何設定成 3.3V, 從 PM8937 hardware ...

  9. Python 基礎 - 文件操作_v2

    嗯,那如何要把游標的位置給打印來? #!/usr/bin/env python3 # -*- coding:utf-8 -*- f = open('test', 'r') print(f.tell() ...

随机推荐

  1. js深入研究之神奇的匿名函数类生成方式

    <script type="text/javascript"> var Book = (function() { // 私有静态属性 ; // 私有静态方法 funct ...

  2. 2015第19周三小众app

    今天搜集下个人知道好玩的小众app: 1.开眼每日推荐5个小视频,世界那么大,一起来看看吧. 2.懒人周末周末去哪了?简洁美观 3.LOFTER 网易良心出品. 4.玩儿去 发现很多很多好玩的去处 5 ...

  3. MVC4.0 Controller和View重复加载

    项目完成以后总是感觉有一些页面跑起来特别的慢,就仔细的调试了下,发现有很多也买年都是走了两遍,页面加载的时候Controller和View会连续走了两次,没有一点缘由 查了很久也不知道什么原因,这个问 ...

  4. backbone教程

    http://blog.csdn.net/column/details/backbone-js-tutorial.html

  5. log4j 突然不打印记录,提示:No appenders could be found for logge,处理方法

    log4j 一直都在使用正常,log4j.xml配置.代码都没有修改,突然不打印记录,出现下面提示: log4j:WARN No appenders could be found for logger ...

  6. VSCode

    下载: 打开终端控制器 wget http://download.microsoft.com/download/0/D/5/0D57186C-834B-463A-AECB-BC55A8E466AE/V ...

  7. hdu 3056 病毒侵袭持续中 AC自己主动机

    http://acm.hdu.edu.cn/showproblem.php?pid=3065 刘汝佳的模板真的非常好用,这道题直接过 学到: cnt数组记录单词出现次数 以及map存储单词编号与字符串 ...

  8. C++11下的线程池以及灵活的functional + bind + lamda

    利用boost的thread实现一个线程类,维护一个任务队列,以便可以承载非常灵活的调用.这个线程类可以方便的为后面的线程池打好基础.线程池还是动态均衡,没有什么别的.由于minGW 4.7 对 C+ ...

  9. 纯CSS实现带小角的对话框式下拉菜单

    最近公司首页样式重写,头部下拉菜单改为了带小角的对话框式下拉菜单: 很多人可能会用图片,事实上纯CSS就能够实现: HTML: <!DOCTYPE html> <html lang= ...

  10. Linq中的多表左联,详细语句

    from m in context.WX_MemberCollectDish join d in context.Dish on m.DishID equals d.DishID into temp ...