?? 2401.c
字號:
/******************************************************************
本程序只供學習使用,未經作者許可,不得用于其它任何用途
我的郵箱:computer-lov@tom.com
歡迎訪問我的blog: http://computer00.21ic.org
2401.c文件 2401-I2CROM的讀寫函數
Created by Computer-lov
Date: 2004.11.12
Edit date:2006.3.2
Version V1.0
Copyright(C) Computer-lov 2004-2014
All rigths reserved
*******************************************************************/
#include "hardware.h"
#include "2401.h"
#include "main.h"
void delay(void) //延時子程序
{
unsigned char i;
for(i=0;i<1;i++);
}
//************************************** 將一個字節保存到EEROM中 *****************************************
unsigned char Write_a_EEPROM_data(unsigned char device_addr,unsigned char data_addr,unsigned char w_data)
{
unsigned char i,Device_Addr;
if(NO_2401)return 0xFF;
delay();
SDA=0; //產生一個起始位
delay();
Device_Addr=device_addr; //EEROM的地址暫存
for(i=0;i<7;i++) //輸出設備地址
{
SCL=0;
delay();
SDA=device_addr&0x80; //SDA上輸出一位數據,高位在前
device_addr<<=1;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=0; //SDA上輸出0,表示寫操作
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=1; //釋放SDA線
delay();
SCL=1;
delay();
if(SDA){return 1;} //如果設備未響應,則返回出錯代碼1
for(i=0;i<8;i++) //輸出數據地址
{
SCL=0;
delay();
SDA=data_addr&0x80; //SDA上輸出一位數據,高位在前
data_addr<<=1;
delay();
SCL=1;
delay();
delay();
}
SCL=0;
delay();
SDA=1; //釋放SDA線
delay();
SCL=1;
delay();
if(SDA){return 2;} //如果設備未響應,則返回出錯代碼2
for(i=0;i<8;i++) //輸出要寫入的數據
{
SCL=0;
delay();
SDA=w_data&0x80; //SDA上輸出一位數據,高位在前
w_data<<=1;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1; //釋放SDA線
delay();
SCL=1;
delay();
if(SDA){return 3;} //如果設備未響應,則返回出錯代碼3
SCL=0;
delay();
SDA=0;
delay();
SCL=1;
delay();
SDA=1; //產生一個停止位,停止操作
for(i=0;i<250;i++) //等待數據寫入
{
delay();
}
for(i=0;i<250;i++)delay();
return 0; //正確寫入,返回0
}
//****************************************************************************************
//********************************* 從EEROM中讀取一個字節 *****************************
unsigned int Read_a_EEPROM_data(unsigned char device_addr,unsigned char data_addr)
{
unsigned char i,r_data,Device_Addr;
SDA=0; //產生一個起始位
delay();
Device_Addr=device_addr; //EEROM的地址暫存
for(i=0;i<7;i++) //輸出設備地址
{
SCL=0;
delay();
SDA=device_addr&0x80; //SDA上輸出一位數據,高位在前
device_addr<<=1;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=0; //SDA上輸出0,表示寫操作
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=1; //釋放SDA線
delay();
SCL=1;
delay();
if(SDA) return 0x0100; //如果設備未響應,則返回出錯代碼0x0100
for(i=0;i<8;i++) //輸出數據地址
{
SCL=0;
delay();
SDA=data_addr&0x80; //SDA上輸出一位數據,高位在前
data_addr<<=1;
delay();
SCL=1;
delay();
delay();
}
SCL=0;
delay();
SDA=1; //釋放SDA線
delay();
SCL=1;
delay();
if(SDA) return 0x0200; //如果設備未響應,則返回出錯代碼0x0200
SCL=0;
delay();
SDA=1;
delay();
SCL=1;
delay();
SDA=0; //產生一個重啟動位
delay();
device_addr=Device_Addr; //EEROM的地址
for(i=0;i<7;i++) //輸出設備地址,一個7位的地址
{
SCL=0;
delay();
SDA=device_addr&0x80; //SDA上輸出一位數據,高位在前
device_addr<<=1;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1; //SDA上輸出1,表示讀操作
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=1; //釋放SDA線
delay();
SCL=1;
delay();
if(SDA) return 0x0300; //如果設備未響應,則返回出錯代碼0x0300
for(i=0;i<8;i++) //從EEROM中讀出數據
{
SCL=0;
delay();
r_data<<=1;
delay();
SCL=1;
if(SDA)r_data=r_data|0x01; //保存一位數據
delay();
}
SCL=0;
delay();
SDA=1; //置SDA高電平,表示停止讀出
delay();
SCL=1;
delay();
SCL=0;
delay();
SDA=0;
delay();
SCL=1;
delay();
SDA=1; //產生一個停止位,停止讀操作
return r_data; //返回數據
}
//****************************************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -