📄 general.lst
字号:
C51 COMPILER V7.50 GENERAL 04/13/2007 13:24:51 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE GENERAL
OBJECT MODULE PLACED IN general.OBJ
COMPILER INVOKED BY: E:\Keil\C51\BIN\C51.EXE general.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <Reg931.h>
2 #include <General.h>
3
4 #define GENERATE_STOP 0x54 // 置位 STO, 复位 STA 、 SI
5 #define RELEASE_BUS_ACK 0x44 // 复位 STO,STA,SI 并置位 AA (ack)
6 #define RELEASE_BUS_NOACK 0x40 // 复位 STO,STA,SI 并置位 AA (noack)
7 #define RELEASE_BUS_STA 0x64 // 起动总线/重新起动总线, 置位 STA
8
9 bit AckBus(void);
10 bit GetBus(void);
11 bit SendByte(uchar value);
12
13
14 //**********************************************************
15 // 总线响应
16 //功能:
17 //入口参数:无
18 //**********************************************************
19 bit AckBus(void)
20 {
21 1 uchar TimeOut;
22 1
23 1 TimeOut = 0xFF;
24 1
25 1 while(SI==0)
26 1 {
27 2 TimeOut--;
28 2 if( TimeOut==0x00 ) //100uS无响应,超时退出
29 2 {
30 3 I2CON = GENERATE_STOP;
31 3 return(0);
32 3 }
33 2 }
34 1
35 1 return(1);
36 1 }
37
38
39
40
41
42 //**********************************************************
43 // 总线申请
44 //功能:进行I2C总线的初始化:包括时钟选择,I2C使能,发送起始信号等等。
45 // I2EN为1,设置为主机;
46 // CRSEL位为0,使用内部SCL发生器。
47 //入口参数:无
48 //**********************************************************
49 bit GetBus(void)
50 {
51 1 // CCLK为7.3728MHz,参数0x14 实际总线频率为 92KHz
52 1 I2SCLH = 0x14; // 设置SCL高电平的PCLK周期数
53 1 I2SCLL = 0x14; // 设置SCL低电平的PCLK周期数
54 1 I2CON = RELEASE_BUS_STA; // 申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位
55 1 // while( SI==0 ); // 等待起始位的发送
C51 COMPILER V7.50 GENERAL 04/13/2007 13:24:51 PAGE 2
56 1 return(AckBus());
57 1 }
58
59
60
61 //**********************************************************
62 // 发送数据函数
63 // 功能: 用于向总线发送数据
64 // 入口参数:value 待发送的数据
65 //**********************************************************
66 bit SendByte(uchar value)
67 {
68 1 I2DAT = value;
69 1 I2CON = RELEASE_BUS_ACK; // 清除SI位等等
70 1 // while( SI==0 ); // 等待数据的发送
71 1 return(AckBus());
72 1 }
73
74
75
76
77 //**********************************************************
78 // 向有子地址器件发送多字节数据函数
79 //功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程。
80 //入口参数;AddrPtr 地址指针
81 // DataPrt 数据指针
82 // Ptr_length 数据长度
83 // 出口参数:返回1表示操作成功,否则操作有误。
84 //**********************************************************
85 bit ISendStr(uchar idata *AddrPtr,uchar idata *DataPrt,uchar idata *Ptr_length)
86 {
87 1 uchar i;
88 1 uchar Addr_len;
89 1 uchar Data_len;
90 1
91 1 Addr_len = *Ptr_length; //地址长度
92 1 Ptr_length++; //数据长度
93 1 Data_len = *Ptr_length;
94 1
95 1 if(GetBus()==0) return(0); //启动总线
96 1
97 1 if(SendByte(*AddrPtr)==0) return(0); //发送器件地址
98 1
99 1 if( I2STAT!=0x18 )
100 1 {
101 2 I2CON = GENERATE_STOP;
102 2 return(0);
103 2 }
104 1
105 1 for(i=1;i<Addr_len;i++)
106 1 {
107 2 AddrPtr++;
108 2
109 2 if(SendByte(*AddrPtr)==0)return(0); //发送器件子地址
110 2
111 2 if( I2STAT!=0x28 )
112 2 {
113 3 I2CON = GENERATE_STOP;
114 3 return(0);
115 3 }
116 2 }
117 1
C51 COMPILER V7.50 GENERAL 04/13/2007 13:24:51 PAGE 3
118 1 for(i=0; i<Data_len; i++)
119 1 {
120 2 if(SendByte(*DataPrt)==0)return(0); //发送数据
121 2
122 2 if( I2STAT!=0x28 )
123 2 {
124 3 I2CON = GENERATE_STOP;
125 3 return(0);
126 3 }
127 2 DataPrt++;
128 2 }
129 1
130 1 I2CON = GENERATE_STOP; //结束总线
131 1 return(1);
132 1 }
133
134
135
136
137 //**********************************************************
138 // 向有子地址器件读取多字节数据函数
139 //功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程。
140 //入口参数; AddrPtr 地址指针
141 // DataPrt 数据指针
142 // Ptr_length 数据长度
143 //出口参数: 函数返回1表示操作成功,否则操作有误。
144 //**********************************************************
145 bit IRcvStr(uchar idata *AddrPtr,uchar idata *DataPrt,uchar idata *Ptr_length)
146 {
147 1 uchar i;
148 1 uchar Addr_len;
149 1 uchar Data_len;
150 1 uchar read;
151 1
152 1 read = *AddrPtr+1; //取从器件地址
153 1 Addr_len = *Ptr_length;
154 1 Ptr_length++;
155 1 Data_len = *Ptr_length;
156 1
157 1 if(GetBus()==0) return(0); // 启动总线
158 1
159 1 if(SendByte(*AddrPtr)==0) return(0); //发送器件地址
160 1
161 1 if( I2STAT!=0x18 )
162 1 {
163 2 I2CON = GENERATE_STOP;
164 2 return(0);
165 2 }
166 1
167 1 for(i=1;i<Addr_len;i++) //发送器件子地址
168 1 {
169 2 AddrPtr++;
170 2
171 2 if(SendByte(*AddrPtr)==0)return(0);
172 2
173 2 if( I2STAT!=0x28 )
174 2 {
175 3 I2CON = GENERATE_STOP;
176 3 return(0);
177 3 }
178 2 }
179 1
C51 COMPILER V7.50 GENERAL 04/13/2007 13:24:51 PAGE 4
180 1 I2CON = RELEASE_BUS_STA; //重新启动总线
181 1 // while( SI==0 );
182 1 if(AckBus()==0) return(0);
183 1
184 1 if(SendByte(read)==0) return(0);
185 1
186 1 if( I2STAT!=0x40 )
187 1 {
188 2 I2CON = GENERATE_STOP;
189 2 return(0);
190 2 }
191 1
192 1
193 1 for(i=0; i<Data_len-1; i++)
194 1 {
195 2 I2CON = RELEASE_BUS_ACK; //接收一字节数据并发送应答位
196 2 // while( SI==0 ); //等待接收数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -