📄 i2c_sub.lst
字号:
C51 COMPILER V7.50 I2C_SUB 07/10/2007 21:26:01 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE I2C_SUB
OBJECT MODULE PLACED IN I2C_Sub.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE I2C_Sub.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include"stdafx.h"
2 //#include"i2c_fun.h"
3 //SDA p1.7 SCL p3.3
4 #include"rt1602c_lcd.h"
5 sbit SDA=P1^7;
6 sbit SCL=P3^3;
7
8 #define UP 1
9 #define DOWN 0
10 #define ACK 0
11 #define FREE 1
12 #define N 2
13 #define SubAddr 0x5e
14
15 void job(void);
16
17 sbit P11=P1^1;
18
19 bit I2CStart;
20 //bit I2CStop;
21 bit WorkFlag;
22 bit I2CConnected;
23 //uchar num;
24 uchar ddata;
25 uchar SorceData[2]={5,8};
26
27 void main(void)
28 {
29 1 uchar temp,temp1,i,j;
30 1 Delay400Ms();
31 1 //LCMInit();
32 1
33 1 EX1=1;EA=1;IT1=1;
34 1 while(1){
35 2
36 2 ReSet:
37 2
38 2
39 2 SDA=FREE;
40 2 WorkFlag=0;
41 2 I2CStart=I2CConnected=DOWN;
42 2
43 2 while(I2CStart==DOWN){
44 3 //job();
45 3 if(WorkFlag)
46 3 {
47 4 WorkFlag=0;
48 4 while(SCL==0);
49 4 temp=SDA;
50 4 while(SCL==1);
51 4 temp1=SDA;
52 4 if(temp!=temp1)
53 4 if(temp==1 && temp1==0) I2CStart=UP;
54 4 }
55 3 }
C51 COMPILER V7.50 I2C_SUB 07/10/2007 21:26:01 PAGE 2
56 2 ddata=j=0;
57 2 for(i=0;i<8;i++)
58 2 {
59 3 while(WorkFlag==0);
60 3 WorkFlag=0;
61 3 while(SCL==0);
62 3 temp=SDA;
63 3 ddata=(ddata<<1) | temp;
64 3 }
65 2
66 2 if((ddata/2)==(SubAddr/2)) I2CConnected=UP;
67 2 else {I2CConnected=DOWN;I2CStart=DOWN;goto ReSet;}
68 2
69 2 while(WorkFlag==0);WorkFlag=0;
70 2 SDA=ACK;
71 2 while(WorkFlag==0);
72 2 SDA=FREE;
73 2 //WorkFlag=0;
74 2
75 2 if(ddata&0x01)
76 2 {//主read
77 3 while(1){
78 4
79 4 // Resent:
80 4 for(i=0;i<8;i++)
81 4 {
82 5 while(WorkFlag==0);
83 5 SDA=(SorceData[j]&0x80);
84 5 WorkFlag=0;
85 5
86 5 SorceData[j]=SorceData[j]<<1;
87 5 }
88 4 while(WorkFlag==0);
89 4 SDA=FREE;
90 4 WorkFlag=0;
91 4 while(SCL==0);
92 4 temp=SDA;
93 4 if((temp==0)) goto Next;
94 4 else {goto ReSet;} //若主机产生NOT ACK信号时默认结束
95 4 Next:
96 4 /*while(WorkFlag==0);
97 4 WorkFlag=0;
98 4 while(SCL==0);
99 4 temp=SDA;
100 4 while(SCL==1);
101 4 if(SDA!=temp) {I2CStart=DOWN;I2CConnected=DOWN;goto ReSet;} */
102 4 j++;
103 4 j=j%N;
104 4 }
105 3
106 3 }
107 2 else
108 2 {//主write
109 3 // Receive:
110 3 //P1=0x55;while(1);
111 3 while(1){
112 4 temp=0;
113 4
114 4 //while(WorkFlag==0);WorkFlag=0;
115 4 while(SCL==0);
116 4 temp=SDA;
117 4 while(SCL==1);
C51 COMPILER V7.50 I2C_SUB 07/10/2007 21:26:01 PAGE 3
118 4 if(temp!=SDA) break;
119 4 for(i=1;i<8;i++)
120 4 {
121 5 while(WorkFlag==0);WorkFlag=0;
122 5 while(SCL==0);
123 5 temp=(temp<<1) | SDA;
124 5
125 5 }
126 4 while(WorkFlag==0);WorkFlag=0;
127 4 SDA=ACK;
128 4 while(WorkFlag==0);WorkFlag=0;
129 4 SDA=FREE;
130 4 SorceData[j]=temp;
131 4 j++;j=j%N;
132 4 //P1=temp;while(1);
133 4
134 4 }
135 3 P1=SorceData[0];
136 3 //DisplayOneChar(0,0,SorceData[0]|0x30);
137 3 //DisplayOneChar(0,0,SorceData[1]|0x30);
138 3 break;
139 3 }
140 2
141 2 }
142 1 LCMInit();
143 1 DisplayOneChar(0,0,SorceData[0]|0x30);
144 1 }
145
146
147 void negtive(void) interrupt 2
148 {
149 1 // bit i2c_temp;
150 1 WorkFlag=1;
151 1 return;
152 1 }
153
154
155
156
157 /*
158 while(SCL==0);
159 i2c_temp=SDA;
160 while(SCL==high);
161 if(i2c_temp!=SDA)
162 if((i2c_temp==high)&&(SDA==low)) {i2cstart=UP;num=1;}
163 else i2cstop = DOWN;
164 else {ddata=ddata<<1 |i2c_temp;num++;}
165
166 } */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 595 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 13
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -