📄 iic.lst
字号:
C51 COMPILER V8.02 IIC 05/15/2008 11:56:36 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN IIC.OBJ
COMPILER INVOKED BY: D:\软件安装路径\C51\BIN\C51.EXE IIC.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <REG952.H>
2
3 #define uchar unsigned char
4 #define uint unsigned int
5
6 //以下为I2C操作时所需要的变量
7 volatile uchar I2C_sla; // 从机地址(即器件地址)
8 volatile uchar I2C_suba; // 子地址
9 volatile uchar *I2C_buf; // 数据缓冲区指针 (读操作时会被更改)
10 volatile uchar I2C_num; // 操作数据个数 (会被更改)
11 volatile uchar I2C_end; // 操作结束标志,为1时表示操作结束,为0xFF时表示操作失败 (会被设置)
12 volatile uchar I2C_suba_en; // 子地址使能控制,读操作时请设置为1,写操作时请设置为2 (会被更改)
13 //--------------------------------
14 //功能:IIC主机初始化
15 //--------------------------------
16 void IIC_Init()
17 {
18 1 // EI2C=1; //开I2C中断
19 1 CRSEL=0;
20 1 I2SCLL=15;
21 1 I2SCLH=15; //12Mhz下,IIC总线速率为120kbit/s
22 1 I2EN=1; //初始化为主机
23 1 STA=0; // 设置为主机,并启动总线
24 1 STO=0;
25 1 SI=0;
26 1
27 1
28 1 }
29 //--------------------------------
30 /****************************************************************************
31 * 名称:IRQ_I2C()
32 * 功能:I2C中断,通过判断I2C状态字进行相应的操作。
33 * 入口参数:无
34 * 出口参数:无
35 ****************************************************************************/
36 void IRQ_I2C(void) //interrupt 7
37 {
38 1 uchar sta;
39 1 sta = I2STAT; // 读出I2C状态字
40 1 switch(sta)
41 1 {
42 2 case 0x08: // 己发送起始条件
43 2 if(1==I2C_suba_en)
44 2 I2DAT = I2C_sla&0xFE; // 指定子地址读时,先写入地址
45 2 else I2DAT = I2C_sla; // 否则直接发送从机地址
46 2 STO=0;
47 2 SI=0; // SI=0
48 2 break;
49 2
50 2 case 0x10:
51 2 STO=0;
52 2 SI=0;
53 2 break;
54 2
55 2 case 0x20:
C51 COMPILER V8.02 IIC 05/15/2008 11:56:36 PAGE 2
56 2 case 0x18:
57 2 if(0==I2C_suba_en) // 无子地址,则直接发送数据
58 2 {
59 3 if(I2C_num>0)
60 3 {
61 4 I2DAT = *I2C_buf++;
62 4 SI=0;
63 4 I2C_num--;
64 4 }
65 3 else
66 3 {
67 4 I2CON = I2CON|0x10; // 无数据发送,结束总线
68 4 SI=0;
69 4 I2C_end = 1; // 设置总线操作结束标志
70 4 }
71 3 break;
72 3 }
73 2 if(1==I2C_suba_en) // 发送子地址
74 2 {
75 3 I2DAT = I2C_suba;
76 3 SI=0;
77 3 }
78 2 if(2==I2C_suba_en)
79 2 {
80 3 I2DAT = I2C_suba;
81 3 STA=0;
82 3 STO=0;
83 3 SI=0;
84 3 I2C_suba_en = 0; // 子地址己处理
85 3 }
86 2 break;
87 2 case 0x28:
88 2 case 0x30:
89 2 if(0==I2C_suba_en) // 无子地址,则直接发送数据
90 2 {
91 3 if(I2C_num>0)
92 3 {
93 4 I2DAT = *I2C_buf++;
94 4 STA=0;
95 4 STO=0;
96 4 SI=0;
97 4 I2C_num--;
98 4 }
99 3 else
100 3 {
101 4 STA=0; // 无数据发送,结束总线
102 4 STO=1;
103 4 SI=0;
104 4 I2C_end = 1;
105 4 }
106 3 break;
107 3 }
108 2 if(1==I2C_suba_en) // 若是指定地址读,则重新启动总线
109 2 {
110 3 I2CON = I2CON|0x20;
111 3 I2CON = I2CON&~0x08;
112 3 I2C_suba_en = 0; // 子地址己处理
113 3 }
114 2 break;
115 2 case 0x38:
116 2 STA=0;
117 2 STO=0;
C51 COMPILER V8.02 IIC 05/15/2008 11:56:36 PAGE 3
118 2 SI=0;
119 2 break;
120 2 default: break;
121 2 }
122 1 }
123
124 //延时子程序
125 void Delay(uint data DelayTime)
126 {
127 1 uint data j;
128 1 for(;DelayTime>0;DelayTime--)
129 1 for(j=0;j<125;j++)
130 1 {}
131 1 }
132
133 /****************************************************************************
134 * 名称:ISendStr()
135 * 功能:向有子地址器件发送多字节数据。
136 * 入口参数:sla 器件从机地址
137 * suba 器件子地址
138 * s 数据发送缓冲区指针
139 * no 发送数据个数
140 * 出口参数:返回值为0时表示出错,为1时表示操作正确。
141 * 说明:使用前要初始化好I2C引脚功能和I2C中断,并已使能I2C主模式
142 ****************************************************************************/
143 void ISendStr(uchar sla, uchar suba, uchar *s, uchar no)
144 { /* 参数设置 */
145 1 I2C_sla = sla; // 写操作的器件地址
146 1 I2C_suba = suba; // 子地址
147 1 I2C_buf = s;
148 1 I2C_num = no;
149 1 I2C_suba_en = 2; // 有子地址写
150 1 I2C_end = 0;
151 1 STA=1;
152 1 Delay(1); //延时1ms,等待从机完成IIC初始化
153 1 while(0==I2C_end)
154 1 {
155 2 if(SI==1)
156 2 IRQ_I2C();
157 2 }
158 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 284 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 6
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 + -