📄 iicdemo.lst
字号:
C51 COMPILER V6.12 IICDEMO 09/23/2005 17:15:48 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE IICDEMO
OBJECT MODULE PLACED IN G:\C51PRJ\IICDEMO\IICDEMO.OBJ
COMPILER INVOKED BY: e:\keil\c51\BIN\C51.EXE G:\C51PRJ\IICDEMO\IICDEMO.C DB SB OE
stmt level source
1 /****************************************************************************/
2 /* */
3 /* Copyright (c) 2005, 老树工作室 */
4 /* All rights reserved. */
5 /* */
6 /* http://www.saintone.net Email:hxm0902@163.com */
7 /* QQ:112431149 Tel:010-62966630 */
8 /* */
9 /****************************************************************************/
10 /****************************************************************************/
11 /* 文件名:iicdemo.c */
12 /* 版 本:Version 1.0 */
13 /* 描 述:iic标准代码 */
14 /* 作 者:spot */
15 /* 函 数: */
16 /* iic_wait */
17 /* iic_start */
18 /* iic_stop */
19 /* iic_ack */
20 /* iic_no_ack */
21 /* iic_wait_ack */
22 /* iic_send_byte */
23 /* iic_receive_byte */
24 /* */
25 /* 历史记录: */
26 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
27 /****************************************************************************/
28 #include <reg52.h>
29 #include <absacc.h>
30 #include <intrins.h>
31
32 typedef unsigned char u_char;
33 typedef unsigned int u_int;
34
35 sbit SDA = P0^5; /* iic数据传送位 */
36 sbit SCL = P0^4; /* iic时钟控制位 */
37
38 /* 函数声明 */
39 void iic_wait(void); /* iic延时 */
40 void iic_start(void); /* 开启iic总线 */
41 void iic_stop(void); /* 关闭iic总线 */
42 void iic_ack(void); /* 发送ACK信号 */
43 void iic_no_ack(void); /* 发送NOACK信号 */
44 bit iic_wait_ack(void); /* 等待ACK信号 */
45 void iic_send_byte(u_char demand); /* MCU向iic设备发送一个字节 */
46 u_char iic_receive_byte(void); /* MCU从iic设备接收一个字节 */
47 /* 声明结束 */
48
49 /* iic延时 */
50 void iic_wait(void)
51 {
52 1 _nop_();
53 1 _nop_();
54 1 _nop_();
55 1 _nop_();
C51 COMPILER V6.12 IICDEMO 09/23/2005 17:15:48 PAGE 2
56 1 }
57
58 /* 开启iic总线 */
59 void iic_start(void)
60 {
61 1 SDA = 1;
62 1 SCL = 1;
63 1 iic_wait();
64 1 SDA = 0;
65 1 iic_wait();
66 1 SCL = 0;
67 1 }
68
69 /* 关闭iic总线 */
70 void iic_stop(void)
71 {
72 1 SDA=0;
73 1 SCL=0;
74 1 iic_wait();
75 1 SCL=1;
76 1 iic_wait();
77 1 SDA=1;
78 1 }
79
80 /* 发送ACK信号 */
81 void iic_ack(void)
82 {
83 1 SDA=0;
84 1 iic_wait();
85 1 SCL=1;
86 1 iic_wait();
87 1 SCL=0;
88 1 }
89
90 /* 发送NOACK信号 */
91 void iic_no_ack(void)
92 {
93 1 SDA=1;
94 1 iic_wait();
95 1 SCL=1;
96 1 iic_wait();
97 1 SCL=0;
98 1 }
99
100 /****************************************************************************/
101 /* 函数名:iic_wait_ack */
102 /* 功 能:等待ACK信号 */
103 /* 作 者:spot */
104 /* 输 入:无 */
105 /* 输 出:1-ACK 0-ERROR */
106 /* */
107 /* 历史记录: */
108 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
109 /****************************************************************************/
110 bit iic_wait_ack(void)
111 {
112 1 u_char errtime=255;
113 1 //u_int errtime = 1000;
114 1
115 1 SDA=1;
116 1 iic_wait();
117 1 SCL=1;
C51 COMPILER V6.12 IICDEMO 09/23/2005 17:15:48 PAGE 3
118 1 iic_wait();
119 1
120 1 while(SDA)
121 1 {
122 2 errtime--;
123 2 if(!errtime)
124 2 return 0;
125 2 }
126 1
127 1 SCL=0;
128 1 return 1;
129 1 }
130
131 /****************************************************************************/
132 /* 函数名:iic_send_byte */
133 /* 功 能:MCU向iic设备发送一个字节 */
134 /* 作 者:spot */
135 /* 输 入: */
136 /* sbyte 待发送的字节数据 */
137 /* */
138 /* 输 出:无 */
139 /* */
140 /* 历史记录: */
141 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
142 /****************************************************************************/
143 void iic_send_byte(u_char sbyte)
144 {
145 1 u_char i = 8;
146 1
147 1 while(i--)
148 1 {
149 2 SCL = 0;
150 2 _nop_();
151 2 SDA = (bit)(sbyte&0x80);
152 2 sbyte <<= 1;
153 2 iic_wait();
154 2 SCL = 1;
155 2 iic_wait();
156 2 }
157 1
158 1 SCL=0;
159 1 }
160
161 /****************************************************************************/
162 /* 函数名:iic_receive_byte */
163 /* 功 能:MCU从iic设备接收一个字节 */
164 /* 作 者:spot */
165 /* 输 入:无 */
166 /* 输 出:ddata 接收数据 */
167 /* */
168 /* 历史记录: */
169 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
170 /****************************************************************************/
171 u_char iic_receive_byte(void)
172 {
173 1 u_char i=8;
174 1 u_char ddata=0;
175 1
176 1 SDA=1;
177 1 while(i--)
178 1 {
179 2 ddata <<= 1;
C51 COMPILER V6.12 IICDEMO 09/23/2005 17:15:48 PAGE 4
180 2 SCL=0;
181 2 iic_wait();
182 2 SCL=1;
183 2 iic_wait();
184 2 ddata |= SDA;
185 2 }
186 1 SCL=0;
187 1 return ddata;
188 1 }
189
190 /****************************************************************************/
191 /* 函数名:write_iic_data */
192 /* 功 能:向iic设备写入N个字节 */
193 /* 作 者:spot */
194 /* 输 入: */
195 /* write_data 存放写入字节的数组 */
196 /* address 指定从address处开始写入 */
197 /* num 写入的字节数 */
198 /* */
199 /* 输 出:无 */
200 /* */
201 /* 历史记录: */
202 /* spot 2005-06-20 Creat Inital version. (Version 1.0) */
203 /****************************************************************************/
204 void write_iic_data(u_char write_data[], u_int address, u_char num)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -