📄 i2c.lst
字号:
C51 COMPILER V7.50 I2C 08/08/2007 21:14:38 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.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "I2C.h"
2
3 unsigned char data I2C_Delay_t;
4 #define I2C_Delay()\
5 {\
6 I2C_Delay_t = (I2C_DELAY_VALUE);\
7 while ( --I2C_Delay_t != 0 );\
8 }
9 void I2C_Init()
10 {
11 1 I2C_SCL = 1;
12 1 I2C_Delay();
13 1 I2C_SDA = 1;
14 1 I2C_Delay();
15 1 }
16 void I2C_Start()
17 {
18 1 I2C_SDA = 1;
19 1 I2C_Delay();
20 1 I2C_SCL = 1;
21 1 I2C_Delay();
22 1 I2C_SDA = 0;
23 1 I2C_Delay();
24 1 I2C_SCL = 0;
25 1 I2C_Delay();
26 1 }
27 char I2C_Read()
28 {
29 1 char dat;
30 1 unsigned char t = 8;
31 1 I2C_SDA = 1; //在读取数据之前,要把SDA拉高
32 1 do
33 1 {
34 2 I2C_SCL = 1;
35 2 I2C_Delay();
36 2 dat <<= 1;
37 2 if ( I2C_SDA ) dat |= 0x01;
38 2 I2C_SCL = 0;
39 2 I2C_Delay();
40 2 } while ( --t != 0 );
41 1 return dat;
42 1 }
43 void I2C_Write(char dat)
44 {
45 1 unsigned char t = 8;
46 1 do
47 1 {
48 2 I2C_SDA = (bit)(dat & 0x80);
49 2 dat <<= 1;
50 2 I2C_SCL = 1;
51 2 I2C_Delay();
52 2 I2C_SCL = 0;
53 2 I2C_Delay();
54 2 } while ( --t != 0 );
55 1 }
C51 COMPILER V7.50 I2C 08/08/2007 21:14:38 PAGE 2
56 bit I2C_GetAck()
57 {
58 1 bit ack;
59 1 I2C_SDA = 1;
60 1 I2C_Delay();
61 1 I2C_SCL = 1;
62 1 I2C_Delay();
63 1 ack = I2C_SDA;
64 1 I2C_SCL = 0;
65 1 I2C_Delay();
66 1 return ack;
67 1 }
68 void I2C_PutAck(bit ack)
69 {
70 1 I2C_SDA = ack;
71 1 I2C_Delay();
72 1 I2C_SCL = 1;
73 1 I2C_Delay();
74 1 I2C_SCL = 0;
75 1 I2C_Delay();
76 1 }
77 void I2C_Stop()
78 {
79 1 unsigned int t = I2C_STOP_WAIT_VALUE;
80 1 I2C_SDA = 0;
81 1 I2C_Delay();
82 1 I2C_SCL = 1;
83 1 I2C_Delay();
84 1 I2C_SDA = 1;
85 1 I2C_Delay();
86 1 while ( --t != 0 ); //在下一次产生Start之前,要加一定的延时
87 1 }
88
89 bit I2C_Gets
90 (
91 unsigned char SlaveAddr,
92 unsigned int SubAddr,
93 unsigned char SubMod,
94 char *dat,
95 unsigned int Size
96 )
97 {
98 1 unsigned char i;
99 1 char a[3];
100 1 if ( Size == 0 ) return 0;
101 1 a[0] = (SlaveAddr << 1);
102 1 if ( SubMod > 2 ) SubMod = 2;
103 1 if ( SubMod != 0 )
104 1 {
105 2 if ( SubMod == 1 )
106 2 {
107 3 a[1] = (char)(SubAddr);
108 3 }
109 2 else
110 2 {
111 3 a[1] = (char)(SubAddr >> 8);
112 3 a[2] = (char)(SubAddr);
113 3 }
114 2 SubMod++;
115 2 I2C_Start();
116 2 for ( i=0; i<SubMod; i++ )
117 2 {
C51 COMPILER V7.50 I2C 08/08/2007 21:14:38 PAGE 3
118 3 I2C_Write(a[i]);
119 3 if ( I2C_GetAck() )
120 3 {
121 4 I2C_Stop();
122 4 return 1;
123 4 }
124 3 }
125 2 }
126 1 I2C_Start();
127 1 I2C_Write(a[0]+1);
128 1 if ( I2C_GetAck() )
129 1 {
130 2 I2C_Stop();
131 2 return 1;
132 2 }
133 1
134 1 for (;;)
135 1 {
136 2 *dat++ = I2C_Read();
137 2 if ( --Size == 0 )
138 2 {
139 3 I2C_PutAck(1);
140 3 break;
141 3 }
142 2 I2C_PutAck(0);
143 2 }
144 1 I2C_Stop();
145 1 return 0;
146 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 344 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 12
IDATA SIZE = ---- ----
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 + -