📄 i2c.lst
字号:
C51 COMPILER V7.50 I2C 05/17/2006 14:04:54 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <intrins.h>
3 #include "i2c.h"
4
5
6 bit SCL,SDA ; //用于切换两个I2C存储器
7 #define HIGH 1
8 #define LOW 0
9 #define FALSE 0
10 #define TRUE 1
11
12 /*********************************
13
14 * 功 能:
15 * 播入5个NOP指令,用于延时
16
17 **********************************/
18 void delay_5us(void)
19 {
20 1 _nop_();
21 1 _nop_();
22 1 _nop_();
23 1 _nop_();
24 1 _nop_();
25 1 _nop_();
26 1 }
27
28 /**********************************
29
30 * 功 能:
31 * 提供I2C总线工作时序中的起始位
32 * SCL 为高时 SDA 由高变低时为启动信号
33
34 **********************************/
35 void i_start()
36 {
37 1 SCL = HIGH;
38 1 SDA = HIGH;
39 1 delay_5us();
40 1 SDA = LOW ;
41 1 delay_5us();
42 1 SCL = LOW ;
43 1 delay_5us();
44 1 }
45
46 /**********************************
47
48 * 功 能:
49 * 提供I2C总线工作时序中的停止位
50 * SCL 为高时 SDA 由低变高停止信号
51
52 **********************************/
53 void i_stop()
54 {
55 1 SCL = HIGH;
C51 COMPILER V7.50 I2C 05/17/2006 14:04:54 PAGE 2
56 1 SDA = LOW;
57 1 delay_5us();
58 1 SDA = HIGH;
59 1 delay_5us();
60 1 SCL = LOW;
61 1 delay_5us();
62 1 }
63
64 /*************************************
65
66 * 功 能:
67 * 提供I2C总线初始化
68
69 ***************************************/
70 void i_init()
71 {
72 1 SCL = LOW;
73 1 i_stop();
74 1 }
75
76 /***************************************
77
78 * 功 能:
79 * 提供I2C总线的时钟信号,并返回在时钟
80 * 电平为高期间SDA信号线上状态。
81 * 本函数可用于数据发送,也可用于数据接收
82
83 *****************************************/
84 bit i_clock()
85 {
86 1 SCL = HIGH;
87 1 delay_5us();
88 1 if(SDA)
89 1 {
90 2 SCL = LOW;
91 2 delay_5us();
92 2 return(1);
93 2 }
94 1 SCL = LOW;
95 1 delay_5us();
96 1 return (0);
97 1 }
98 /**********************************
99
100 * 功 能:
101 * 向I2C总线发送8位数据,并请求一个应答信号ACK,
102 * 如果接到ACK应答则返回TURE,否则返回FALSE
103
104 **********************************/
105 bit i_send( uchar i_data )
106 {
107 1 uchar i;
108 1 for( i = 0; i<8; i++ )
109 1 {
110 2 SDA = (bit)(i_data&0x80);
111 2 i_data <<= 1 ;
112 2 i_clock();
113 2 }
114 1 SDA = HIGH;
115 1 return ( ~i_clock() );
116 1 }
117
C51 COMPILER V7.50 I2C 05/17/2006 14:04:54 PAGE 3
118 /**********************************
119
120 * 功 能:
121 * 从I2C总线接收8位数据,并将接收到的数据做为1B返回
122 * 不回送应答信号ACK。主函数在调用本函数前应保证SDA
123 * 信号线处于浮置状态,高电平
124
125 **********************************/
126 uchar i_receive(void)
127 {
128 1 uchar i,i_data = 0;
129 1 for( i = 0; i<8; i++ )
130 1 {
131 2 i_data <<=1;
132 2 if( i_clock() )
133 2 {
134 3 i_data++;
135 3 }
136 2 }
137 1 return ( i_data );
138 1 }
139
140 /**********************************
141
142 * 功 能:
143 * 向I2C总线发送一个应答信号ACK,
144 * 一般用于连续读取时
145
146 **********************************/
147 void i_ack()
148 {
149 1 SDA = LOW;
150 1 i_clock();
151 1 SDA = HIGH;
152 1 }
153
154 /*****************************************
155
156 *功能:向24C04写入器件地址和一个指定的字节
157
158 ******************************************/
159
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 118 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -