iic.lst
来自「myson的MTV332的DEMO程序 主要功能有菜单的设计和无线遥控以及视频」· LST 代码 · 共 497 行 · 第 1/2 页
LST
497 行
C51 COMPILER V7.09 IIC 09/06/2006 13:39:47 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN ..\OUTPUT\IIC.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\code\IIC.C LARGE ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND PRINT(.\IIC.lst)
- OBJECT(..\OUTPUT\IIC.obj)
line level source
1 #include "global.h"
2
3 #define EEPROM_PBYTE 16 // 24c16
4 #define EEPROM_PTIME 7 // wait 7 ms
5
6
7 /****************************************************************************/
8 void Short_Delay(BYTE Time)
9 {
10 1 while(Time --);
11 1 }
12
13 void DoWait(WORD Time) // delay 1ms
14 {
15 1 BYTE Counter;
16 1
17 1 for(; Time > 0; Time --)
18 1 {
19 2 Counter = 250;
20 2 while(--Counter);
21 2
22 2 Counter = 250;
23 2 while(--Counter);
24 2 }
25 1 }
26
27 /****************************************************************************/
28 // Software IIC
29 /****************************************************************************/
30 #ifdef _IICSW_
31
32 //---------------------------------------------------------------------------
33 void IIC_Start(void)
34 {
35 1 ResSDA;
36 1 ResSCL;
37 1 }
38
39 //---------------------------------------------------------------------------
40 void IIC_Stop(void)
41 {
42 1 SetSDA;
43 1 ResSDA;
44 1 SetSCL;
45 1 while(!GetSCL);
46 1 SetSDA;
47 1 }
48
49 //---------------------------------------------------------------------------
50 void Initial_I2C(void)
51 {
52 1 EEP_Wait = 0;
53 1
54 1 IIC_Stop();
C51 COMPILER V7.09 IIC 09/06/2006 13:39:47 PAGE 2
55 1 }
56
57 //---------------------------------------------------------------------------
58 void IIC_Send1Byte(BYTE senddata)
59 {
60 1 BYTE i;
61 1
62 1 for(i = 0; i < 8; i++)
63 1 {
64 2 if(senddata & 0x80)
65 2 SetSDA;
66 2 else
67 2 ResSDA;
68 2
69 2 senddata <<=1;
70 2
71 2 SetSCL;
72 2 while(!GetSCL);
73 2 ResSCL;
74 2 }
75 1
76 1 ResSCL;
77 1 SetSDA;
78 1 SetSCL;
79 1 while(!GetSCL);
80 1
81 1 if (GetSDA)
82 1 bNoAck = 1;
83 1 else
84 1 bNoAck = 0;
85 1 ResSCL;
86 1
87 1 }
88
89 //---------------------------------------------------------------------------
90 BYTE IIC_Read1Byte(BIT noack)
91 {
92 1 BYTE i,readdata=0;
93 1
94 1 for(i = 0; i < 8; i++)
95 1 {
96 2 readdata <<= 1;
97 2
98 2 SetSDA;
99 2 SetSCL;
100 2 while(!GetSCL);
101 2
102 2 if(GetSDA)
103 2 readdata |= 0x01;
104 2 ResSCL;
105 2 }
106 1 if(noack)
107 1 SetSDA;
108 1 else
109 1 ResSDA;
110 1
111 1 SetSCL;
112 1 while(!GetSCL);
113 1 ResSCL;
114 1
115 1 return readdata;
116 1
C51 COMPILER V7.09 IIC 09/06/2006 13:39:47 PAGE 3
117 1 }
118
119 /****************************************************************************/
120 // IIC write address
121 /****************************************************************************/
122 void IICSW_Write(BYTE id,BYTE addr,BYTE *databuf,WORD number)
123 {
124 1 int i;
125 1 BYTE count = 0;
126 1
127 1 do
128 1 {
129 2 count++;
130 2
131 2 // Stop
132 2 IIC_Stop();
133 2 Short_Delay(20);
134 2
135 2 // Start
136 2 IIC_Start();
137 2
138 2 // Slave ID
139 2 IIC_Send1Byte(id);
140 2
141 2 if (bNoAck)
142 2 continue;
143 2
144 2 // Address
145 2 IIC_Send1Byte(addr);
146 2
147 2 if (bNoAck)
148 2 continue;
149 2
150 2 // data
151 2 for(i = 0; i < number; i++)
152 2 {
153 3 IIC_Send1Byte(databuf[i]);
154 3 if(bNoAck)
155 3 break;
156 3 }
157 2
158 2 if (bNoAck)
159 2 continue;
160 2
161 2 // Stop
162 2 IIC_Stop();
163 2 }
164 1 while(bNoAck && count < 10);
165 1
166 1 }
167
168 /****************************************************************************/
169 // IIC Read address
170 /****************************************************************************/
171 void IICSW_Read(BYTE id,BYTE addr,BYTE *databuf,WORD number)
172 {
173 1 int i;
174 1 BYTE count = 0;
175 1
176 1 do
177 1 {
178 2 count++;
C51 COMPILER V7.09 IIC 09/06/2006 13:39:47 PAGE 4
179 2
180 2 // Stop
181 2 IIC_Stop();
182 2 Short_Delay(20);
183 2
184 2 // Start
185 2 IIC_Start();
186 2
187 2 // Slave ID
188 2 IIC_Send1Byte(id);
189 2
190 2 if (bNoAck)
191 2 continue;
192 2
193 2 // Address
194 2 IIC_Send1Byte(addr);
195 2
196 2 if (bNoAck)
197 2 continue;
198 2
199 2 SetSDA;
200 2 SetSCL;
201 2 while(!GetSCL);
202 2 IIC_Start();
203 2
204 2 // Slave ID
205 2 IIC_Send1Byte(id | 0x01);
206 2
207 2 if (bNoAck)
208 2 continue;
209 2
210 2 // data
211 2 for(i = 0; i < number-1; i++)
212 2 {
213 3 databuf[i] = IIC_Read1Byte(0);
214 3 }
215 2
216 2 databuf[i] = IIC_Read1Byte(1);
217 2
218 2 // Stop
219 2 IIC_Stop();
220 2 }
221 1 while(bNoAck && count < 10);
222 1
223 1 }
224 #endif // #ifdef _IICSW_
225
226
227 /****************************************************************************/
228 // Hardware IIC
229 /****************************************************************************/
230 #ifdef _IICHW_
//--------------------------------------------------------
void Initial_I2C(void)
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?