📄 i2c.lst
字号:
C51 COMPILER V7.07 I2C 07/08/2004 05:56:07 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\Output\I2C.obj
COMPILER INVOKED BY: M:\Keil\C51\BIN\C51.EXE I2C.C ROM(COMPACT) BROWSE MODP2 DEBUG OBJECTEXTEND CODE LISTINCLUDE SYMBOLS
- PRINT(.\List\I2C.lst) OBJECT(.\Output\I2C.obj)
stmt level source
1 /*******************************************************************
2 P89C668 单片机硬件I2C 软件包I2C.c 主方式
3
4 668 的硬件I2C 接口定义在P1.6,P1.7 上,分别为P1.6=SCL;P1.7=SDA; (开漏输出)
5 相应寄存器 地址寄存器S1ADR --用于存放自身从地址(从方式时才有用)。
6 数据寄存器S1DAT --接收/发送数据用。
7 控制寄存器S1CON --用于硬件I2C 的设置使能、启动、结束,
8 应答控制,中断标志等。
9 状态寄存器S1STA --指示I2C 总线的操作状态码,高5 位有效
10 若I2C 中断志置位,可查询此寄存器判断
11 总线情况。
12
13 !此软件包是以查询方式完成各种总线操作的,在使用前应对总线进行检查,并
14 使用看门狗,以防等待总线而造成死机。
15
16 !系统工作主频不要高于12MHz
17
18 *******************************************************************/
19
20 #include <REG668.H> /*P89C668 的硬件I2C 定义与552 的一样*/
1 =1 /*-------------------------------------------------------------------------
2 =1 REG668.H
3 =1
4 =1 Header file for Philips 8xC668
5 =1
6 =1 Copyright (c)2002 Keil Elektronik GmbH and Keil Software, Inc.
7 =1 All rights reserved.
8 =1 -------------------------------------------------------------------------*/
9 =1
10 =1 #ifndef __REG668_H__
11 =1 #define __REG668_H__
12 =1
13 =1 /* BYTE Registers */
14 =1 sfr ACC = 0xE0;
15 =1 sfr AUXR = 0x8E;
16 =1 sfr AUXR1 = 0xA2;
17 =1 sfr B = 0xF0;
18 =1 sfr CCAP0H = 0xFA;
19 =1 sfr CCAP1H = 0xFB;
20 =1 sfr CCAP2H = 0xFC;
21 =1 sfr CCAP3H = 0xFD;
22 =1 sfr CCAP4H = 0xFE;
23 =1 sfr CCAP0L = 0xEA;
24 =1 sfr CCAP1L = 0xEB;
25 =1 sfr CCAP2L = 0xEC;
26 =1 sfr CCAP3L = 0xED;
27 =1 sfr CCAP4L = 0xEE;
28 =1 sfr CCAPM0 = 0xC2;
29 =1 sfr CCAPM1 = 0xC3;
30 =1 sfr CCAPM2 = 0xC4;
31 =1 sfr CCAPM3 = 0xC5;
32 =1 sfr CCAPM4 = 0xC6;
33 =1 sfr CCON = 0xC0;
34 =1 sfr CH = 0xF9;
C51 COMPILER V7.07 I2C 07/08/2004 05:56:07 PAGE 2
35 =1 sfr CL = 0xE9;
36 =1 sfr CMOD = 0xC1;
37 =1 sfr DPH = 0x83;
38 =1 sfr DPL = 0x82;
39 =1 sfr IEN0 = 0xA8;
40 =1 sfr IEN1 = 0xE8;
41 =1 sfr IP = 0xB8;
42 =1 sfr IPH = 0xB7;
43 =1 sfr P0 = 0x80;
44 =1 sfr P1 = 0x90;
45 =1 sfr P2 = 0xA0;
46 =1 sfr P3 = 0xB0;
47 =1 sfr PCON = 0x87;
48 =1 sfr PSW = 0xD0;
49 =1 sfr RCAP2H = 0xCB;
50 =1 sfr RCAP2L = 0xCA;
51 =1 sfr SADDR = 0xA9;
52 =1 sfr SADEN = 0xB9;
53 =1 sfr S0BUF = 0x99;
54 =1 sfr S0CON = 0x98;
55 =1 sfr SP = 0x81;
56 =1 sfr S1DAT = 0xDA;
57 =1 sfr S1IST = 0xDC;
58 =1 sfr S1ADR = 0xDB;
59 =1 sfr S1STA = 0xD9;
60 =1 sfr S1CON = 0xD8;
61 =1 sfr TCON = 0x88;
62 =1 sfr T2CON = 0xC8;
63 =1 sfr T2MOD = 0xC9;
64 =1 sfr TH0 = 0x8C;
65 =1 sfr TH1 = 0x8D;
66 =1 sfr TH2 = 0xCD;
67 =1 sfr TL0 = 0x8A;
68 =1 sfr TL1 = 0x8B;
69 =1 sfr TL2 = 0xCC;
70 =1 sfr TMOD = 0x89;
71 =1 sfr WDTRST = 0xA6;
72 =1
73 =1 /* BIT Registers */
74 =1
75 =1 sbit CY = PSW^7;
76 =1 sbit AC = PSW^6;
77 =1 sbit F0 = PSW^5;
78 =1 sbit RS1 = PSW^4;
79 =1 sbit RS0 = PSW^3;
80 =1 sbit OV = PSW^2;
81 =1 sbit UD = PSW^1;
82 =1 sbit P = PSW^0;
83 =1
84 =1 sbit AD7 = P0^7;
85 =1 sbit AD6 = P0^6;
86 =1 sbit AD5 = P0^5;
87 =1 sbit AD4 = P0^4;
88 =1 sbit AD3 = P0^3;
89 =1 sbit AD2 = P0^2;
90 =1 sbit AD1 = P0^1;
91 =1 sbit AD0 = P0^0;
92 =1
93 =1 sbit TF1 = TCON^7;
94 =1 sbit TR1 = TCON^6;
95 =1 sbit TF0 = TCON^5;
96 =1 sbit TR0 = TCON^4;
C51 COMPILER V7.07 I2C 07/08/2004 05:56:07 PAGE 3
97 =1 sbit IE1 = TCON^3;
98 =1 sbit IT1 = TCON^2;
99 =1 sbit IE0 = TCON^1;
100 =1 sbit IT0 = TCON^0;
101 =1
102 =1 sbit SDA = P1^7;
103 =1 sbit SCL = P1^6;
104 =1 sbit CEX2 = P1^5;
105 =1 sbit CEX1 = P1^4;
106 =1 sbit CEX0 = P1^3;
107 =1 sbit ECI = P1^2;
108 =1 sbit T2EX = P1^1;
109 =1 sbit T2 = P1^0;
110 =1
111 =1 sbit SM0 = S0CON^7;
112 =1 sbit FE = S0CON^7;
113 =1 sbit SM1 = S0CON^6;
114 =1 sbit SM2 = S0CON^5;
115 =1 sbit REN = S0CON^4;
116 =1 sbit TB8 = S0CON^3;
117 =1 sbit RB8 = S0CON^2;
118 =1 sbit TI = S0CON^1;
119 =1 sbit RI = S0CON^0;
120 =1
121 =1 sbit CR2 = S1CON^7;
122 =1 sbit ENS1 = S1CON^6;
123 =1 sbit STA = S1CON^5;
124 =1 sbit STO = S1CON^4;
125 =1 sbit SI = S1CON^3;
126 =1 sbit AA = S1CON^2;
127 =1 sbit CR1 = S1CON^1;
128 =1 sbit CR0 = S1CON^0;
129 =1
130 =1 sbit AD15 = P2^7;
131 =1 sbit AD14 = P2^6;
132 =1 sbit AD13 = P2^5;
133 =1 sbit AD12 = P2^4;
134 =1 sbit AD11 = P2^3;
135 =1 sbit AD10 = P2^2;
136 =1 sbit AD9 = P2^1;
137 =1 sbit AD8 = P2^0;
138 =1
139 =1 sbit EA = IEN0^7;
140 =1 sbit EC = IEN0^6;
141 =1 sbit ES1 = IEN0^5;
142 =1 sbit ES0 = IEN0^4;
143 =1 sbit ET1 = IEN0^3;
144 =1 sbit EX1 = IEN0^2;
145 =1 sbit ET0 = IEN0^1;
146 =1 sbit EX0 = IEN0^0;
147 =1
148 =1 sbit ET2 = IEN1^0;
149 =1
150 =1 sbit RD = P3^7;
151 =1 sbit WR = P3^6;
152 =1 sbit T1 = P3^5;
153 =1 sbit T0 = P3^4;
154 =1 sbit INT1 = P3^3;
155 =1 sbit INT0 = P3^2;
156 =1 sbit TXD = P3^1;
157 =1 sbit RXD = P3^0;
158 =1
C51 COMPILER V7.07 I2C 07/08/2004 05:56:07 PAGE 4
159 =1 sbit TF2 = T2CON^7;
160 =1 sbit EXF2 = T2CON^6;
161 =1 sbit RCLK = T2CON^5;
162 =1 sbit TCLK = T2CON^4;
163 =1 sbit EXEN2 = T2CON^3;
164 =1 sbit TR2 = T2CON^2;
165 =1 sbit CT2 = T2CON^1;
166 =1 sbit CP = T2CON^0;
167 =1
168 =1 #endif
21
22 #define uchar unsigned char
23
24
25
26 /*******************************************************************
27 检查总线是否正常
28 功能: 进行I2C 总线的初始化前的检查
29 如果返回0,表示总线有误。
30 如果返回1,表示总线正常。
31 *******************************************************************/
32 bit I2C_CheckBus()
33 {
34 1 SCL=0;
35 1 SDA=1;
36 1 if(SDA==0)
37 1 return(0); /*SCL、SDA 短路,或SDA被锁为低*/
38 1
39 1 SCL=1;
40 1 if(SCL==0)
41 1 return(0); /*SCL 被锁为低*/
42 1
43 1 return(1); /*总线正常*/
44 1 }
45
46
47
48 /*******************************************************************
49 申请总线
50 功能: 进行I2C 总线的初始化--包括时钟速率,I2C 使能,发送起始信号等
51 *******************************************************************/
52 void I2C_GetBus()
53 {
54 1 I2C_CheckBus();
55 1 S1CON=0xc5; /*设置时钟为100K MCU 主频为12M ENS1 和AA 置位*/
56 1 /* 0xc5 = 1100 0101 */
57 1 STA=1; /*申请成为主机起动总线*/
58 1 while(SI==0); /*等待起始位的发送*/
59 1 }
60
61 /*******************************************************************
62 结束总线
63 功能: 用于结束总线。
64 *******************************************************************/
65 void I2C_Stop()
66 {
67 1 S1CON=0XD5; /*结束总线*/
68 1 }
69
70 /*******************************************************************
71 发送数据函数
72 功能: 用于向总线发送数据。
C51 COMPILER V7.07 I2C 07/08/2004 05:56:07 PAGE 5
73 *******************************************************************/
74 void I2C_Send(uchar c)
75 {
76 1 S1DAT=c;
77 1 S1CON=0XC5; /*清除SI 位等等*/
78 1 while(SI==0); /*等待数据的发送*/
79 1 }
80
81
82
83 /*******************************************************************
84 向无子地址器件发送字节数据函数
85 函数原型: bit I2C_SendByte(uchar sla,ucahr c);
86 功能: 从启动总线到发送地址、数据,结束总线的全过程,从器件地址sla,
87 待发送的数据c ,如果返回1 表示操作成功,否则操作有误。
88 ********************************************************************/
89 bit I2C_SendByte(uchar sla,uchar c)
90 {
91 1 I2C_GetBus(); /*启动总线*/
92 1
93 1 I2C_Send(sla); /*发送器件地址,若无应答则返回*/
94 1 if(S1STA!=0X18)
95 1 {
96 2 S1CON=0XD5;
97 2 return(0);
98 2 }
99 1
100 1 I2C_Send(c); /*发送数据,若无应答则返回*/
101 1 if(S1STA!=0X28)
102 1 {
103 2 S1CON=0XD5;
104 2 return(0);
105 2 }
106 1
107 1 S1CON=0XD5; /*结束总线*/
108 1
109 1 return(1);
110 1 }
111
112
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -