📄 12232driver.lst
字号:
522 3 j++;
523 3 }
524 2
525 2 if (j == 27) //显示'"'(秒)
526 2 {
527 3 draw_bmp(40+row*8,0,8,num[14]);
528 3 row++;
529 3 break;
530 3 }
531 2 draw_bmp(40+row*8,0,8,num[serial_buff[j]]); //显示数字
532 2 row++;
533 2
534 2 }
535 1
536 1
537 1 row = 0;
538 1 draw_bmp(0,1,16,azimuth[serial_buff[17]-20]); //判断南、北,并显示
539 1 draw_bmp(16,1,16,wei); //显示纬
540 1 draw_bmp(32,1,8,num[13]); //显示:
541 1 for(j = 7;j<15;j++)
542 1 {
543 2
544 2 if (j==9) //显示数字度符号
545 2 {
546 3 draw_bmp(40+row*8,1,8,num[11]);
547 3 row++;
548 3 }
549 2 if (j==11)
550 2 {
551 3 draw_bmp(40+row*8,1,8,num[12]); //显示'''(分)
C51 COMPILER V7.09 12232DRIVER 10/07/2004 17:58:58 PAGE 10
552 3 row++;
553 3 j++;
554 3
555 3 }
556 2 if (j==14) //显示'"'(秒)
557 2 {
558 3 draw_bmp(40+row*8,1,8,num[14]);
559 3 row++;
560 3 break;
561 3 }
562 2 draw_bmp(40+row*8,1,8,num[serial_buff[j]]); //显示数字
563 2 row++;
564 2
565 2 }
566 1
567 1
568 1 }
569
570
571 disp_time()
572 {
573 1 uchar hour, j, row = 0;
574 1 lcd_clr(); //清屏
575 1 draw_bmp(29,0,64,bjsj); //在液晶上部29列开始显示'北京时间'
576 1 hour = serial_buff[0]*10+serial_buff[1]+8; //格林尼治时间转化为北京时间
577 1 if (hour>23) //北京时间=格林尼治时间+8
578 1 {hour = hour - 24;} //当大于24时,减去24
579 1 serial_buff[0] = hour/10; //回存到缓冲区
580 1 serial_buff[1] = hour%10;
581 1 for( j=0;j<6;j++ ) //显示6个数字和2个冒号,格式为XX:XX:XX
582 1 {
583 2 draw_bmp(29+row*8,1,8,num[serial_buff[j]]); //显示6个数字
584 2 row++;
585 2 if ((j==1)||(j==3)) //第2个和第4个数字后面显示':'
586 2 {
587 3 draw_bmp(29+row*8,1,8,num[13]); //显示冒号
588 3 row++;
589 3 }
590 2 }
591 1
592 1 }
593
594 disp_level()
595 {
596 1 uchar i,j,row = 1;
597 1 lcd_clr();
598 1 draw_bmp(0,0,120,level);
599 1 if(serial_buff[32] == 0) //无GPS接收信号
600 1 {
601 2 draw_bmp(0,1,112,nosignal);
602 2 }
603 1 else
604 1 { //探测水平信号数据存放的位置
605 2 for (i=35;row;)
606 2 {
607 3 if (serial_buff[i] == 'M')
608 3 {
609 4 i = i+2;
610 4 row = 0; //跳出循环
611 4 }
612 3 else
613 3 {
C51 COMPILER V7.09 12232DRIVER 10/07/2004 17:58:58 PAGE 11
614 4 i++;
615 4 }
616 3 }
617 2 j = i;
618 2 row = 1;
619 2 for (;row;)
620 2 {
621 3 if (serial_buff[j] == 'M')
622 3 {
623 4 row = 0; //跳出循环
624 4 }
625 3 else
626 3 {
627 4 j++;
628 4 }
629 3 }
630 2
631 2 for (;i<j-1;i++)
632 2 {
633 3 draw_bmp(0+row*8,1,8,num[serial_buff[i]]);
634 3 row ++;
635 3 }
636 2 draw_bmp(0+row*8,1,8,num[15]);
637 2 }
638 1
639 1 }
640
641
642 disp_speed() //速度显示程序
643 {
644 1
645 1 }
646
647 disp_direction() //方向显示程序
648 {
649 1
650 1 }
651 /*-----------------------------------------------------------------------
652 显示程序,根据键盘值调用不同的显示函数
653 -------------------------------------------------------------------------*/
654
655
656 display()
657 {
658 1 ASCII2BCD (); //先调用ASCII转换函数,将ASCII转换为BCD
659 1
660 1 switch (key)
661 1 { //根据键盘值调用不同的显示函数
662 2 case 0 : { disp_transit(); break;} //键盘值0,显示经纬度
663 2 case 1 : { disp_time(); break;} //键盘值1,显示北京时间
664 2 case 2 : { disp_level(); break;}
665 2 case 3 : { disp_speed(); break;} //键盘值3,显示速度
666 2 case 4 : { disp_direction();break;} //键盘值4,显示方向
667 2 default: { disp_transit(); break;}
668 2 //可扩充
669 2 }
670 1
671 1 }
672
673
674 /*-----------------------------------------------------------------------
675 将接收到的ASCII转换位BCD码和特定值
C51 COMPILER V7.09 12232DRIVER 10/07/2004 17:58:58 PAGE 12
676 ------------------------------------------------------------------------*/
677
678 void ASCII2BCD(void)
679 {
680 1 uchar i;
681 1 for (i=0;i<60;i++) //只转换前38个接收到的数据
682 1 {
683 2 if ((serial_buff[i] >= 48) && (serial_buff[i] <= 57) )
684 2 { //接收到的是数字,转换为BCD码。BCD码=ASCII码-48
685 3 serial_buff[i] = serial_buff[i]-48 ;
686 3 }
687 2 else
688 2 {
689 3 switch ( serial_buff[i] )
690 3 { //非数字,将它们转换为特定值
691 4 case '.' : { serial_buff[i] = 10; break; }
692 4
693 4 case '-' : { serial_buff[i] = 16; break; }
694 4
695 4 case 'E' : { serial_buff[i] = 20; break; }
696 4 case 'S' : { serial_buff[i] = 21; break; }
697 4 case 'W' : { serial_buff[i] = 22; break; }
698 4 case 'N' : { serial_buff[i] = 23; break; }
699 4 case ',' : { serial_buff[i] = 0xff;break;}
700 4 default : break;
701 4 }
702 3 }
703 2 }
704 1 }
705 /*-------------------------------------------------------------------------
706 开机LOGO画面,开机时调用一次
707 ---------------------------------------------------------------------------*/
708
709 void logo(void)
710 {
711 1 uchar i, j, h ;
712 1 LED = 0; //点亮背光灯
713 1 TR0 = 1; //开定时器0,背光灯亮10S
714 1 lcd_clr();
715 1 draw_bmp(0,0,112,welcome_1); //在液晶上部第0列开始显示’Welcome to GPS‘
716 1 draw_bmp(32,1,48,welcome_2); //在液晶下部第32列开始显示显示’System‘
717 1 for(i=0;i<10;i++)for(j=1;j;j++)for(h=1;h;h++); //延时3S
718 1 lcd_clr(); //清屏
719 1 draw_bmp(0,0,64,welcome_3); //在液晶上部第0列开始显示'设计者:'
720 1 draw_bmp(64,1,48,welcome_4); //在液晶下部第64列开始显示'唐召波'
721 1 for(i=0;i<5;i++)for(j=1;j;j++)for(h=1;h;h++); //延时1.5S
722 1
723 1 }
724
725
726 ////////////////////////////////////////////////////////////////////////////////
727 // 主程序
728 ////////////////////////////////////////////////////////////////////////////////
729 void main(void)
730 {
731 1 P0 = 0xff; //端口复位
732 1 P1 = 0xff;
733 1 P2 = 0xff;
734 1 P3 = 0xff;
735 1 delay(255);
736 1 lcd_init(); //初始化液晶显示器
737 1 lcd_init();
C51 COMPILER V7.09 12232DRIVER 10/07/2004 17:58:58 PAGE 13
738 1 lcd_init();
739 1 lcd_clr(); //清屏
740 1 logo(); //显示开机画面
741 1
742 1 //TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0
743 1 // 0 0 1 0 0 0 0 1
744 1 TMOD = 0x21; //T0 16位定时器,T1 自动重装,方式3
745 1 TH0 = 0x4C;
746 1 TL0 = 0x00; //定时50mS
747 1 //SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI
748 1 // 0 1 0 0 0 0 0 0
749 1 SCON = 0x40; //串行口8位UTRA
750 1 TH1 = 0xFA;
751 1 TL1 = 0xFA; //波特率发生器,4800bps
752 1 ET0 = 1; //开定时器0中断允许
753 1 ES = 1; //开串行口中断
754 1 EA = 1; //开总中断
755 1 REN = 1; //允许串行接收
756 1 TR1 = 1; //开串行口波特率发生(T1)
757 1 while(1) //主程序
758 1 {
759 2 up = 1; //把键盘位置1,以便进行键盘输入
760 2 down = 1;
761 2 keywork(); //键盘扫描
762 2 if(disp_flag) //判断是否可以更新显示
763 2 {
764 3 disp_flag = 0; //清显示更新标志
765 3 display(); //显示程序
766 3 }
767 2
768 2 }
769 1 }
770
771
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1877 ----
CONSTANT SIZE = 1600 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 29
IDATA SIZE = 77 ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -