📄 i2c.c
字号:
/*
+---------------------------------------------------+
| Project: TR2007 with UPSD3234A |
| File: I2C.c |
| Data: 2007-01-18 |
| Version: V 1.0 |
| Initial Editor: Li Jifeng |
+---------------------------------------------------+
| following environments are supported |
| Processor: UPSD3234A |
| Compiler: Keil uVision2 V7.50 Full |
| hardware: PH-2004 |
+---------------------------------------------------+
| Copyright (C) PH Ltd, 2006 |
| All Rights reserved |
+---------------------------------------------------+
| 功能简介: the I2C function |
+---------------------------------------------------+
*/
#include "system.h"
/***********************************************************************************
函数名称:Delay_1_uS()
功能描述:延时子程序
参 数:无
***********************************************************************************/
void Delay_1_uS(void)
{unsigned char data i=2;
while(i--);
}
/***********************************************************************************
函数名称:Delay_N_mS()
功能描述:延时子程序
参 数:n_milisecond
***********************************************************************************/
void Delay_N_mS(unsigned int data n)
{unsigned char data i;
while(n--)
{i=10;
while(i--);
}
}
/***********************************************************************************
函数名称:I2C_Start()
功能描述:I2C起始信号子程序
参 数:无
***********************************************************************************/
bit I2C_Start(void)
{Delay_1_uS();
I2C_SDA=1;
Delay_1_uS();
I2C_SCK=1;
Delay_1_uS();
if(I2C_SDA==0) return 0;
if(I2C_SCK==0) return 0;
I2C_SDA=0;
Delay_1_uS();
I2C_SCK=0;
Delay_1_uS();
return 1;
}
/***********************************************************************************
函数名称:I2C_Stop()
功能描述:I2C停止信号子程序
参 数:无
***********************************************************************************/
void I2C_Stop(void)
{Delay_1_uS();
I2C_SDA=0;
Delay_1_uS();
I2C_SCK=1;
Delay_1_uS();
I2C_SDA=1;
Delay_1_uS();
}
/***********************************************************************************
函数名称:I2C_Ack()
功能描述:I2C应答子程序
参 数:无
***********************************************************************************/
void I2C_Ack(void)
{Delay_1_uS();
I2C_SDA=0;
Delay_1_uS();
I2C_SCK=1;
Delay_1_uS();
I2C_SCK=0;
Delay_1_uS();
}
/***********************************************************************************
函数名称:I2C_Nack()
功能描述:I2C非应答子程序
参 数:无
***********************************************************************************/
void I2C_Nack(void)
{Delay_1_uS();
I2C_SDA=1;
Delay_1_uS();
I2C_SCK=1;
Delay_1_uS();
I2C_SCK=0;
Delay_1_uS();
}
/***********************************************************************************
函数名称:I2C_Send_Byte()
功能描述:I2C发送字节子程序
参 数:无
***********************************************************************************/
bit I2C_Send_Byte(unsigned char data d)
{unsigned char data i=8;
bit bit_ack;
while(i--)
{Delay_1_uS();
if(d&0x80) I2C_SDA=1;
else I2C_SDA=0;
Delay_1_uS();
I2C_SCK=1;
Delay_1_uS();
I2C_SCK=0;
d=d<<1;
}
Delay_1_uS();
I2C_SDA=1;
Delay_1_uS();
I2C_SCK=1;
Delay_1_uS();
bit_ack=I2C_SDA;
I2C_SCK=0;
Delay_1_uS();
return bit_ack;
}
/***********************************************************************************
函数名称:I2C_Receive_Byte()
功能描述:I2C接收字节子程序
参 数:无
***********************************************************************************/
unsigned char I2C_Receive_Byte(void)
{unsigned char data i=8, d;
Delay_1_uS();
I2C_SDA=1;
while(i--)
{d=d<<1;
Delay_1_uS();
I2C_SCK=1;
Delay_1_uS();
if(I2C_SDA) d++;
I2C_SCK=0;
}
return d;
}
/***********************************************************************************
函数名称:AT24C128_write()
功能描述:24C128写数据子程序
参 数:AT24C128_address:24C128地址
dat_address:24C128数据地址
*dat:数据指针
j:数据长度
***********************************************************************************/
bit AT24C128_write(unsigned int data dat_address,unsigned char *dat,unsigned char data n)
{
if(I2C_Start())
{if(!I2C_Send_Byte(0xa0))
{if(!I2C_Send_Byte(dat_address/256))
{if(!I2C_Send_Byte(dat_address%256))
{while(n--)
{if(!I2C_Send_Byte(*dat))
dat++;
else return 0;
}
I2C_Stop();
Delay_N_mS(50);
return 1;
}
else return 0;
}
else return 0;
}
else return 0;
}
else return 0;
}
/***********************************************************************************
函数名称:AT24C128_read()
功能描述:24C128读数据子程序
参 数:AT24C128_address:24C128地址
dat_address:24C128数据地址
*dat:数据指针
j:数据长度
***********************************************************************************/
bit AT24C128_read(unsigned int data dat_address,unsigned char *dat,unsigned int data n)
{
if(I2C_Start())
{if(!I2C_Send_Byte(0xa0))
{if(!I2C_Send_Byte(dat_address/256))
{if(!I2C_Send_Byte(dat_address%256))
{if(I2C_Start())
{if(!I2C_Send_Byte(0xa1))
{while(--n)
{*dat=I2C_Receive_Byte();
dat++;
I2C_Ack();
}
*dat=I2C_Receive_Byte();
I2C_Nack();
I2C_Stop();
Delay_N_mS(20);
return 1;
}
else return 0;
}
else return 0;
}
else return 0;
}
else return 0;
}
else return 0;
}
else return 0;
}
/*
0x0000 用户数
0x0001 0x0002 LOADP
0x0003 0x0004 SAVEP
0x0005 D7_flag D0_flag
0x0006 继电器执行时间 relay_timer,relay_timer1
0x0007 开门后等待进入的延时时间 open_timer,open_timer1
0x0008 红外报警输出的被确认时间 infrared_alarm_timer,infrared_alarm_timer1
0x0009 设定异地报警的延时时间 exotic_alarm_timer,exotic_alarm_timer1
0x000A 开启红外监控后的等待延时 infrared_comm_timer,infrared_comm_timer1
0x000B col_flag1
0x000C col_flag2
0x000D col_flag3
0x000F 节假日数
0x0010-0x001F 用户1
0x0020-0x002F 用户2
| | |
0x03C0-0x03CF 用户60
0x1000-0x101F 星期时段一 星期一 0x1020-0x103F 星期时段一 星期二
0x1040-0x105F 星期时段一 星期三 0x1060-0x107F 星期时段一 星期四
0x1080-0x109F 星期时段一 星期五 0x10A0-0x10BF 星期时段一 星期六
0x10C0-0x10DF 星期时段一 星期日
0x10E0-0x10FF 星期时段二 星期一 0x1100-0x111F 星期时段二 星期二
0x1120-0x113F 星期时段二 星期三 0x1140-0x115F 星期时段二 星期四
0x1160-0x117F 星期时段二 星期五 0x1180-0x119F 星期时段二 星期六
0x11A0-0x11BF 星期时段二 星期日
0x11C0-0x11DF 星期时段三 星期一 0x11E0-0x11FF 星期时段三 星期二
0x1200-0x121F 星期时段三 星期三 0x1220-0x123F 星期时段三 星期四
0x1240-0x125F 星期时段三 星期五 0x1260-0x127F 星期时段三 星期六
0x1280-0x129F 星期时段三 星期日
0x12A0-0x12BF 星期时段四 星期一 0x12C0-0x12DF 星期时段四 星期二
0x12E0-0x12FF 星期时段四 星期三 0x1300-0x131F 星期时段四 星期四
0x1320-0x133F 星期时段四 星期五 0x1340-0x135F 星期时段四 星期六
0x1360-0x137F 星期时段四 星期日
0x1380-0x139F 星期时段五 星期一
0x13A0-0x13BF 星期时段五 星期二
0x13C0-0x13DF 星期时段五 星期三
0x13E0-0x13FF 星期时段五 星期四
0x1400-0x141F 星期时段五 星期五
0x1420-0x143F 星期时段五 星期六
0x1440-0x145F 星期时段五 星期日
0x1460-0x147F 星期时段六 星期一
0x1480-0x149F 星期时段六 星期二
0x14A0-0x14BF 星期时段六 星期三
0x14C0-0x14DF 星期时段六 星期四
0x14E0-0x14FF 星期时段六 星期五
0x1500-0x151F 星期时段六 星期六
0x1520-0x153F 星期时段六 星期日
0x1540-0x155F 星期时段七 星期一
0x1560-0x157F 星期时段七 星期二
0x1580-0x159F 星期时段七 星期三
0x15A0-0x15BF 星期时段七 星期四
0x15C0-0x15DF 星期时段七 星期五
0x15E0-0x15FF 星期时段七 星期六
0x1600-0x161F 星期时段七 星期日
0x1620-0x163F 星期时段八 星期一
0x1640-0x165F 星期时段八 星期二
0x1660-0x167F 星期时段八 星期三
0x1680-0x169F 星期时段八 星期四
0x16A0-0x16BF 星期时段八 星期五
0x16C0-0x16DF 星期时段八 星期六
0x16E0-0x16FF 星期时段八 星期日
0x1700-0x171F 星期时段九 星期一
0x1720-0x173F 星期时段九 星期二
0x1740-0x175F 星期时段九 星期三
0x1760-0x177F 星期时段九 星期四
0x1780-0x179F 星期时段九 星期五
0x17A0-0x17BF 星期时段九 星期六
0x17C0-0x17DF 星期时段九 星期日
0x17E0-0x17FF 星期时段十 星期一
0x1800-0x181F 星期时段十 星期二
0x1820-0x183F 星期时段十 星期三
0x1840-0x185F 星期时段十 星期四
0x1860-0x187F 星期时段十 星期五
0x1880-0x189F 星期时段十 星期六
0x18A0-0x18BF 星期时段十 星期日
0x18C0-0x18DF 星期时段11 星期一
0x18E0-0x18FF 星期时段11 星期二
0x1900-0x191F 星期时段11 星期三
0x1920-0x193F 星期时段11 星期四
0x1940-0x195F 星期时段11 星期五
0x1960-0x197F 星期时段11 星期六
0x1980-0x199F 星期时段11 星期日
0x19A0-0x19BF 星期时段12 星期一
0x19C0-0x19DF 星期时段12 星期二
0x19E0-0x19FF 星期时段12 星期三
0x1A00-0x1A1F 星期时段12 星期四
0x1A20-0x1A3F 星期时段12 星期五
0x1A40-0x1A5F 星期时段12 星期六
0x1A60-0x1A7F 星期时段12 星期日
0x1A80-0x1A9F 星期时段13 星期一
0x1AA0-0x1ABF 星期时段13 星期二
0x1AC0-0x1ADF 星期时段13 星期三
0x1AE0-0x1AFF 星期时段13 星期四
0x1B00-0x1B1F 星期时段13 星期五
0x1B20-0x1B3F 星期时段13 星期六
0x1B40-0x1B5F 星期时段13 星期日
0x1B60-0x1B7F 星期时段14 星期一
0x1B80-0x1B9F 星期时段14 星期二
0x1BA0-0x1BBF 星期时段14 星期三
0x1BC0-0x1BDF 星期时段14 星期四
0x1BE0-0x1BFF 星期时段14 星期五
0x1C00-0x1C1F 星期时段14 星期六
0x1C20-0x1C3F 星期时段14 星期日
0x1C40-0x1C5F 星期时段15 星期一
0x1C60-0x1C7F 星期时段15 星期二
0x1C80-0x1C9F 星期时段15 星期三
0x1CA0-0x1CBF 星期时段15 星期四
0x1CC0-0x1CDF 星期时段15 星期五
0x1CE0-0x1CFF 星期时段15 星期六
0x1D00-0x1D1F 星期时段15 星期日
0x1D20-0x1D3F 星期时段16 星期一
0x1D40-0x1D5F 星期时段16 星期二
0x1D60-0x1D7F 星期时段16 星期三
0x1D80-0x1D9F 星期时段16 星期四
0x1DA0-0x1DBF 星期时段16 星期五
0x1DC0-0x1DDF 星期时段16 星期六
0x1DE0-0x1DFF 星期时段16 星期日
0x1E00-0x1E0F 工作日时段一
0x1E10-0x1E1F 工作日时段二
0x1E20-0x1E2F 工作日时段三
0x1E30-0x1E3F 工作日时段四
0x1E40-0x1E4F 非工作日时段
0x1E50-0x1E5F 门常开时段
0x1E60-0x1E6F 刷卡加密时段
0x1E70-0x1E7F 门常闭时段
0x1E80-0x1E8F 门磁红外监控时段
0x1E90-0x1E91 每周休息日
0x1EA0-0x1EAF 节假日
0x1EB0-0x1EBF 节假日
0x2000-0x200F 记录1
0x2010-0x201F 记录2
| | |
0x3FF0-0x3FFF 记录512
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -