📄 i2c.lst
字号:
C51 COMPILER V8.08 I2C 09/28/2008 12:02:41 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2
3 #include <REG52.h>
4 #include "I2C.h"
5 #include "delay.h"
6
7 #define DelayTime 100 //延迟时间,频率越高适当增加
8
9
10
11 bit ACK;
12
13 sbit a0 = ACC^0; //定义ACC位,使用ACC读写速度最快
14 sbit a1 = ACC^1;
15 sbit a2 = ACC^2;
16 sbit a3 = ACC^3;
17 sbit a4 = ACC^4;
18 sbit a5 = ACC^5;
19 sbit a6 = ACC^6;
20 sbit a7 = ACC^7;
21
22
23 void I2CStart (void) //总线开始函数
24 {
25 1 sda=1;
26 1 scl=1;
27 1 Delay(5); //起始条件建立时间大于4.7us
28 1 sda=0;
29 1 Delay(5); //起始条件锁定时大于4us
30 1 scl=0;
31 1 Delay(5); //钳住总线,准备发数据
32 1 }
33
34 void I2CStop (void) //总线停止函数
35 {
36 1 sda=0; //发送结束条件的时钟信号
37 1 scl=1;
38 1 Delay(5); //结束总线时间大于4us
39 1 sda=1; //结束总线
40 1 Delay(5); //保证一个终止信号和起始信号的空闲时间大于4.7us
41 1 }
42
43 bit CheckACK (void) //检查应答函数
44 {
45 1 sda=1;
46 1 scl=1;
47 1 Delay(2);
48 1 ACK=sda;
49 1 Delay(2);
50 1 scl=0;
51 1 if (ACK==1) return 0; //没有应答返回0
52 1 return 1; //有应答返回1
53 1 }
54
55 void SendACK (void) /* SEND ACK 发送应答信号*/
C51 COMPILER V8.08 I2C 09/28/2008 12:02:41 PAGE 2
56 {
57 1 sda=0;
58 1 scl=1;
59 1 Delay(5);
60 1 scl=0;
61 1 }
62
63 void SendNACK (void) //发送非应答信号
64 {
65 1 sda=1;
66 1 scl=1;
67 1 Delay(5);
68 1 scl=0;
69 1 }
70
71 void WriteI2C (uchar dd) //写入一个字节
72 {
73 1 ACC = dd;
74 1 sda=a7;scl=1;scl=0;
75 1 sda=a6;scl=1;scl=0;
76 1 sda=a5;scl=1;scl=0;
77 1 sda=a4;scl=1;scl=0;
78 1 sda=a3;scl=1;scl=0;
79 1 sda=a2;scl=1;scl=0;
80 1 sda=a1;scl=1;scl=0;
81 1 sda=a0;scl=1;scl=0;
82 1 sda = 1;
83 1 scl = 1;
84 1 }
85
86 uchar ReadI2C (void) //读取一个字节
87 {
88 1 sda = 1;
89 1 scl=1;a7=sda;scl=0;
90 1 scl=1;a6=sda;scl=0;
91 1 scl=1;a5=sda;scl=0;
92 1 scl=1;a4=sda;scl=0;
93 1 scl=1;a3=sda;scl=0;
94 1 scl=1;a2=sda;scl=0;
95 1 scl=1;a1=sda;scl=0;
96 1 scl=1;a0=sda;scl=0;
97 1 return(ACC);
98 1 }
99
100 /*读写功能用户函数*/
101
102 void WriteOneByte (uchar addr,char thedata) //写入一个字节到指定地址
103 {
104 1 I2CStart(); //开始总线
105 1 WriteI2C(0xa0); //发送控制数据
106 1 ACK = CheckACK(); //检查应答信息
107 1 WriteI2C(addr); //写入地址
108 1 ACK = CheckACK();
109 1 WriteI2C(thedata); //写入数据
110 1 ACK = CheckACK();
111 1 I2CStop(); //停止总线
112 1 }
113
114 void WriteOnePage (uchar addr,char *thedata) //写入一页16个字节到指定开始地址,可以自动翻页
115 {
116 1 uchar i,j; //计数器
117 1 i=16-(addr&0x0F); //计算应写入第一页的数据量
C51 COMPILER V8.08 I2C 09/28/2008 12:02:41 PAGE 3
118 1 I2CStart(); //开始总线
119 1 WriteI2C(0xa0); //发送控制数据
120 1 ACK = CheckACK(); //检查应答信息
121 1 WriteI2C(addr); //写入地址
122 1 ACK = CheckACK();
123 1 for(j=0;j<i;j++) //循环写入第一页的数据
124 1 {
125 2 WriteI2C(*thedata); //写入数据
126 2 ACK = CheckACK();
127 2 thedata++; //数据指针加1
128 2 }
129 1 I2CStop(); //停止总线
130 1 if(i!=16) //如果第一页不够,开始写入第二页
131 1 {
132 2 I2CStart(); //开始总线
133 2 WriteI2C(0xa0); //发送控制数据
134 2 ACK = CheckACK(); //检查应答信息
135 2 WriteI2C(addr+i); //写入地址
136 2 ACK = CheckACK();
137 2 for(j=i;j<17;j++) //循环写入第二页数据
138 2 {
139 3 WriteI2C(*thedata); //写入数据
140 3 ACK = CheckACK();
141 3 thedata++;
142 3 }
143 2 I2CStop();
144 2 }
145 1 }
146
147 char ReadOneByte (uchar addr) //读取指定地址一个字节
148 {
149 1 char mydata; //准备写入的数据
150 1 I2CStart();
151 1 WriteI2C(0xa0); //写入控制数据
152 1 ACK = CheckACK();
153 1 WriteI2C(addr); //写入地址
154 1 ACK = CheckACK();
155 1 I2CStart(); //重新开始总线
156 1 WriteI2C(0xa1); //写入读取控制码
157 1 ACK = CheckACK();
158 1 mydata=ReadI2C(); //读取数据
159 1 I2CStop(); //停止总线
160 1 return mydata;
161 1 }
162
163 void ReadNByte (uchar addr,char *thedata,uchar n) //连续读取N个字节
164 {
165 1 uchar i;
166 1 I2CStart();
167 1 WriteI2C(0xa0);
168 1 ACK=CheckACK();
169 1 WriteI2C(addr);
170 1 ACK=CheckACK();
171 1 I2CStart();
172 1 WriteI2C(0xa1);
173 1 ACK=CheckACK();
174 1 for(i=0;i<n-1;i++) //循环读取前N-1个数据
175 1 {
176 2 *thedata=ReadI2C(); //读取数据
177 2 SendACK(); //发送应答,表示继续读取
178 2 thedata++; //数据指针加1
179 2 }
C51 COMPILER V8.08 I2C 09/28/2008 12:02:41 PAGE 4
180 1 *thedata=ReadI2C(); //读取最后一个数据
181 1 SendNACK(); //发送非应答,结束读取
182 1 I2CStop(); //停止总线
183 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 574 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 16
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 + -