?? i2c.lst
字號:
C51 COMPILER V7.08 I2C 09/20/2007 18:03:20 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "my_89x51.h"
2
3 extern void d1ms(unsigned int);
4 #define READMODE 0xa1
5 #define WRITEMODE 0xa0
6
7
8 /**--------------------------------------------------------------------------------
9 調用方式:void I2CStart(void) ﹫200 /07/0 4
10 函數說明:I2C啟始位
11 ---------------------------------------------------------------------------------*/
12 void I2CStart()
13 {
14 1 EA = 0;
15 1 SCL = 0;
16 1 SDA = 1;
17 1 SCL = 1;
18 1 _nop_();
19 1 SDA = 0;
20 1 _nop_();
21 1 SCL = 0;
22 1 }
23
24 /**--------------------------------------------------------------------------------
25 調用方式:void I2CStop(void) ﹫200 /07/0 4
26 函數說明:I2C結束位
27 ---------------------------------------------------------------------------------*/
28 void I2CStop()
29 {
30 1 SDA = 0;
31 1 SCL = 1;
32 1 _nop_();
33 1 SDA = 1;
34 1 EA = 1;
35 1 }
36
37 /**--------------------------------------------------------------------------------
38 調用方式:bit I2CAck(void) ﹫200 /07/0 4
39 函數說明:I2C用,等待從器件接收方的應答
40 返回1--正確
41 返回0--錯誤
42 ---------------------------------------------------------------------------------*/
43 unsigned char WaitAck()
44 {
45 1 unsigned char data errtime = 255;//因故障接收方無ACK 超時值為255
46 1 while (SDA){
47 2 errtime--;
48 2 if (!errtime){
49 3 SCL = 0;
50 3 I2CStop();
51 3 return (0);
52 3 }
53 2 }
54 1 SCL = 0;
55 1 return (1);
C51 COMPILER V7.08 I2C 09/20/2007 18:03:20 PAGE 2
56 1 }
57
58 /**--------------------------------------------------------------------------------
59 調用方式:void SendAck(void) ﹫200 /07/0 4
60 函數說明:I2C用,主器件為接收方,從器件為發送方時,應答信號。
61 ---------------------------------------------------------------------------------*/
62 void SendAck()
63 {
64 1 SDA = 0;
65 1 SCL = 1;
66 1 SCL = 0;
67 1 SDA = 1;
68 1 }
69
70 /**--------------------------------------------------------------------------------
71 調用方式:void SendAck(void) ﹫200 /07/0 4
72 函數說明:I2C用,主器件為接收方,從器件為發送方時,非應答信號。
73 --------------------------------------------------------------------------------*/
74 void SendNotAck()
75 {
76 1 SDA = 1;
77 1 SCL = 1;
78 1 SCL = 0;
79 1 }
80
81 /**--------------------------------------------------------------------------------
82 調用方式:void I2CSend(unsigned char ch) ﹫200 /07/0 5
83 函數說明:I2C用,發送BYTE
84 ---------------------------------------------------------------------------------*/
85 void I2CSendByte(unsigned char ch)
86 {
87 1 unsigned char data i;
88 1 for (i = 0; i < 8; i++){
89 2 ch <<= 1;
90 2 SDA = CY;
91 2 SCL=1;
92 2 somenop;
93 2 SCL = 0;
94 2 somenop;
95 2 }
96 1 SDA = 1;
97 1 SCL = 1;
98 1 }
99
100 /**--------------------------------------------------------------------------------
101 調用方式:unsigned char I2CReceive(void) ﹫200 /07/0 5
102 函數說明:I2C用,接收BYTE
103 ---------------------------------------------------------------------------------*/
104 unsigned char I2CReceiveByte()
105 {
106 1 unsigned char data i = 8;
107 1 unsigned char data ddata = 0;
108 1 SDA = 1;
109 1 while (i--){
110 2 SCL = 1;
111 2 ddata <<= 1;
112 2 if (SDA)
113 2 ddata++;
114 2 SCL = 0;
115 2 }
116 1 return (ddata);
117 1 }
C51 COMPILER V7.08 I2C 09/20/2007 18:03:20 PAGE 3
118
119 /******************
120 函數說明:讀取E2ROM
121 ******************/
122
123 void i2c_read(unsigned char nadd, unsigned char nlen, unsigned char data *pdt)
124 {
125 1 I2CStart();
126 1 I2CSendByte(WRITEMODE);
127 1 _nop_();
128 1 WaitAck();
129 1 _nop_();
130 1 I2CSendByte(nadd);
131 1 WaitAck();
132 1 _nop_();
133 1 I2CStart();
134 1 I2CSendByte(READMODE);
135 1 WaitAck();
136 1 _nop_();
137 1 while(nlen > 0){
138 2 *pdt = I2CReceiveByte();
139 2 somenop;
140 2 if (nlen != 1)
141 2 SendAck();
142 2 nlen--;
143 2 pdt++;
144 2 }
145 1 SendNotAck();
146 1 I2CStop();
147 1 }
148
149 /******************
150 函數說明:寫E2ROM
151 ******************/
152 void i2c_write(unsigned char nadd, unsigned char nlen, unsigned char data *pdt)
153 {
154 1 I2CStart();
155 1 I2CSendByte(WRITEMODE);
156 1 WaitAck();
157 1 I2CSendByte(nadd);
158 1 WaitAck();
159 1 while(nlen > 0){
160 2 I2CSendByte(*pdt);
161 2 WaitAck();
162 2 pdt++;
163 2 nlen--;
164 2 d1ms(50);
165 2 }
166 1 I2CStop();
167 1 d1ms(200);
168 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 270 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILER V7.08 I2C 09/20/2007 18:03:20 PAGE 4
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -