📄 366.lst
字号:
239
C51 COMPILER V6.10 366 01/16/2006 16:07:10 PAGE 5
240
241 void START24C02(void) /////启动24c02
242 {
243 1 scl=0;sda=1; //用“读”来开始准备启动24C02的工作,把数据线置高,为启动的“下跳”准备
244 1 scl=1;sda=0; //启动
245 1 scl=0; //为“写”周期做准备,即准备控制线上跳。
246 1 }
247
248 void STOP24C02(void) /////停止24C02
249 {
250 1 sda=0;scl=1;
251 1 sda=1;scl=0;
252 1 }
253
254 bit Check24C02() //应答位检查
255 {
256 1 bit Check=0;
257 1 sda=1;scl=1;
258 1 Check=sda; //接收应答信号
259 1 scl=0;
260 1 return(Check);
261 1 }
262
263 void MACK(void) //发送应答
264 {
265 1 sda=0;scl=1;scl=0;sda=1;
266 1 }
267
268 void MNACK(void) //发送非应答
269 {
270 1 sda=1;scl=1;scl=0;sda=0;
271 1 }
272
273 void WriteOneByte(unsigned char dd) ///写一个字节,已经完善,不再修改-----------------------------
274 {
275 1 ACC=dd;
276 1 sda=aa7;scl=1;scl=0; // 数据在scl=0时才能改变
277 1 sda=aa6;scl=1;scl=0;
278 1 sda=aa5;scl=1;scl=0;
279 1 sda=aa4;scl=1;scl=0;
280 1 sda=aa3;scl=1;scl=0;
281 1 sda=aa2;scl=1;scl=0;
282 1 sda=aa1;scl=1;scl=0;
283 1 sda=aa0;_nop_();scl=1;scl=0;
284 1 sda=0; //令总线处于备用状态
285 1 }
286
287 unsigned char ReadOneByte(void) /////读一个字节-------------------------------
288 {
289 1 sda=1;
290 1 scl=1;aa7=sda;scl=0;sda=1;
291 1 scl=1;aa6=sda;scl=0;sda=1;
292 1 scl=1;aa5=sda;scl=0;sda=1;
293 1 scl=1;aa4=sda;scl=0;sda=1;
294 1 scl=1;aa3=sda;scl=0;sda=1;
295 1 scl=1;aa2=sda;scl=0;sda=1;
296 1 scl=1;aa1=sda;scl=0;sda=1;
297 1 scl=1;aa0=sda;scl=0;
298 1 return(ACC);
299 1 }
300 //---------------------------------------写整个数组到24c02----------------------------------//
301
C51 COMPILER V6.10 366 01/16/2006 16:07:10 PAGE 6
302 void Write24C02_Array(Number NUMBERW)
303 /////入口参数为待传送数组
304 {
305 1 unsigned char NUMSERIAL;
306 1 unsigned char NUMBYT=NUMBERW[1]+1; //取组成员个数
307 1 unsigned char i;
308 1 bit Check_bit;
309 1 NUMSERIAL=NUMBERW[0]; //取组的序号
310 1
311 1 switch(NUMSERIAL) //设定数组存放起始位置
312 1 {
313 2 case 1: NUMSERIAL=102; break; //数组1的起始位置=0 长24位
314 2 case 2: NUMSERIAL=124;break; //数组2的起始位置=21 长13位
315 2 case 3: NUMSERIAL=144;break; //数组3的起始位置=34 长13位
316 2 case 4: NUMSERIAL=164;break; //数组4的起始位置=47 长13位
317 2 case 5: NUMSERIAL=184;break; //数组5的起始位置=60 长13位
318 2 case 6: NUMSERIAL=204;break; //数组6的起始位置=73 长13位
319 2 case 7: NUMSERIAL=224;break; //数组7的起始位置=86 长5 位
320 2 case 8: NUMSERIAL=230;break; //数组8的起始位置=90 长2位
321 2 case 9: NUMSERIAL=233;break; //数组9的起始位置=91 长3位
322 2
323 2 }
324 1 for(i=1;i<=NUMBYT;i++)
325 1 {
326 2 startWrite: START24C02(); //START24C02()执行完后,scl=0,sda=0
327 2 WriteOneByte(160); //寻址字节为0A0H,“写”;执行完后,scl=0,sda=0
328 2 Check_bit=Check24C02(); //校验应答位;执行完后,scl=0,sda不管
329 2 if(Check_bit==1) //如果出错,从新启动总线
330 2 goto startWrite;
331 2
332 2 WriteOneByte(NUMSERIAL); //确定片内寻址地址
333 2 Check_bit=Check24C02(); //校验应答位
334 2 if(Check_bit==1) //如果出错,从新启动总线
335 2 goto startWrite;
336 2
337 2 WriteOneByte(NUMBERW[i]); //原数组把组的序号放在“0”位置,组成员个数放在“1”位置
338 2 Check_bit=Check24C02();
339 2 if(Check_bit==1) //如果出错,从新启动总线
340 2 goto startWrite;
341 2
342 2 STOP24C02(); //执行完后,scl=0,sda=1
343 2 NUMSERIAL=NUMSERIAL+1;
344 2 }
345 1 }//---------------------------------------写整个数组到24c02结束----------------------------------//
346
347
348 //-----------------------------------读内容到整个结构,数组开始------------------------------------------/
-/
349 struct ReadArray Read24C02_Array(unsigned char NUMSERIAL)
350 {
351 1 bit Check_bit;
352 1 unsigned char i;
353 1 struct ReadArray READARRAY;
354 1 switch(NUMSERIAL) //设定数组存放起始位置
355 1 {
356 2 case 1: NUMSERIAL=102; break; //数组1的起始位置=0 长20位
357 2 case 2: NUMSERIAL=124;break; //数组2的起始位置=20 长13位
358 2 case 3: NUMSERIAL=144;break; //数组3的起始位置=33 长13位
359 2 case 4: NUMSERIAL=164;break; //数组4的起始位置=46 长13位
360 2 case 5: NUMSERIAL=184;break; //数组5的起始位置=59 长13位
361 2 case 6: NUMSERIAL=204;break; //数组6的起始位置=72 长13位
362 2 case 7: NUMSERIAL=224;break; //数组7的起始位置=85 长5 位
C51 COMPILER V6.10 366 01/16/2006 16:07:10 PAGE 7
363 2 case 8: NUMSERIAL=230;break; //数组8的起始位置=89 长2位
364 2 case 9: NUMSERIAL=233;break; //数组9的起始位置=90 长3位
365 2 }
366 1
367 1 startRead: START24C02();
368 1 WriteOneByte(160); //寻址字节为0A0H,“写”
369 1 Check_bit=Check24C02(); //校验应答位
370 1 if(Check_bit==1) //如果出错,从新启动总线
371 1 goto startRead;
372 1
373 1 WriteOneByte(NUMSERIAL); //确定片内寻址地址
374 1 Check_bit=Check24C02(); //校验应答位
375 1 if(Check_bit==1) //如果出错,从新启动总线
376 1 goto startRead;
377 1 STOP24C02(); // 执行完后,scl=0,sda=1
378 1
379 1 startReadD: START24C02();
380 1 WriteOneByte(161); //寻址字节为0A1H,“读”
381 1 Check_bit=Check24C02(); //校验应答位
382 1 if(Check_bit==1) //如果出错,从新启动总线
383 1 goto startReadD;
384 1
385 1 READARRAY.Number24[1]=ReadOneByte(); //读出本组有多少个成员,[0]位预留,组成员个数放在[1]位置
386 1 //执行“读”完后,scl=0,sda任意
387 1 if(READARRAY.Number24[1]==0)
388 1 MNACK();
389 1 else
390 1 {
391 2 MACK(); //发送校验
392 2 for(i=0;i<READARRAY.Number24[1];i++)
393 2 {
394 3 READARRAY.Number24[i+2]=ReadOneByte();
395 3 if(i<READARRAY.Number24[1]-1)
396 3 MACK();
397 3 else MNACK();
398 3 }
399 2 }
400 1 STOP24C02();
401 1 return(READARRAY);
402 1 }//---------------------------读内容到整个结构,数组结束------------------------------------------//
403
404 //------------------------------处理在一次下位机发送报警信息来过程中的读取 ,存储-------------------------
----------//
405
406 void READ_MESSAGE()
407 {
408 1
409 1 unsigned char Number_Note=0; //记录是第几个“下位机输入信号”
410 1 unsigned char Number_Key; //存储“电话机输入键值”的中间变量
411 1 Number NUMBER; //生成记录一次摘机过程的数组
412 1 JISHU=5000; //配合晶振,等待1秒
413 1
414 1 ReadStatus: MT8880_StatusRegister_READ();
415 1
416 1 if(MT8880_D2==1) //是否有键值生成
417 1 {
418 2 MT8880_CP2=0; //停动8880总线
419 2 MT8880_CS=1; //停动8880总线
420 2
421 2 MT8880_DataRegister_READ(); //读入的一个值出现在MT8880_D0-D3
422 2
423 2 if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==1) //输入“1”
C51 COMPILER V6.10 366 01/16/2006 16:07:10 PAGE 8
424 2 {Number_Key=1; }
425 2 if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==0) //输入“2”
426 2 {Number_Key=2; }
427 2 if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1) //输入“3”
428 2 {Number_Key=3; }
429 2 if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==0) //输入“4”
430 2 {Number_Key=4; }
431 2 if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==1) //输入“5”
432 2 {Number_Key=5; }
433 2 if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==0) //输入“6”
434 2 {Number_Key=6; }
435 2 if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==1) //输入“7”
436 2 {Number_Key=7;}
437 2 if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==0) //输入“8”
438 2 {Number_Key=8;}
439 2 if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==1) //输入“9”
440 2 {Number_Key=9; }
441 2 if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==0) //输入“0”
442 2 {Number_Key=0; }
443 2 if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1) //输入“*”
444 2 {Number_Key=11;}
445 2 if(MT8880_D3==1 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==0) //输入“#”
446 2 {Number_Key=12;}
447 2
448 2 MT8880_CP2=0; //停动8880总线
449 2 MT8880_CS=1; //停动8880总线
450 2
451 2 if(Number_Note>=7) // 已经处理了6次数据
452 2 {
453 3 J_LineToPhone=1; //模拟挂机
454 3 _nop_(); _nop_(); //指令冗余
455 3
456 3 // NUMBER[4]=0; NUMBER[5]=0; NUMBER[3]=0;
457 3 goto SERIAL; //发送给上位机
458 3 _nop_(); _nop_(); //指令冗余
459 3 return; //软件陷阱
460 3 _nop_(); _nop_(); //指令冗余
461 3 return; //软件陷阱
462 3 }
463 2 else
464 2 {
465 3 if(Number_Note==0)
466 3 {Number_Note=Number_Note+1;JISHU=5000;goto ReadStatus;} //丢弃误读的366自己发的握手信号
467 3 NUMBER[Number_Note-1]=Number_Key; //把键值写入数组
468 3 Number_Note=Number_Note+1;
469 3 JISHU=5000;
470 3 _nop_(); _nop_(); //指令冗余
471 3 goto ReadStatus;
472 3 _nop_(); _nop_(); //指令冗余
473 3 J_LineToPhone=1; //模拟挂机
474 3 return; //软件陷阱
475 3 }
476 2
477 2 }
478 1 else //没有生成键值时
479 1 {
480 2 MT8880_CP2=0; //停动8880总线
481 2 MT8880_CS=1; //停动8880总线
482 2 JISHU=JISHU-1;
483 2 if(JISHU!=0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -