📄 text1.lst
字号:
C51 COMPILER V6.23a TEXT1 04/18/2006 22:42:29 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Text1.c DEBUG OBJECTEXTEND TABS(8)
stmt level source
1 #include<AT89X52.h>
2 #include<intrins.h>
3
4 #define DELAY_TIME 4
5 #define uchar unsigned char
6 #define FALSE 0
7 #define TRUE 1
8
9 sbit SCL=P2^6;
10 sbit SDA=P2^7;
11 sbit LED1=P0^0;
12
13
14 void DELAY(unsigned int t)
15 {
16 1 while(t--);
17 1 }
18
19 void IIC_Start(void) //启动IIC总线,当SCL为高电平时使SDA产生一个负跳变
20 {
21 1 SDA=1;
22 1 SCL=1;
23 1 DELAY(DELAY_TIME);
24 1 SDA=0;
25 1 DELAY(DELAY_TIME);
26 1 SCL=0;
27 1 DELAY(DELAY_TIME);
28 1 }
29
30 void IIC_Stop(void) //终止IIC总线,当SCL为高电平时使SDA产生一个正跳变
31 {
32 1 SDA=0;
33 1 SCL=1;
34 1 DELAY(DELAY_TIME);
35 1 SDA=1;
36 1 DELAY(DELAY_TIME);
37 1 SCL=0;
38 1 DELAY(DELAY_TIME);
39 1 }
40
41
42 void SEND_0(void) //发送0,在SCL为高电平时使SDA信号为低
43 {
44 1 SDA=0;
45 1 DELAY(DELAY_TIME);
46 1 SCL=1;
47 1 DELAY(DELAY_TIME);
48 1 SCL=0;
49 1
50 1 }
51
52 void SEND_1(void) //发送1,在SCL为高电平时始SDA信号为高
53 {
54 1 SDA=1;
55 1 DELAY(DELAY_TIME);
C51 COMPILER V6.23a TEXT1 04/18/2006 22:42:29 PAGE 2
56 1 SCL=1;
57 1 DELAY(DELAY_TIME);
58 1 SCL=0;
59 1
60 1 }
61
62 void Write_Byte(uchar b) reentrant //向IIC总线写一个字节
63 {
64 1 uchar i;
65 1 for(i=0;i<8;i++)
66 1 if((b<<i)&0x80)
67 1 SEND_1();
68 1 else
69 1 SEND_0();
70 1 }
71
72 uchar Read_Byte(void) reentrant //从IIC总线读一个字节
73 {
74 1 uchar b=0,i;
75 1 SDA=1; //释放总线
76 1 for(i=0;i<8;i++)
77 1 {
78 2 b<<=1;
79 2 SCL=0; DELAY(DELAY_TIME);
80 2 SCL=1; DELAY(DELAY_TIME);
81 2 b|=SDA;
82 2 }
83 1 SCL=0;
84 1 return b;
85 1 }
86
87 bit Check_ACK(void) //发送完一个字节后,检验设备的应答信号
88 {
89 1 uchar errtime=255;
90 1 SDA=1; DELAY(DELAY_TIME);
91 1 SCL=1; DELAY(DELAY_TIME);
92 1 while(SDA)
93 1 {
94 2 errtime--;
95 2 if(!errtime)
96 2 {
97 3 IIC_Stop();
98 3 return FALSE;
99 3 }
100 2 }
101 1 SCL=0;
102 1 return TRUE;
103 1 }
104
105 bit Write_N_Bytes(uchar AddrWr,uchar AddrWord,uchar *buffer,uchar num) reentrant
106 {
107 1 uchar i;
108 1 IIC_Start();
109 1 Write_Byte(AddrWr);
110 1 if(!Check_ACK()) return(FALSE);
111 1 Write_Byte(AddrWord);
112 1 if(!Check_ACK()) return(FALSE);
113 1 for(i=0;i<num;i++)
114 1 {
115 2 Write_Byte(*buffer);
116 2 if(!Check_ACK()) return(FALSE);
117 2 buffer++;
C51 COMPILER V6.23a TEXT1 04/18/2006 22:42:29 PAGE 3
118 2 }
119 1 IIC_Stop();
120 1 return TRUE;
121 1 }
122
123 bit Read_N_Bytes(uchar AddrWr,uchar AddrWord,uchar *buffer,uchar num) reentrant
124 {
125 1 uchar i;
126 1 IIC_Start();
127 1 Write_Byte(AddrWr);
128 1 if(!Check_ACK()) return FALSE;
129 1 Write_Byte(AddrWord);
130 1 if(!Check_ACK()) return FALSE;
131 1
132 1 IIC_Start();
133 1 Write_Byte(AddrWr+1);
134 1 if(!Check_ACK()) return FALSE;
135 1 for(i=0;i<num-1;i++)
136 1 {
137 2 *buffer=Read_Byte();
138 2 SEND_0();
139 2 buffer++;
140 2 }
141 1 *buffer=Read_Byte();
142 1 SEND_1();
143 1 IIC_Stop();
144 1 return TRUE;
145 1 }
146
147 void Public_Delay(uchar t)
148 {
149 1 uchar i,j;
150 1 for(i=0;i<t;i++)
151 1 for(j=0;j<250;j++);
152 1 }
153
154 void main(void)
155 {
156 1 uchar r[4]={0x7F,2,3,4};
157 1 bit t;
158 1 uchar b[4]={0};
159 1
160 1 t=Write_N_Bytes(0xa0,0x20,r,4);
161 1
162 1 if(t==TRUE)
163 1 P0=0x06;
164 1 else
165 1 P0=0x5b;
166 1
167 1 Public_Delay(65500);
168 1 Public_Delay(65500);
169 1
170 1 t=Read_N_Bytes(0xa0,0x20,b,4);
171 1 if(b[3]==4)//t==FALSE)
172 1 {P0=b[0];}
173 1 while(1)
174 1 { }
175 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 604 ----
C51 COMPILER V6.23a TEXT1 04/18/2006 22:42:29 PAGE 4
CONSTANT SIZE = 8 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 8
IDATA SIZE = ---- ----
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 + -