📄 24cxx.lst
字号:
C51 COMPILER V7.06 24CXX 09/13/2007 02:28:52 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 24CXX
OBJECT MODULE PLACED IN 24CXX.OBJ
COMPILER INVOKED BY: C:\tools\Keil\C51\BIN\C51.EXE 24CXX.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*实验名称:读写AT24C02实验
2 功能:用串口发送指令读出或写入00-7FH单无的内容,显示结果在LCD上显示
3 读出(16进制数):AA 地址
4 写入(16进制数):BB 地址 内容
5 作者:http://www.mcuprog.com
6 05-02-01
7 */
8 #include <reg51.h>
9 #include <intrins.h>
10 #define Uchar unsigned char
11 #define Uint unsigned int
12 #define SomeNOP(); _nop_();_nop_();_nop_();
13 //定义变量
14 Uchar recip,recsum,recdata[2]; //接收指针,接收个数,用户标志,接收存放数组
15 Uchar bdata myflag;
16 sbit readbit = myflag^0; //读EEPROM标志
17 sbit writebit = myflag^1; //写EEPROM标志
18 sbit rs232okbit = myflag^2; //接收完一拍完整的指令
19
20 /*I2C要用到的口线定意*/
21 sbit SDA = P3^4;
22 sbit SCL = P3^3;
23
24 /*控制的口线定意*/
25 sbit E=P2^2;
26 sbit RW=P2^1;
27 sbit RS=P2^0;
28 //LCD驱动要用到的一些子程序
29 //-------------------------------------
30 void Delay(unsigned int t) // delay 40us
31 {
32 1 for(;t!=0;t--) ;
33 1 }
34 //=============================================
35 void SendCommandByte(unsigned char ch)
36 {
37 1 RS=0;
38 1 RW=0;
39 1 P0=ch;
40 1 E=1;
41 1 Delay(1);
42 1 E=0;
43 1 Delay(100); //delay 40us
44 1 }
45 //-------------------------------------------------------
46 void SendDataByte(unsigned char ch)
47 { RS=1;
48 1 RW=0;
49 1 P0=ch;
50 1 E=1;
51 1 Delay(1);
52 1 E=0;
53 1 Delay(100); //delay 40us
54 1 }
55 //-------------------------------------------------
C51 COMPILER V7.06 24CXX 09/13/2007 02:28:52 PAGE 2
56 void InitLcd()
57 {SendCommandByte(0x30);
58 1 SendCommandByte(0x30);
59 1 SendCommandByte(0x30);
60 1 SendCommandByte(0x38); //设置工作方式
61 1 SendCommandByte(0x0c); //显示状态设置
62 1 SendCommandByte(0x01); //清屏
63 1 SendCommandByte(0x06); //输入方式设置
64 1 }
65
66
67
68 /*----------------------I2C要用到的一些子程序---------------------------------*/
69 /***********************以下为一些用到的子程序*********************************/
70 /*延时子程序*/
71 void Delay_1ms(Uchar time)
72 {
73 1 Uchar j;
74 1 while(time--)
75 1 {
76 2 for(j=163;j!=0;j--)
77 2 {;}
78 2 }
79 1 }
80
81 /*I2C的起动程序*/
82 void I2CStart(void)
83 {
84 1 SDA = 1;
85 1 SomeNOP();
86 1 SCL = 1;
87 1 SomeNOP();
88 1 SDA = 0;
89 1 SomeNOP();
90 1 SCL = 0;
91 1 SomeNOP();
92 1 }
93
94 /*I2C的停止程序*/
95 void I2CStop(void)
96 {
97 1 SDA = 0;
98 1 SomeNOP();
99 1 SCL = 1;
100 1 SomeNOP();
101 1 SDA = 1;
102 1 SomeNOP();
103 1 }
104
105 void ACK(void) //Acknowledge信号
106 {
107 1 SDA = 0;
108 1 SomeNOP();
109 1 SCL = 1;
110 1 SomeNOP();
111 1 SCL = 0;
112 1 SomeNOP();
113 1 }
114
115 void NACK(void) //没有Acknowledge信号
116 {
117 1 SDA = 1;
C51 COMPILER V7.06 24CXX 09/13/2007 02:28:52 PAGE 3
118 1 SomeNOP();
119 1 SCL = 1;
120 1 SomeNOP();
121 1 SCL = 0;
122 1 SomeNOP();
123 1 }
124
125 void AutoACK(void) //在一定的时间内自动确定ACK的信号//
126 {
127 1 Uchar i = 0;
128 1 SCL = 1;
129 1 SomeNOP();
130 1 while((SDA == 1)&&(i<255))i++;
131 1 SCL = 0;
132 1 SomeNOP();
133 1 }
134
135
136 /*I2C写数据程序(向数据线上写一个BYTE)*/
137 void Writex(Uchar j)
138 {
139 1 Uchar i,temp;
140 1 temp = j;
141 1 for (i=0;i<8;i++) //串行移位,先送高位,再送低位//
142 1 {
143 2 temp =temp<<1;
144 2 SCL = 0;
145 2 SomeNOP();
146 2 SDA = CY;
147 2 SomeNOP();
148 2 SCL = 1;
149 2 SomeNOP();
150 2 }
151 1 SCL = 0;
152 1 SomeNOP();
153 1 SDA = 1;
154 1 SomeNOP();
155 1 }
156 /*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
157 Uchar Readx(void)
158 {
159 1 Uchar i,j,k=0;
160 1 SCL = 0;
161 1 SomeNOP();
162 1 SDA = 1;
163 1 for (i=0;i<8;i++) // 串行移位,先读出高位,后读出低位//
164 1 {
165 2 SomeNOP();
166 2 SCL = 1;
167 2 SomeNOP();
168 2 if(SDA ==1) j=1;
169 2 else j=0;
170 2 k =(k<<1)|j;
171 2 SCL = 0;
172 2 }
173 1 SomeNOP();
174 1 return(k); //返回读出的值//
175 1 }
176
177 //******************以下为对24CXX系列的读写程序******************************//
178 //*************24CXX的device address 为写0A0H,读为0A1H*********************//
179 /*某个地址写数据*/
C51 COMPILER V7.06 24CXX 09/13/2007 02:28:52 PAGE 4
180 void X24_Write(Uchar Addresslow,Uchar Write_date)
181 {
182 1 I2CStart();
183 1 Writex(0xA0);
184 1 AutoACK();
185 1 Writex(Addresslow);
186 1 AutoACK();
187 1 Writex(Write_date);
188 1 AutoACK();
189 1 I2CStop();
190 1 Delay_1ms(10);
191 1 }
192
193 /*对某个地址读操作,函数值为读出的数据*/
194 Uchar X24_Read(Uchar Addresslow)
195 {
196 1 Uchar i;
197 1 I2CStart();
198 1 Writex(0xA0);
199 1 AutoACK();
200 1 Writex(Addresslow);
201 1 AutoACK();
202 1 I2CStart();
203 1 Writex(0xA1);
204 1 AutoACK();
205 1 i =Readx();
206 1 //ACK(); //注意:这里不能有ACK应答信号//
207 1 I2CStop();
208 1 Delay_1ms(0);
209 1 return(i);
210 1 }
211
212 //以下为串行口中断程序,用于接收串行数据
213 void rs232(void) interrupt 4
214 {
215 1 if(RI==1)
216 1 {
217 2 RI=0;
218 2 if(SBUF==0xaa)
219 2 {
220 3 recsum=0x01;
221 3 readbit=1;
222 3 recip=0x00;
223 3 }
224 2 else
225 2 {
226 3 if(SBUF==0xbb)
227 3 {
228 4 recsum=0x02;
229 4 writebit=1;
230 4 recip=0x00;
231 4 }
232 3 else
233 3 {
234 4 recdata[recip]=SBUF;
235 4 recip++;
236 4 recsum--;
237 4 if(recsum==0x00){rs232okbit=1;}
238 4 }
239 3 }
240 2
241 2 }
C51 COMPILER V7.06 24CXX 09/13/2007 02:28:52 PAGE 5
242 1 }
243
244 //以下为定时器中断程序,
245 void time0(void) interrupt 1
246 {
247 1 Uchar temp,k;
248 1 TH0=0xfc;
249 1 TL0=0x67;
250 1 if(rs232okbit==1)
251 1 {
252 2 rs232okbit=0;
253 2 if(readbit==1)
254 2 {
255 3 readbit=0;
256 3 temp=X24_Read(recdata[0]);
257 3 SendCommandByte(0x87);
258 3 k=(recdata[0]>>4)&0x0f;
259 3 if(k<0x0a){k=k+0x30;}
260 3 else{k=k+0x37;}
261 3 SendDataByte(k);
262 3 k=recdata[0]&0x0f;
263 3 if(k<0x0a){k=k+0x30;}
264 3 else{k=k+0x37;}
265 3 SendDataByte(k);
266 3
267 3 SendCommandByte(0xC7);
268 3 k=(temp>>4)&0x0f;
269 3 if(k<0x0a){k=k+0x30;}
270 3 else{k=k+0x37;}
271 3 SendDataByte(k);
272 3 k=temp&0x0f;
273 3 if(k<0x0a){k=k+0x30;}
274 3 else{k=k+0x37;}
275 3 SendDataByte(k);
276 3 }
277 2 if(writebit==1)
278 2 {
279 3 writebit=0;
280 3 SendCommandByte(0x87);
281 3
282 3 k=(recdata[0]>>4)&0x0f;
283 3 if(k<0x0a){k=k+0x30;}
284 3 else{k=k+0x37;}
285 3 SendDataByte(k);
286 3 k=recdata[0]&0x0f;
287 3 if(k<0x0a){k=k+0x30;}
288 3 else{k=k+0x37;}
289 3 SendDataByte(k);
290 3
291 3 SendCommandByte(0xC7);
292 3 k=(recdata[1]>>4)&0x0f;
293 3 if(k<0x0a){k=k+0x30;}
294 3 else{k=k+0x37;}
295 3 SendDataByte(k);
296 3 k=recdata[1]&0x0f;
297 3 if(k<0x0a){k=k+0x30;}
298 3 else{k=k+0x37;}
299 3 SendDataByte(k);
300 3 X24_Write(recdata[0],recdata[1]);
301 3 }
302 2
303 2 }
C51 COMPILER V7.06 24CXX 09/13/2007 02:28:52 PAGE 6
304 1 }
305
306 void main(void)
307 {
308 1
309 1 InitLcd();
310 1 SendCommandByte(0x80);
311 1 Delay(2);
312 1 SendDataByte('A');
313 1 SendDataByte('D');
314 1 SendDataByte('D');
315 1 SendDataByte('R');
316 1 SendDataByte('E');
317 1 SendDataByte(':');
318 1 SendCommandByte(0xC0);
319 1 Delay(2);
320 1 SendDataByte('M');
321 1 SendDataByte('E');
322 1 SendDataByte('M');
323 1 SendDataByte('O');
324 1 SendDataByte('R');
325 1 SendDataByte('Y');
326 1 SendDataByte(':');
327 1 TH0=0xfc;
328 1 TL0=0x67;
329 1 TH1=0xfd;
330 1 TL1=0xfd;
331 1 TMOD=0x21;
332 1 SCON=0x50;
333 1 TR0=1;TR1=1;
334 1 IE=0x92;
335 1 REN=1;
336 1 readbit=1;
337 1 rs232okbit=1;
338 1 while(1)
339 1 {}
340 1
341 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 820 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -