📄 i2c.lst
字号:
C51 COMPILER V7.50 I2C 04/25/2007 20:35:55 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\I2C.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\..\I2C\Src\I2C.C BROWSE DEFINE(DEVICE_TYPE_ICIDSERVER,USE_DEVICE_PCF8563
-) DEBUG OBJECTEXTEND PRINT(.\I2C.lst) OBJECT(.\I2C.obj)
line level source
1 //############################ I2C 读写程序 #################################//
2 #include <reg52.h>
3 #include <intrins.h>
4 #include "..\Include\I2CDEF.h"
5
6 #ifdef EN_I2C_WRITEWAIT
void I2C_Delay(unsigned int time)
{
unsigned int idata j;
unsigned int idata i;
for(j=0;j<15;j++)
{
for(i=0;i<time;i++)
_nop_();
}
}
#endif
18 /***************************************************************************/
19 void I2C_Start() //起始条件子函数
20 {
21 1 I2C_SDA=1; //启动I2C总线
22 1 nop();
23 1 I2C_SCL=1;
24 1 nop();
25 1 I2C_SDA=0;
26 1 nop();
27 1 I2C_SCL=0;
28 1 nop();
29 1 }
30
31 /***************************************************************************/
32 void I2C_Stop() //停止条件子函数
33 {
34 1 I2C_SCL=0;
35 1 nop();
36 1 I2C_SDA=0; //停止I2C总线数据传送
37 1 nop();
38 1 I2C_SCL=1;
39 1 nop();
40 1 I2C_SDA=1;
41 1 nop();
42 1 }
43
44 /***************************************************************************/
45 void I2C_Ack() //发送应答子函数
46 {
47 1 I2C_SDA=0; //发送应答位
48 1 nop();
49 1 I2C_SCL=1;
50 1 nop();
51 1 I2C_SCL=0;
52 1 nop();
53 1 I2C_SDA=1;
54 1 nop();
C51 COMPILER V7.50 I2C 04/25/2007 20:35:55 PAGE 2
55 1 }
56
57 /***************************************************************************/
58 void I2C_NoAck() //发送非应答子函数
59 {
60 1 I2C_SDA=1; //发送非应答位
61 1 nop();
62 1 I2C_SCL=1;
63 1 nop();
64 1 I2C_SCL=0;
65 1 nop();
66 1 }
67
68 /***************************************************************************/
69 bit I2C_TestAck() //应答位检测子函数
70 {
71 1 bit ErrorBit;
72 1 I2C_SDA=1;
73 1 nop();
74 1 I2C_SCL=1;
75 1 nop();
76 1 ErrorBit=I2C_SDA;
77 1 I2C_SCL=0;
78 1 nop();
79 1 return(ErrorBit);
80 1 }
81
82 /***************************************************************************/
83 I2C_Write8Bit(unsigned char input) //发送一个字节子函数
84 {
85 1 unsigned char temp;
86 1 for(temp=8;temp!=0;temp--)
87 1 {
88 2 I2C_SDA=(bit)(input&0x80); //若要发送的数据最高位为1,则发送1
89 2 nop();
90 2 I2C_SCL=1;
91 2 nop();
92 2 I2C_SCL=0;
93 2 nop();
94 2 input=input<<1;
95 2 }
96 1 }
97
98 /***************************************************************************
99 描述:
100 I2C_Write(unsigned char *buffer,unsigned int address,unsigned char len,unsigned char devicNO)
101 为I2C连写函数
102 参数:buffer为写入数据缓冲区指针,address为写入数据地址,
103 len为写入数据长度,
104 devicNO为I2C设备的访问地址
105
106 ***************************************************************************/
107 void I2C_Write(unsigned char *buffer,unsigned int address,unsigned char len,unsigned char devicNO)
108 {
109 1 #ifdef EN_I2C_WRITEDISINTERR
bit Tmp;
Tmp = EA;
EA=0;
#endif
114 1 I2C_Start();
115 1 I2C_Write8Bit(devicNO);
116 1 I2C_TestAck();
C51 COMPILER V7.50 I2C 04/25/2007 20:35:55 PAGE 3
117 1 if(address >> 8)
118 1 {
119 2 I2C_Write8Bit(address >> 8);
120 2 I2C_TestAck();
121 2 }
122 1 I2C_Write8Bit((unsigned char)address);
123 1 I2C_TestAck();
124 1 while(len--)
125 1 {
126 2 I2C_Write8Bit(*buffer);
127 2 I2C_TestAck();
128 2 buffer++;
129 2 }
130 1 I2C_Stop();
131 1 #ifdef EN_I2C_WRITEWAIT
#ifdef USE_DEVICE_IIC24CXX
I2C_Delay(8);
#else
I2C_Delay(2);
#endif
#endif
138 1 #ifdef EN_I2C_WRITEDISINTERR
EA=Tmp;
#endif
141 1 }
142
143 /***************************************************************************/
144 unsigned char I2C_Read8Bit() //接收1个字节子函数
145 {
146 1 unsigned char temp,rbyte=0;
147 1 for(temp=8;temp!=0;temp--)
148 1 {
149 2 I2C_SCL=1;
150 2 nop();
151 2 nop();
152 2 rbyte = ( rbyte << 1 );
153 2 rbyte = ( rbyte | ((unsigned char)(I2C_SDA)) );
154 2 I2C_SCL=0;
155 2 nop();
156 2 }
157 1 return(rbyte);
158 1 }
159
160 /***************************************************************************
161 描述:
162 I2C_Read(unsigned char *buffer,unsigned int address,unsigned char len,unsigned char devicNO)
163 为I2C连读函数
164 参数:buffer为读出数据缓冲区指针,address为读数据起始地址,
165 len为读出数据长度,
166 devicNO为I2C设备的访问地址
167 ****************************************************************************/
168 void I2C_Read(unsigned char *buffer,unsigned int address,unsigned char len,unsigned char devicNO)
169 {
170 1 I2C_Start();
171 1 I2C_Write8Bit(devicNO);
172 1 I2C_TestAck();
173 1 if(address >> 8)
174 1 {
175 2 I2C_Write8Bit(address >> 8);
176 2 I2C_TestAck();
177 2 }
178 1 I2C_Write8Bit((unsigned char)address);
C51 COMPILER V7.50 I2C 04/25/2007 20:35:55 PAGE 4
179 1 I2C_TestAck();
180 1 I2C_Start();
181 1 I2C_Write8Bit(devicNO+1);
182 1 I2C_TestAck();
183 1 while(--len)
184 1 {
185 2 *buffer=I2C_Read8Bit();
186 2 I2C_Ack();
187 2 buffer++;
188 2 }
189 1 *buffer=I2C_Read8Bit();
190 1 I2C_NoAck();
191 1 I2C_Stop();
192 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 222 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 14
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -