📄 668i2c.lst
字号:
C51 COMPILER V7.06 668I2C 05/13/2006 14:22:51 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 668I2C
OBJECT MODULE PLACED IN 668i2c.OBJ
COMPILER INVOKED BY: E:\Program Files\Keil\C51\BIN\C51.EXE 668i2c.c OPTIMIZE(0,SPEED) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************************************************
2 P89C668单片机硬件I2C软件包,668i2c.c(主方式)
3 668的硬件I2C接口定义在P1.6,P1.7上,分别为P1.6=SCL;P1.7=SDA;(开漏输出)
4 相应寄存器:地址寄存器 S1ADR 用于存放自身从地址(从方式时才有用)
5 数据寄存器 S1DAT 接收/发送数据用
6 控制寄存器 S1CON 用于硬件I2C的设置、使能、启动、结束,
7 应答控制,中断标志等。
8 状态寄存器 S1STA 指示I2C总线的操作状态码,高5位有效,
9 若I2C中断志置位,可查询此寄存器判断
10 总线情况。
11 此软件包是以查询方式完成各种总线操作的,在使用前应对总线进行检查,并
12 使用看门狗,以防等待总线而造成死机。
13 2001-09-21
14 *******************************************************************/
15 #include "REG552.h" /*668的硬件I2C定义与552的一样*/
16 #define uchar unsigned char
17
18
19
20
21 /*******************************************************************
22 申请总线
23 功能:进行I2C总线的初始化--包括时钟速率,I2C使能,发送起始信号等
24 等。
25 *******************************************************************/
26 void GetBus()
27 {
28 1 S1CON=0xc5; /*设置时钟为100K(MCU主频为12M),ENS1和AA置位*/
29 1 STA=1; /*申请成为主机,起动总线*/
30 1 while(SI==0); /*等待起始位的发送*/
31 1 }
32
33 /*******************************************************************
34 发送数据函数
35 功能:用于向总线发送数据
36 *******************************************************************/
37 void SendByte(uchar c)
38 {
39 1 S1DAT=c;
40 1 S1CON=0XC5; /*清除SI位等待继续发送*/
41 1 while(SI==0); /*等待数据的发送*/
42 1 }
43
44 /*******************************************************************
45 向无子地址器件发送字节数据函数
46 函数原型: bit ISendByte(uchar sla,ucahr c);
47 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla,
48 待发送的数据c,如果返回1表示操作成功,否则操作有误。
49 ********************************************************************/
50 bit ISendByte(uchar sla,uchar c)
51 {
52 1 GetBus(); /*启动总线*/
53 1 SendByte(sla); /*发送器件地址,若无应答则返回*/
54 1 if(S1STA!=0X18){S1CON=0XD5;return(0);}
55 1 SendByte(c); /*发送数据*/
C51 COMPILER V7.06 668I2C 05/13/2006 14:22:51 PAGE 2
56 1 if(S1STA!=0X28){S1CON=0XD5;return(0);}
57 1 S1CON=0XD5; /*结束总线*/
58 1 return(1);
59 1 }
60
61
62
63
64
65
66 /*******************************************************************
67 向有子地址器件发送多字节数据函数
68 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
69 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
70 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
71 如果返回1表示操作成功,否则操作有误。
72 ********************************************************************/
73 bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
74 {
75 1 uchar i;
76 1
77 1 GetBus(); /*启动总线*/
78 1 SendByte(sla); /*发送器件地址*/
79 1 if(S1STA!=0X18){S1CON=0XD5;return(0);}
80 1 SendByte(suba); /*发送器件子地址*/
81 1 if(S1STA!=0X28){S1CON=0XD5;return(0);}
82 1
83 1 for(i=0;i<no;i++)
84 1 {
85 2 SendByte(*s); /*发送数据*/
86 2 if(S1STA!=0X28){S1CON=0XD5;return(0);}
87 2 s++;
88 2 }
89 1 S1CON=0XD5; /*结束总线*/
90 1 return(1);
91 1 }
92
93
94
95
96
97
98
99
100 /*******************************************************************
101 向无子地址器件读字节数据函数
102 函数原型: bit IRcvByte(uchar sla,ucahr *c);
103 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
104 址sla,返回值在c.
105 如果返回1表示操作成功,否则操作有误。
106 ********************************************************************/
107 bit IRcvByte(uchar sla,uchar *c)
108 {
109 1 GetBus(); /*启动总线*/
110 1 SendByte(sla+1); /*发送器件地址*/
111 1 if(S1STA!=0X40){S1CON=0XD5;return(0);}
112 1 S1CON=0XC1; /*接收一字节数据即发送非应答位*/
113 1 while(SI==0); /*等待接收数据*/
114 1 if(S1STA!=0X58){S1CON=0XD5;return(0);}
115 1 *c=S1DAT; /*读取数据*/
116 1 S1CON=0XD5; /*结束总线*/
117 1 return(1);
C51 COMPILER V7.06 668I2C 05/13/2006 14:22:51 PAGE 3
118 1 }
119
120
121
122
123
124
125
126
127 /*******************************************************************
128 向有子地址器件读取多字节数据函数
129 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
130 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
131 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
132 如果返回1表示操作成功,否则操作有误。
133 ********************************************************************/
134 bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
135 {
136 1 uchar i;
137 1
138 1 GetBus(); /*启动总线*/
139 1 SendByte(sla); /*发送器件地址*/
140 1 if(S1STA!=0X18){S1CON=0XD5;return(0);}
141 1 SendByte(suba); /*发送器件子地址*/
142 1 if(S1STA!=0X28){S1CON=0XD5;return(0);}
143 1 S1CON=0XE5; /*重新启动总线*/
144 1 while(SI==0);
145 1 SendByte(sla+1);
146 1 if(S1STA!=0X40){S1CON=0XD5;return(0);}
147 1
148 1 for(i=0;i<no-1;i++)
149 1 {
150 2 S1CON=0XC5; /*接收一字节数据并发送应答位*/
151 2 while(SI==0); /*等待接收数据*/
152 2 if(S1STA!=0X50){S1CON=0XD5;return(0);}
153 2 *s=S1DAT; /*读取数据*/
154 2 s++;
155 2 }
156 1 S1CON=0XC1; /*接收最后一字节数据并发送非应答位*/
157 1 while(SI==0);
158 1 *s=S1DAT;
159 1 S1CON=0XD5; /*结束总线*/
160 1 return(1);
161 1 }
162
163 /*软件包大小:326字节*/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 373 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 21 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -