📄 iic.lst
字号:
C51 COMPILER V7.06 IIC 12/24/2007 12:35:57 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN IIC.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IIC.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.H>
2 #include <intrins.h>
3
4 sbit SCL = P1^6; /*IIC时钟线*/
5 sbit SDA = P1^7; /*IIC数据线*/
6
7 static unsigned char Mode;
8 /*----------------------------全局符号定义----------------------------*/
9 #define SomeNop(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
10
11 /******************************************************************
12 I2CStart:发动IIC总线起始信号
13 ******************************************************************/
14 void I2CStart (void)
15 {
16 1 SomeNop();
17 1
18 1 SCL = 1;
19 1 SomeNop();
20 1
21 1 SDA = 0;
22 1 SomeNop();
23 1 SCL = 0;
24 1 SomeNop();
25 1 }
26 /*****************************************************************
27 I2CStop:发出IIC总线结束信号
28 *****************************************************************/
29 void I2CStop(void)
30 {
31 1 SDA = 0;
32 1 SomeNop();
33 1 SCL = 1;
34 1 SomeNop();
35 1
36 1 SDA = 1;
37 1 SomeNop();
38 1 SCL = 0;
39 1 }
40 /***************************************************************
41 I2CInit:I2C总线初始化程序
42 ***************************************************************/
43 void I2CInit (void)
44 {
45 1 SCL=0;
46 1 SomeNop();
47 1 I2CStop();
48 1 }
49 /**************************************************************
50 I2Cclock: 发送总线时钟信号,并返回时钟电平为高期间SDA上的状态,
51 可用于发送,也可用于接收。
52 ***************************************************************/
53 bit I2CClock (void)
54 {
55 1 bit sample;
C51 COMPILER V7.06 IIC 12/24/2007 12:35:57 PAGE 2
56 1 SomeNop();
57 1 SCL = 1;
58 1 _nop_(); _nop_(); _nop_();
59 1 sample = SDA;
60 1 _nop_(); _nop_();
61 1 SCL = 0;
62 1 SomeNop();
63 1 return(sample);
64 1 }
65 /************************************************************
66 I2CSendByte: 向I2C总线发送一个字节,并请求应答,若收到应答
67 则返回1,否则返回0
68 **************************************************************/
69 bit I2CSendByte (char I2CData)
70 {
71 1 register unsigned char i;
72 1 for (i=0; i<8; i++){
73 2 SDA = (bit) (I2CData&0x80);
74 2 I2CData <<= 1;
75 2 I2CClock();
76 2 }
77 1 SDA = 1;
78 1 return(~I2CClock());
79 1 }
80 /************************************************************
81 I2CReceiveByte: 从总线接收1 个字节,并返回该字节,不回送
82 该字节,不回送应答信号,主函数调用本函数
83 应保证SDA为1
84 ************************************************************/
85 char I2CReceiveByte (void)
86 {
87 1 unsigned char I2CData = 0;
88 1 register unsigned char i;
89 1 for (i=0; i<8; i++)
90 1 {
91 2 I2CData <<= 1;
92 2 if (I2CClock())
93 2 I2CData++;
94 2 }
95 1 return(I2CData);
96 1 }
97 /************************************************************
98 I2CSendAck: 向I2C总线发送应答信号ACK
99 ************************************************************/
100 void I2CSendAck(void)
101 {
102 1 SDA=0;
103 1 I2CClock();
104 1 SDA = 1;
105 1 }
106 /***********************************************************
107 I2CSendNotAck: 发送非应答信号到I2C总线
108 **********************************************************/
109 void I2CSendNotAck (void)
110 {
111 1 SDA = 1;
112 1 I2CClock();
113 1 }
114 /*********************************************************
115 WRBYTES: 读写RAM单元
116 参数:
117 Ramaddr: 指定的RAM单元地址
C51 COMPILER V7.06 IIC 12/24/2007 12:35:57 PAGE 3
118 buf: 读写数据缓存区首地址
119 num: 从addr开始读写的数据字节个数
120 wr: 读写标志,1为主机读,0为主机写
121 **********************************************************/
122 void WRBYTES(unsigned masteraddr,unsigned char Ramaddr,unsigned char buf[],unsigned char num,bit wr)
123 {
124 1 unsigned char index;
125 1 EA = 0;
126 1 I2CInit();
127 1 I2CStart();
128 1 I2CSendByte(masteraddr);
129 1 I2CSendByte(Ramaddr);
130 1 if (wr==0)
131 1 {
132 2 for(index=0; index<num; index++)
133 2 {
134 3 I2CSendByte(buf[index]);
135 3 }
136 2 }
137 1 else if (wr==1)
138 1 {
139 2 I2CStart();
140 2 I2CSendByte(masteraddr|0x01);
141 2 for (index=0; index<num-1; index++)
142 2 {
143 3 SDA = 1;
144 3 buf[index] = I2CReceiveByte();
145 3 I2CSendAck ();
146 3 }
147 2 buf[index] = I2CReceiveByte();
148 2 I2CSendNotAck();
149 2 }
150 1 I2CStop();
151 1 EA = 1;
152 1 }
153
154
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 280 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 7
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 + -