📄 24c04-p0-p2-led.lst
字号:
C51 COMPILER V8.02 24C04_P0_P2_LED 01/09/2007 19:56:08 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 24C04_P0_P2_LED
OBJECT MODULE PLACED IN 24C04-P0-P2-LED.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 24C04-P0-P2-LED.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************
2 * *
3 * ME500单片机开发系统演示程序 - 多花样流水灯 *
4 * *
5 * P0 P2 LED显示 *
6 * *
7 * 用数据块写方式将数据写入24C04芯片内,再将其数据读出送LED显示。 *
8 * *
9 * 邮箱: gguoqing@willar.com *
10 * 网站: http://www.willar.com *
11 * 作者: gguoqing *
12 * 时间: 2007/01/08 *
13 * *
14 *【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
15 *【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
16 * *
17 ********************************************************************
18 * *
19 * 24C04的写入数据块最大字节数n为16,一次写入的字节数m不能多于n. *
20 * *
21 *******************************************************************/
22 #include <reg51.h>
23 #include <intrins.h>
24
25 #define uchar unsigned char
26 #define uint unsigned int
27
28 uchar code senddata1[16]= {
29 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
30 0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF };
31
32 uchar code senddata2[16]= {
33 0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,
34 0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF };
35
36 uchar code senddata3[16]= {
37 0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0x9F,
38 0xCF,0xE7,0xF3,0xF9,0xFC,0xFF,0xFF,0xFF };
39
40 uchar code senddata4[16]= {
41 0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,
42 0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF };
43
44 uchar idata display[64]={0xff,0xff }; //数据存储区
45
46 sbit SDA = P3^5; //串行数据
47 sbit SCL = P3^4; //串行时钟
48
49 bit ack;
50
51 /**********************************************************
52
53 延时子程序
54
55 **********************************************************/
C51 COMPILER V8.02 24C04_P0_P2_LED 01/09/2007 19:56:08 PAGE 2
56 void delayms(uint ms)
57 {
58 1 uchar k;
59 1 while(ms--)
60 1 {
61 2 for(k = 0; k < 120; k++);
62 2 }
63 1 }
64
65 /**********************************************************
66
67 4us延时函数
68
69 **********************************************************/
70 void delayNOP()
71 {
72 1 _nop_();_nop_();
73 1 _nop_();_nop_();
74 1 }
75
76 /**********************************************************
77
78 起始条件函数
79
80 **********************************************************/
81 void I2C_start()
82
83 {
84 1 SDA = 1;
85 1 SCL = 1;
86 1 delayNOP();
87 1 SDA = 0;
88 1 delayNOP();
89 1 SCL = 0; //准备发送或接收数据
90 1 }
91
92 /**********************************************************
93
94 停止条件函数
95
96 **********************************************************/
97 void I2C_stop()
98 {
99 1 SDA = 0;
100 1 SCL = 1;
101 1 delayNOP();
102 1 SDA = 1; //发送I2C总线结束信号
103 1 delayNOP();
104 1 SCL = 0;
105 1 }
106
107 /**********************************************************
108
109 I2C总线初始化函数
110
111 **********************************************************/
112 void I2C_init()
113 {
114 1 SCL = 0;
115 1 I2C_stop();
116 1 }
117
C51 COMPILER V8.02 24C04_P0_P2_LED 01/09/2007 19:56:08 PAGE 3
118 /**********************************************************
119
120 发送应答子函数
121
122 **********************************************************/
123 void I2C_Ack()
124 {
125 1 SDA = 0;
126 1 SCL = 1;
127 1 delayNOP();
128 1 SCL = 0;
129 1 SDA = 1;
130 1 }
131
132 /**********************************************************
133
134 发送非应答子函数
135
136 **********************************************************/
137 void I2C_NAck()
138 {
139 1 SDA = 1;
140 1 SCL = 1;
141 1 delayNOP();
142 1 SCL = 0;
143 1 SDA = 0;
144 1 }
145
146 /**********************************************************
147
148 从AT24C02移出数据到MCU
149
150 **********************************************************/
151 uchar RecByte()
152 {
153 1 uchar i,read_data;
154 1 read_data=0x00;
155 1 SDA=1; //置数据线为输入方式
156 1 for(i = 0; i < 8; i++)
157 1 {
158 2 SCL = 1;
159 2 read_data <<= 1;
160 2 read_data |= SDA;
161 2 delayNOP();
162 2 SCL = 0;
163 2 delayNOP();
164 2 }
165 1 SCL = 0;
166 1 delayNOP();
167 1 return(read_data);
168 1 }
169
170 /**********************************************************
171
172 字节数据传送函数
173 写数据到AT24C04,
174 ack=1,发送正常。ack=0,表示接收器无应答或损害。
175
176 **********************************************************/
177 uchar SendByte(uchar write_data)
178 {
179 1 uchar i;
C51 COMPILER V8.02 24C04_P0_P2_LED 01/09/2007 19:56:08 PAGE 4
180 1 for(i = 0; i < 8; i++) //循环移入8个位
181 1 {
182 2 SDA = (bit)(write_data & 0x80);
183 2 _nop_();
184 2 _nop_();
185 2 SCL = 1;
186 2 delayNOP();
187 2 SCL = 0;
188 2 write_data <<= 1;
189 2 }
190 1
191 1 delayNOP();
192 1 SDA = 1; //释放总线,准备读取应答
193 1 SCL = 1;
194 1 delayNOP();
195 1 if(SDA==1) ack=0; //ack=0,表示非应答
196 1 else ack=1;
197 1 SCL = 0;
198 1 delayNOP();
199 1 return ack; //返回AT24C04应答位
200 1 }
201
202 /**********************************************************
203
204 发送多字节数据函数
205
206 **********************************************************/
207 uchar SendString(uchar Slave,uchar Subaddr,uchar *Source,uchar Num)
208 {
209 1 uchar s;
210 1
211 1 I2C_start();
212 1 SendByte(Slave); //发送器件地址
213 1 if(ack==0) return(0);
214 1 SendByte(Subaddr); //发送器件子地址
215 1 if(ack==0) return(0);
216 1
217 1 for(s=0; s<Num; s++)
218 1 {
219 2 SendByte(*Source); //发送数据
220 2 if(ack==0) return(0);
221 2 Source++;
222 2 }
223 1 I2C_stop(); //结束总线
224 1 return(1);
225 1 }
226
227 /**********************************************************
228
229 接收多字节数据函数
230
231
232 **********************************************************/
233 uchar RecString(uchar Slave,uchar Subaddr,uchar *Source,uchar Num)
234 {
235 1 uchar s;
236 1
237 1 I2C_start();
238 1 SendByte(Slave); //发送器件地址
239 1 if(ack==0) return(0);
240 1 SendByte(Subaddr); //发送器件子地址
241 1 if(ack==0) return(0);
C51 COMPILER V8.02 24C04_P0_P2_LED 01/09/2007 19:56:08 PAGE 5
242 1
243 1 I2C_start();
244 1 SendByte(Slave+1); //发送器件地址
245 1 if(ack==0) return(0);
246 1
247 1 for(s=0; s<Num; s++)
248 1 {
249 2 *Source=RecByte(); //接收数据
250 2 I2C_Ack(); //发送应答位
251 2 Source++;
252 2 }
253 1 I2C_NAck(); //发送非应答
254 1 I2C_stop(); //结束总线
255 1 return(1);
256 1 }
257
258 /**********************************************************
259
260 主函数
261
262 **********************************************************/
263 main(void)
264 {
265 1 uchar i,temp;
266 1 I2C_init();
267 1
268 1 SendString(0xa0,0x00,senddata1,16);
269 1 delayms(5);
270 1 SendString(0xa0,0x10,senddata2,16);
271 1 delayms(5);
272 1 SendString(0xa0,0x20,senddata3,16);
273 1 delayms(5);
274 1 SendString(0xa0,0x30,senddata4,16);
275 1
276 1 delayms(500);
277 1 RecString(0xa0,0x00,display,64); //从AT24C04读出数据
278 1
279 1 while(1)
280 1 {
281 2 for(i=0; i<64; i++) //显示数据
282 2 {
283 3 temp= display[i];
284 3 P0 = temp;
285 3 P2 = temp;
286 3 delayms(300);
287 3 }
288 2 }
289 1 }
290
291 /**********************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 427 ----
CONSTANT SIZE = 64 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = 64 ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -