📄 wdbj.lst
字号:
263 1 yingda();
264 1 stop();
265 1 EA=1;
266 1 DelayM(5);
267 1 }
268
269 uchar read_add(uchar dizhi)
270 {
271 1 uchar date;
272 1 start();
273 1 write_byte(0xa0);
274 1 yingda();
275 1 write_byte(dizhi);
276 1 yingda();
277 1 start();
278 1 write_byte(0xa1);
279 1 yingda();
280 1 date=read_byte();
281 1 stop();
282 1 DelayM(5);
283 1 return date;
284 1 }
285 /*************************************************
286 **************************************************
287 下面是数码管所用的函数,包括闪烁和动态扫描
288 **************************************************
289 *************************************************/
290 //LED闪烁子函数
291 void flash()
292 {
293 1 if(shans&&blink)
294 1 {
295 2 if(ledtime--==0)
296 2 {
297 3 if(!shanz) ledtime=mietime;
298 3 else ledtime=liangtime;
299 3 shanz=~shanz;
300 3 }
301 2 }
302 1 else shanz=0;
303 1 }
C51 COMPILER V7.50 WDBJ 03/08/2008 22:56:25 PAGE 6
304
305 void display(uchar pos) //按位显示函数POS表示第几位数码管
306 {
307 1 bit sflag;
308 1 duX=1; //关显示
309 1 P0=0x00;
310 1 duX=0;
311 1
312 1 duX=1;
313 1 sflag=(blink>>pos)&0x01;
314 1 if(!sflag||(sflag&!shanz))
315 1 {
316 2 if(pos==2||pos==6) P0=duma[buffer[pos]]|0x80;
317 2 else P0=duma[buffer[pos]];
318 2 }
319 1 else P0=0x00;
320 1 duX=0;
321 1
322 1 weX=1;
323 1 P0=wema[pos]; //送位码
324 1 weX=0;
325 1 }
326
327 void key()
328 {
329 1 static uchar keycnt; //按键年龄计数器
330 1 static bit keyesc; //按键释放置位标志
331 1 funcnt=0x00;
332 1 funval=0x00;
333 1 if(keydone) //上次按键任务已完成
334 1 {
335 2 if(K1==0&&K2&&K3&&K4) {funcnt++;funval=0x01;}
336 2 else if(K2==0&&K1&&K3&&K4) {funcnt++;funval=0x02;}
337 2 else if(K3==0&&K2&&K1&&K4) {funcnt++;funval=0x03;}
338 2 else if(K4==0&&K2&&K1&&K3) {funcnt++;funval=0x04;}
339 2 }
340 1 if(!funcnt)//无键按下或上档键个数多于一个
341 1 {
342 2 shans=1;
343 2 keypre=0x00;
344 2 keyesc=0x00;task=0x00;keycnt=0x00;
345 2 }
346 1 else if(!keyesc) //键已释放
347 1 {
348 2 if(funcnt>1) keyesc=1;
349 2 else if(funval!=keypre) //如果本次键值和上次不同
350 2 {
351 3 keypre=funval; //用本次键值替换上次值
352 3 keycnt=0x00;
353 3 }
354 2 else
355 2 {
356 3 keycnt++;
357 3 switch(task)
358 3 {
359 4 case 0:
360 4 if(keycnt==N)
361 4 {
362 5 shans=1;
363 5 keyprocess=1;
364 5 if(K1==0||K4==0) keyesc=1;
365 5 else
C51 COMPILER V7.50 WDBJ 03/08/2008 22:56:25 PAGE 7
366 5 {
367 6 task++;
368 6 keycnt=0;
369 6 }
370 5 }
371 4 break;
372 4 case 1:
373 4 if(keycnt==MaxRate)
374 4 {
375 5 shans=0;
376 5 keyprocess=1;
377 5 keycnt=0;
378 5 task++;
379 5 }
380 4 break;
381 4 case 2:
382 4 if(keycnt==MinRate)
383 4 {
384 5 shans=0;
385 5 keyprocess=1;
386 5 keycnt=0;
387 5 }
388 4 break;
389 4 }
390 3 }
391 2 }
392 1 }
393 //功能键处理
394 void key1()
395 {
396 1 if(!keymark)
397 1 {
398 2 pb=&buffer[0];
399 2 blink=0x01;
400 2 keymark=1;
401 2 shans=1;
402 2 }
403 1 else
404 1 {
405 2 pb++;
406 2 blink<<=1;
407 2 if(pb>=&buffer[4])
408 2 {
409 3 pb=&buffer[0];
410 3 blink=0x01;
411 3 }
412 2 }
413 1 }
414 //*************************************//
415 void key2()
416 {
417 1 if(keymark)
418 1 {
419 2 *pb+=1;
420 2 if(*pb>=0x0a)
421 2 *pb=0x00;
422 2 }
423 1 }
424
425 //*************************************//
426 void key3()
427 {
C51 COMPILER V7.50 WDBJ 03/08/2008 22:56:25 PAGE 8
428 1
429 1 if(keymark)
430 1 {
431 2 if(*pb<=0) *pb=9;
432 2 else *pb-=1;
433 2 }
434 1 }
435 void key4()
436 {
437 1
438 1 if(keymark)
439 1 {
440 2 blink=0x00;
441 2 keymark=0;
442 2 write_add(9,buffer[1]);
443 2 write_add(10,buffer[2]);
444 2 write_add(11,buffer[3]);
445 2 }
446 1 }
447
448 void keyXZ()
449 {
450 1 if(keyprocess)
451 1 {
452 2 keydone=0;
453 2 keyprocess=0;
454 2 switch(keypre)
455 2 {
456 3 case 0x01:key1();break;
457 3 case 0x02:key2();break;
458 3 case 0x03:key3();break;
459 3 case 0x04:key4();break;
460 3 }
461 2 keydone=1;
462 2 }
463 1 }
464 //*************************************//
465 /*********************************************
466 功能:定时器0中断服务程序
467 *********************************************/
468 void timer0() interrupt 1
469 {
470 1 TH0=V_TH0;
471 1 TL0=V_TL0;
472 1 flash();
473 1 key();
474 1
475 1 }
476 void main()
477 {
478 1 uint num=0;
479 1 uchar a,b,c;
480 1 uchar n;
481 1
482 1 TMOD=V_TMOD;TH0=V_TH0;TL0=V_TL0;
483 1 TR0=1;ET0=1;EA=1;
484 1 sdate=0x00;
485 1 keyprocess=0;keydone=1;
486 1 ledtime=liangtime;
487 1 shanz=0;
488 1 keymark=0;
489 1
C51 COMPILER V7.50 WDBJ 03/08/2008 22:56:25 PAGE 9
490 1 buffer[1]=read_add(9);
491 1 buffer[2]=read_add(10);
492 1 buffer[3]=read_add(11);
493 1 while(1)
494 1 {
495 2 num1=buffer[1]*100+buffer[2]*10+buffer[3];
496 2 num=DS18b20_readTemp(); //读温度并送显
497 2 a=num/100;
498 2 b=(num%100)/10;
499 2 c=(num%100)%10;
500 2 buffer[5]=a;
501 2 buffer[6]=b;
502 2 buffer[7]=c;
503 2 for(n=0;n<5;n++)
504 2 {
505 3 for(sdate=0;sdate<=7;sdate++)
506 3 {
507 4 display(sdate);
508 4 DelayM(3);
509 4 }
510 3 keyXZ();
511 3 }
512 2 if(num1>num) {led4=0,led8=1;}
513 2 else {led4=1,led8=0;}
514 2 }
515 1 }
516
517
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1224 ----
CONSTANT SIZE = 24 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 8
IDATA SIZE = ---- ----
BIT SIZE = 6 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -