?? i2c.lst
字號:
C51 COMPILER V7.02b I2C 12/12/2005 10:34:32 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: E:\EDATOOLS\KEILC7.0\C51\BIN\C51.EXE I2C.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************/
2 /* Copyright (c) 2005, 通信工程學院 */
3 /* All rights reserved. */
4 /* 作 者:戴 佳 */
5 /*****************************************/
6
7 #include "I2C.h"
8
9 /* 延時約5微秒,對于12M時鐘 */
10 void delay5us()
11 {
12 1 uint i;
13 1 for (i=0;i<5;i++)
14 1 _nop_();
15 1 }
16
17 /* 起始條件子函數(shù) */
18 void start(void)
19 {
20 1 SDA = 1; // 啟動I2C總線
21 1 SCL = 1;
22 1 delay5us();
23 1 SDA = 0;
24 1 delay5us();
25 1 SCL = 0;
26 1 }
27
28 /* 停止條件子函數(shù) */
29 void stop(void)
30 {
31 1 SDA = 0; // 停止I2C總線數(shù)據(jù)傳送
32 1 SCL = 1;
33 1 delay5us();
34 1 SDA = 1;
35 1 delay5us();
36 1 SCL = 0;
37 1 }
38
39 /* 發(fā)送應答子函數(shù) */
40 void ack(void)
41 {
42 1 SDA = 0; // 發(fā)送應答位
43 1 SCL = 1;
44 1 delay5us();
45 1 SDA = 1;
46 1 SCL = 0;
47 1 }
48
49 /* 發(fā)送非應答子函數(shù) */
50 void n_ack(void)
51 {
52 1 SDA = 1; // 發(fā)送非應答位
53 1 SCL = 1;
54 1 delay5us();
55 1 SDA = 0;
C51 COMPILER V7.02b I2C 12/12/2005 10:34:32 PAGE 2
56 1 SCL = 0;
57 1 }
58
59 /* 應答位檢查子函數(shù) */
60 void checkack(void)
61 {
62 1 SDA = 1; // 應答位檢查(將p1.0設置成輸入,必須先向端口寫1)
63 1 SCL = 1;
64 1 nackFlag = 0;
65 1 if(SDA == 1) // 若SDA=1表明非應答,置位非應答標志F0
66 1 nackFlag = 1;
67 1 SCL = 0;
68 1 }
69
70 /* 發(fā)送一個字節(jié)數(shù)據(jù)子函數(shù) */
71 void sendbyte(uchar idata *ch)
72 {
73 1 uchar idata n = 8;
74 1 uchar idata temp;
75 1 temp = *ch;
76 1 while(n--)
77 1 {
78 2 if((temp&0x80) == 0x80) // 若要發(fā)送的數(shù)據(jù)最高位為1則發(fā)送位1
79 2 {
80 3 SDA = 1; // 傳送位1
81 3 SCL = 1;
82 3 delay5us();
83 3 SDA = 0;
84 3 SCL = 0;
85 3 }
86 2 else
87 2 {
88 3 SDA = 0; // 否則傳送位0
89 3 SCL = 1;
90 3 delay5us();
91 3 SCL = 0;
92 3 }
93 2 temp = temp<<1; // 數(shù)據(jù)左移一位
94 2 }
95 1 }
96
97
98 /* 接收一字節(jié)子程序 */
99 void recbyte(uchar idata *ch)
100 {
101 1 uchar idata n=8; // 從SDA線上讀取一位數(shù)據(jù)字節(jié),共8位
102 1 uchar idata temp = 0;
103 1 while(n--)
104 1 {
105 2 SDA = 1;
106 2 SCL = 1;
107 2 temp = temp<<1; // 左移一位
108 2 if(SDA == 1)
109 2 temp = temp|0x01; // 若接收到的位為1,則數(shù)據(jù)的最后一位置1
110 2 else
111 2 temp = temp&0xfe; // 否則數(shù)據(jù)的最后一位置0
112 2 SCL=0;
113 2 }
114 1 *ch = temp;
115 1 }
116
117 /* 發(fā)送n字節(jié)數(shù)據(jù)子程序 */
C51 COMPILER V7.02b I2C 12/12/2005 10:34:32 PAGE 3
118 void sendnbyte(uchar idata *sla, uchar n)
119 {
120 1 uchar idata *p;
121 1 start(); // 發(fā)送啟動信號
122 1 sendbyte(sla); // 發(fā)送從器件地址字節(jié)
123 1 checkack(); // 檢查應答位
124 1 if(F0 == 1)
125 1 {
126 2 NACK = 1;
127 2 return; // 若非應答表明器件錯誤或已壞,置錯誤標志位NACK
128 2 }
129 1 p = sbuf;
130 1 while(n--)
131 1 {
132 2 sendbyte(p);
133 2 checkack(); // 檢查應答位
134 2 if (nackFlag == 1)
135 2 {
136 3 NACK=1;
137 3 return; // 若非應答表明器件錯誤或已壞,置錯誤標志位NACK
138 3 }
139 2 p++;
140 2 }
141 1 stop(); // 全部發(fā)完則停止
142 1 }
143
144 /* 接收n字節(jié)數(shù)據(jù)子程序 */
145 void recnbyte(uchar idata *sla, uchar n)
146 {
147 1 uchar idata *p;
148 1 start(); // 發(fā)送啟動信號
149 1 sendbyte(sla); // 發(fā)送從器件地址字節(jié)
150 1 checkack(); // 檢查應答位
151 1 if(nackFlag == 1)
152 1 {
153 2 NACK = 1;
154 2 return;
155 2 }
156 1 p = rbuf; // 接收字節(jié)存放在rbuf中
157 1 while(n--)
158 1 {
159 2 recbyte (p);
160 2 ack(); // 收到一個字節(jié)后發(fā)送一個應答位
161 2 p++;
162 2 }
163 1 n_ack(); // 收到最后一個字節(jié)后發(fā)送一個非應答位
164 1 stop();
165 1 }
166
167 /* 主函數(shù),模擬實現(xiàn)I2C總線的數(shù)據(jù)收發(fā) */
168 void main(void)
169 {
170 1 uchar i,numbyte;
171 1
172 1 numbyte = 8;
173 1
174 1 /* 需發(fā)送的8字節(jié)數(shù)據(jù) */
175 1 for (i=0;i<numbyte;i++)
176 1 sbuf[i] = i+0x11;
177 1
178 1 SLAdd = 0x58; // 從器件地址
179 1
C51 COMPILER V7.02b I2C 12/12/2005 10:34:32 PAGE 4
180 1 sendnbyte(&SLAdd,numbyte); // 向從器件發(fā)送存放在sbuf中的8字節(jié)數(shù)據(jù)
181 1
182 1 for (i=0;i<10000;i++)
183 1 delay5us();
184 1
185 1 recnbyte(&SLAdd,numbyte); // 由從器件接收8字節(jié)數(shù)據(jù),存放在rbuf中
186 1
187 1 }
188
189
190
191
192
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 320 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = 17 4
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -