📄 display.lst
字号:
209 1 _Nop();
210 1 _Nop();
211 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
212 1 _Nop();
213 1 _Nop();
214 1 TOGGLE_WD();
215 1 }
216
217 /*******************************************************************
218 向932发送多字节数据子函数
219 函数原型: bit SendStr(uchar sla,uchar *s);
220 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
221 返回: 如果返回1表示操作成功,否则操作有误。
222 参数说明:sla为932器件写地址54H;*s为发送数据缓冲区指针,其指向的首地址
223 存放的是数据长度=长度+类型码+数据+校验;
224 ********************************************************************/
225 bit display(uchar *s)
226 {
227 1 uchar i;
228 1 uchar sum;
229 1 uchar j;
230 1 uchar len;
231 1 uchar *pt;
232 1 uchar k;
233 1 startwait(10); /*80ms*/
234 1 pt=s; /*保存数据的原始指针*/
235 1 for(j=0;j<5;i++)
236 1 {
237 2 s=pt; /*取指针*/
238 2 sum=0;
239 2 EX1=0;
240 2 I2C_BUSY=0;
CX51 COMPILER V7.20 DISPLAY 08/15/2005 15:35:54 PAGE 5
241 2 _Nop();
242 2 _Nop();
243 2 _Nop();
244 2 _Nop();
245 2 I2C_BUSY=1;
246 2 IE1=0;
247 2 EX1=1;
248 2 TR0=1; /*启动定时器*/
249 2 // maxtr=0; /*整个帧传送时间20ms*/
250 2 Start_I2c(); /*启动总线*/
251 2 if(SendByte(WRITE932)!=OK) goto next; /*发送932器件地址,无应答返回失败标志*/
252 2 len=*s;
253 2
254 2 for(i=0;i<len;i++)
255 2 {
256 3 if(SendByte(*s)!=OK) goto next; /*发送数据*/
257 3 sum+=*s;
258 3 s++;
259 3 for(k=0;k<2;k++)
260 3 {}
261 3 }
262 2 *s=~sum; /*test*/
263 2 if(SendByte(*s)!=OK) goto next; /*发送取反的校验和*/
264 2 for(k=0;k<6;k++)
265 2 {;;}
266 2 if(SendByte(*s)!=OK) goto next; /*发送取反的校验和*/
267 2 for(k=0;k<6;k++)
268 2 {;;}
269 2 Stop_I2c(); /*结束总线*/
270 2 return(OK); /*返回成功*/
271 2
272 2 next:Stop_I2c(); /*结束总线*/
273 2 if(T0IR)return(NOK);
274 2 }
275 1 //alarm=1; /*置报警位表发送失败*/
276 1 return(NOK); /*返回失败*/
277 1 }
278 /*******************************************************************
279 读取932数据函数
280 函数原型: bit RcvStr(uchar sla,ucahr *s);
281 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
282 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
283 如果返回1表示操作成功,否则操作有误。
284 注意: 使用前必须已结束总线。
285 ********************************************************************/
286 bit keyboard(uchar *s)
287 {
288 1 uchar i;
289 1 uchar sum;
290 1 uchar j;
291 1 uchar len; /*保存长度字节*/
292 1 uchar *pp;
293 1 uchar k;
294 1 //uint tagesave;
295 1 startwait(5);/*80ms*/
296 1 pp=s; /*保存数据的原始指针*/
297 1 TR0=1;
298 1 // maxtr=0;
299 1 for(j=0;j<5;j++)//07-22-03
300 1 {
301 2 s=pp; /*取指针*/
302 2 sum=0;
CX51 COMPILER V7.20 DISPLAY 08/15/2005 15:35:54 PAGE 6
303 2
304 2 // maxtr=0; /*整个帧传送时间20ms*/
305 2 Start_I2c(); /*启动总线*/
306 2
307 2 if(SendByte(READ932)!=OK) goto out; /*发送932器件地址,无应答返回失败标志*/
308 2
309 2 *s=RcvByte(); /*接收长度字节*/
310 2 len=*s;
311 2 //len=s[0];
312 2 if(len > 129) goto out ; /*接收到的数据长度不会超过80个字节*/
313 2 sum+= len; /*长度也进行累加*/
314 2 s++;
315 2 Ack_I2c(0); //test /*发送应答位*/
316 2
317 2 for(i=1;i<=len-1;i++)
318 2 {
319 3 *s=RcvByte(); /*接收数据*/
320 3 sum+= *s;
321 3 s++;
322 3 Ack_I2c(0); /*发送应答位*/
323 3
324 3 }
325 2 *s=RcvByte(); //07-22-03 /*接收校验和,最后字节*/
326 2 sum+=*s;
327 2 s++;
328 2 *s=sum;
329 2 if(sum==0xFF && !T0IR) //07-22-03 /*接收正确且在规定时间内*/
330 2 {
331 3 Ack_I2c(1); /*发送非应位*/
332 3 for(k=0;k<2;k++)
333 3 {}
334 3 Stop_I2c(); /*结束总线*/
335 3 alar(KEYALARM1,KEYALARM2);
336 3 //alar(1);
337 3 return(OK);
338 3 }
339 2 out:Ack_I2c(0); /*发送应位,重发5次*/
340 2 for(k=0;k<2;k++)
341 2 {}
342 2 Stop_I2c();
343 2 if(T0IR)return(NOK);/*超时*/
344 2
345 2 }
346 1
347 1 //alarmrcv=1;
348 1 return(NOK);
349 1 }
350
351 recept(uchar *s)
352 {
353 1 uchar i;
354 1 uchar sum;
355 1 uchar j;
356 1 //uchar len; /*保存长度字节*/
357 1 uchar *pp;
358 1 uchar k;
359 1 //uint tagesave;
360 1 startwait(5);/*80ms*/
361 1 pp=s; /*保存数据的原始指针*/
362 1 TR0=1;
363 1 // maxtr=0;
364 1 for(j=0;j<5;j++)//07-22-03
CX51 COMPILER V7.20 DISPLAY 08/15/2005 15:35:54 PAGE 7
365 1 {
366 2 s=pp; /*取指针*/
367 2 sum=0;
368 2
369 2 // maxtr=0; /*整个帧传送时间20ms*/
370 2 Start_I2c(); /*启动总线*/
371 2
372 2 if(SendByte(READ932)!=OK) goto out; /*发送932器件地址,无应答返回失败标志*/
373 2
374 2
375 2 for(i=0;i<4;i++)
376 2 {
377 3 *s=RcvByte(); /*接收数据*/
378 3 sum+= *s;
379 3 s++;
380 3 Ack_I2c(0); /*发送应答位*/
381 3
382 3 }
383 2 *s=RcvByte(); //07-22-03 /*接收校验和,最后字节*/
384 2 sum+=*s;
385 2 s++;
386 2 *s=sum;
387 2 if(sum==0xFF && !T0IR) //07-22-03 /*接收正确且在规定时间内*/
388 2 {
389 3 Ack_I2c(1); /*发送非应位*/
390 3 for(k=0;k<2;k++)
391 3 {}
392 3 Stop_I2c(); /*结束总线*/
393 3
394 3 //alar(1);
395 3 return(OK);
396 3 }
397 2 out:Ack_I2c(0); /*发送应位,重发5次*/
398 2 for(k=0;k<5;k++)
399 2 {}
400 2 Stop_I2c();
401 2 if(T0IR)return(NOK);/*超时*/
402 2
403 2 }
404 1
405 1 //alarmrcv=1;
406 1 return(NOK);
407 1 }
408
409
410 /*******************************************************************
411 字节数据传送函数
412 函数原型: void SendByte(uchar c);2464使用
413 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
414 此状态位进行操作.(不应答或非应答都使ack=0 假)
415 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
416 ********************************************************************/
417 bit SendByte2464(uchar c)
418 {
419 1 bit sendack;
420 1 uchar BitCnt;
421 1 TOGGLE_WD();
422 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
423 1 {
424 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
425 2 else SDA=0;
426 2 _Nop();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -