📄 iic.lst
字号:
C51 COMPILER V7.06 IIC 03/25/2008 16:38:12 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN iic.OBJ
COMPILER INVOKED BY: D:\KIEL C\C51\BIN\C51.EXE iic.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //-----------------------函数声明,变量定义--------------------------------------------------------
2 #include <AT89X55.H>
3 #include <intrins.h>
4 #include"iic.h"
5 // 起动总线函数
6 //函数原型: void Start_I2c();
7 //功能: 启动I2C总线,即发送I2C起始条件.
8
9 //********************************************************************/
10 void Start_I2c()
11 {
12 1 SDA=1; /*发送起始条件的数据信号*/
13 1 _Nop();
14 1 SCL=1;
15 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
16 1 _Nop();
17 1 _Nop();
18 1 _Nop();
19 1 _Nop();
20 1 SDA=0; /*发送起始信号*/
21 1 _Nop(); /* 起始条件锁定时间大于4μs*/
22 1 _Nop();
23 1 _Nop();
24 1 _Nop();
25 1 _Nop();
26 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
27 1 _Nop();
28 1 _Nop();
29 1 }
30
31
32
33
34 /*******************************************************************
35 结束总线函数
36 函数原型: void Stop_I2c();
37 功能: 结束I2C总线,即发送I2C结束条件.
38
39 ********************************************************************/
40 void Stop_I2c()
41 {
42 1 SDA=0; /*发送结束条件的数据信号*/
43 1 _Nop(); /*发送结束条件的时钟信号*/
44 1 SCL=1; /*结束条件建立时间大于4μs*/
45 1 _Nop();
46 1 _Nop();
47 1 _Nop();
48 1 _Nop();
49 1 _Nop();
50 1 SDA=1; /*发送I2C总线结束信号*/
51 1 _Nop();
52 1 _Nop();
53 1 _Nop();
54 1 _Nop();
55 1 }
C51 COMPILER V7.06 IIC 03/25/2008 16:38:12 PAGE 2
56 bit WaitAck(void)
57 { uchar errtime=255;
58 1 SDA=1;
59 1 SCL=1;
60 1 while(SDA)
61 1 {errtime--;
62 2 if(!errtime)
63 2 {SCL=0;
64 3 return(0);
65 3 }
66 2 }
67 1 SCL=0;
68 1 }
69
70
71
72
73 /*******************************************************************
74 字节数据传送函数
75 函数原型: void SendByte(uchar c);
76 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
77 此状态位进行操作.(不应答或非应答都使ack=0 假)
78 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
79 ********************************************************************/
80 void SendByte(uchar c)
81 {
82 1 uchar BitCnt=0;
83 1
84 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
85 1 {
86 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
87 2 else SDA=0;
88 2 _Nop();
89 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
90 2 _Nop();
91 2 _Nop(); /*保证时钟高电平周期大于4μs*/
92 2 _Nop();
93 2 _Nop();
94 2 _Nop();
95 2 SCL=0;
96 2 }
97 1
98 1 _Nop();
99 1 _Nop();
100 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
101 1 _Nop();
102 1 _Nop();
103 1 SCL=1;
104 1 _Nop();
105 1 _Nop();
106 1 _Nop();
107 1 //if(SDA==1)ack=0;
108 1 // else ack=1; /*判断是否接收到应答信号*/
109 1 WaitAck();
110 1 SCL=0;
111 1 _Nop();
112 1 _Nop();
113 1 }
114 /********************************************************************
115 应答子函数
116 原型: void Ack_I2c(bit a);
117
C51 COMPILER V7.06 IIC 03/25/2008 16:38:12 PAGE 3
118 功能:主控器进行应答信号,(可以是应答或非应答信号)
119 ********************************************************************/
120 void Ack_I2c(bit a)
121 {
122 1
123 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
124 1 else SDA=1;
125 1 _Nop();
126 1 _Nop();
127 1 _Nop();
128 1 SCL=1;
129 1 _Nop();
130 1 _Nop(); /*时钟低电平周期大于4μs*/
131 1 _Nop();
132 1 _Nop();
133 1 _Nop();
134 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
135 1 _Nop();
136 1 _Nop();
137 1 }
138
139
140
141
142
143
144 /*******************************************************************
145 向无子地址器件发送字节数据函数
146 函数原型: bit ISendByte(uchar sla,ucahr c);
147 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
148 如果返回1表示操作成功,否则操作有误。
149 注意: 使用前必须已结束总线。
150 ********************************************************************/
151 bit ISendByte(uchar sla,uchar c)
152 {
153 1 Start_I2c(); /*启动总线*/
154 1 SendByte(sla); /*发送器件地址*/
155 1 //WaitAck();
156 1 SendByte(c); /*发送数据*/
157 1 WaitAck();
158 1 Stop_I2c(); /*结束总线*/
159 1 return(1);
160 1 }
161
162
163
164
165 /*******************************************************************
166 向有子地址器件发送多字节数据函数
167 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
168 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
169 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
170 如果返回1表示操作成功,否则操作有误。
171 注意: 使用前必须已结束总线。
172 ********************************************************************/
173 bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
174 {
175 1 uchar i;
176 1
177 1 Start_I2c(); /*启动总线*/
178 1 SendByte(sla); /*发送器件地址*/
179 1 WaitAck();
C51 COMPILER V7.06 IIC 03/25/2008 16:38:12 PAGE 4
180 1 SendByte(suba); /*发送器件子地址*/
181 1 WaitAck();
182 1
183 1 for(i=0;i<no;i++)
184 1 {
185 2 SendByte(*s); /*发送数据*/
186 2 WaitAck();
187 2 s++;
188 2 }
189 1 Stop_I2c(); /*结束总线*/
190 1 return(1);
191 1 }
192
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 201 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 6
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 + -