📄 iicbusrom.lst
字号:
C51 COMPILER V8.02 IICBUSROM 01/22/2009 11:09:45 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE IICBUSROM
OBJECT MODULE PLACED IN IIcBusRom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IIcBusRom.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //I2cE2pRom的读写操作
2 //读写操作之间需要一个(5ms)以上的延时
3 #include <REG52.H>
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 sbit SCL = P3^6;
8 sbit SDA = P3^7;
9
10 void start()//开始信号
11 {
12 1 SDA = 1;
13 1 SCL = 1;
14 1 SDA = 0;
15 1
16 1 }
17
18 void stop()//结束信号
19 {
20 1 SDA = 0;
21 1 SCL = 1;
22 1 SDA = 1;
23 1 }
24
25 void respond()//应答信号
26 {
27 1 uchar t;
28 1 SCL = 1;
29 1 while((SDA==1)&&(t<250)) t++;
30 1 SCL = 0;;
31 1 }
32
33 void softwareReset()//软复位
34 {
35 1 uchar c;
36 1
37 1 start();
38 1 SDA = 1;
39 1 for(c=0;c<9;c++)
40 1 {
41 2 SCL = 1;
42 2 SCL = 0;
43 2 }
44 1 start();
45 1 stop();
46 1 }
47
48 void writeByte(uchar byte)
49 {
50 1 uchar c;
51 1
52 1 for(c=0;c<8;c++)
53 1 {
54 2 byte <<= 1;//先将dat的MSB左移出到PSW的CY位
55 2 SCL = 0;
C51 COMPILER V8.02 IICBUSROM 01/22/2009 11:09:45 PAGE 2
56 2 SDA = CY; //将数据送给SDA
57 2 SCL = 1;
58 2 }
59 1 SCL = 0;
60 1 SDA = 1;//释放
61 1 }
62
63 uchar readByte()
64 {
65 1 uchar byte,temp,c;
66 1
67 1 SCL = 0;
68 1 for(c=0;c<8;c++)
69 1 {
70 2 byte <<= 1;//先将byte的LSB清零,准备接收数据
71 2 SCL = 1;
72 2 temp = SDA;
73 2 byte |= temp;
74 2 SCL = 0;
75 2 }
76 1 return byte;
77 1 }
78
79 //在某个E2PROM上的某个地址写一个字节数据;DeviceAdd的LSB为0,
80 //表示要发送数据,即DeviceAdd为1010xxx0
81 void writeData(uchar DeviceAdd, WordAdd, ByteData)
82 {
83 1 start(); //先在SDA上给一个开始信号
84 1 writeByte(DeviceAdd);//在SDA上给要写数据的E2PROM的地址,进行设备寻址
85 1 respond(); //等待特定E2PROM的应答信号
86 1 writeByte(WordAdd); //给特定E2PROM送开始写数据的地址
87 1 respond(); //等待特定E2PROM的应答信号
88 1 writeByte(ByteData); //把数据写入E2PROM
89 1 respond(); //等待特定E2PROM的应答信号
90 1 stop();
91 1 }
92
93 //在某个E2PROM上的某个地址读一个字节数据;DeviceAdd的LSB为0,
94 //即DeviceAdd为1010xxx0
95 uchar readData(uchar DeviceAdd, WordAdd)
96 {
97 1 uchar ReadAdd,dat;
98 1 ReadAdd = DeviceAdd|0x01;//DeviceAdd的LSB改为1,表示要读数据
99 1
100 1 //开始读数据动作
101 1 start(); //先在SDA上给一个开始信号
102 1 writeByte(DeviceAdd);//在SDA上给要读数据的E2PROM的地址,进行设备寻址
103 1 respond(); //等待特定E2PROM的应答信号
104 1 writeByte(WordAdd); //给特定E2PROM送要读数据的地址
105 1 respond(); //等待特定E2PROM的应答信号
106 1 start(); //再先在SDA上给一个开始信号
107 1 writeByte(ReadAdd);//再在SDA上给要读数据的E2PROM的地址,其LSB已改为1
108 1 respond(); //等待特定E2PROM的应答信号
109 1 dat = readByte(); //读数据
110 1 stop();
111 1 return dat; //返回所读的数据
112 1 }
113
114
115 //开始测试
116 void delay(uint time)
117 {
C51 COMPILER V8.02 IICBUSROM 01/22/2009 11:09:45 PAGE 3
118 1 uint i,j;
119 1 for(i=time;i>0;i--)
120 1 for(j=125;j>0;j--); //在11.0592的晶振下,延时大约1ms
121 1 }
122
123 void main()
124 {
125 1 softwareReset();
126 1 writeData(0xa0,1,0x99);//在1010000E2PROM的地址1上写入数据0x99
127 1 delay(10); //写入数据后延时>5ms,以便E2PROM将数据写入ROM
128 1 P1 = readData(0xa0,1); //在1010000E2PROM的地址1上读出数据,并赋予P1口,驱动LED显示
129 1 while(1);
130 1 }
131 //测试结束
132
133
134
135
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 228 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 1
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 + -