?? 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 + -