📄 串口+8个键盘程序.lst
字号:
534 3 FirstLineDisIndex = SelectIndex; //第一行显示索引
535 3 SelectLine = 1; //选择第一行
536 3 DIS12864M (); //刷新菜单
537 3 }
538 2 }
539 1 else //如果返回表单选项数目不足4个
540 1 {
541 2 FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0]; //第一行显示索引为表单第一项
542 2 SelectLine = SelectIndex - Level[sOption[SelectIndex].KeyLevel][0]+1; //选择行标志为当前选择索引对应行
543 2 DIS12864M (); //刷新菜单
544 2 }
545 1 }
546 //----------------------------------------
547 //
548 // 菜单操作按键处理散转函数
549 // 函数原形:void KeyCodeAction (unsigned char KeyCode);
550 // 键码作为参数,没有返回值
551 // 调用方式:void KeyCodeAction (unsigned char KeyCode);
C51 COMPILER V7.50 串口_8竉键盘程序 05/04/2007 10:30:05 PAGE 10
552 // 实际使用应根据自己的按键重新编写case项
553 //
554 //----------------------------------------
555 void KeyCodeAction (unsigned char KeyCode)
556 {
557 1 switch (KeyCode)
558 1 {
559 2 case 'U': MenuUpOneOption(); break; //如果是向上按键,则菜单向上,以下类似
560 2 case 'D': MenuDownOneOption(); break;
561 2 case 'E': MenuEnterOption(); break;
562 2 case 'C': MenuCancelOption(); break;
563 2 default: break;
564 2 }
565 1 }
566 //----------------------------------------
567 //
568 // 菜单更新函数
569 // 函数原形:void MenuReflash (void);
570 // 没有参数,没有返回值
571 // 调用方式:void MenuReflash (void);
572 // 实际应配合自己的按键编码获取程序使用
573 //
574 //----------------------------------------
575 void MenuReflash (void)
576 {
577 1 unsigned char Keytemp; //保存按键编码变量
578 1 GetKeyCode(); //保存按键编码
579 1 //如果按键编码有效
580 1 Keytemp =KeyCodeConvert(send); //根据按键编码获取按键说明字母
581 1 KeyCodeAction (Keytemp); //根据按键说明字母散转 U D E C
582 1
583 1 }
584 char KeyCodeConvert(char send)
585 {
586 1 if(send==0x08)
587 1 return ('E');
588 1 if(send==0x07)
589 1 return('D');
590 1 if(send==0x06)
591 1 return ('C');
592 1 if(send==0x03)
593 1 return ('U');
594 1 }
595 void wr_lcd (uchar dat_comm,uchar content)
596 {
597 1 uchar a,i,j;
598 1 delay (50);
599 1 a=content;
600 1 cs=1;
601 1 sclk=0;
602 1 std=1;
603 1 for(i=0;i<5;i++)
604 1 {
605 2 sclk=1;
606 2 sclk=0;
607 2 }
608 1 std=0;
609 1 sclk=1;
610 1 sclk=0;
611 1 if(dat_comm)
612 1 std=1; //data
613 1 else
C51 COMPILER V7.50 串口_8竉键盘程序 05/04/2007 10:30:05 PAGE 11
614 1 std=0; //command
615 1 sclk=1;
616 1 sclk=0;
617 1 std=0;
618 1 sclk=1;
619 1 sclk=0;
620 1 for(j=0;j<2;j++)
621 1 {
622 2 for(i=0;i<4;i++)
623 2 {
624 3 a=a<<1;
625 3 std=CY;
626 3 sclk=1;
627 3 sclk=0;
628 3 }
629 2 std=0;
630 2 for(i=0;i<4;i++)
631 2 {
632 3 sclk=1;
633 3 sclk=0;
634 3 }
635 2 }
636 1 }
637 /*-----------------------------------------------*/
638 /*-----------------------------------------------*/
639 //当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.
640 //当data1=0xff,data2=0x00时,在x0,y0处前半反白显示8xl*yl.
641 //当data1=0x00,data2=0xff时,在x0,y0处后半反白显示8xl*yl.
642 void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
643 {
644 1
645 1 for(jj=0;jj<yl;jj++)
646 1 {
647 2 for(ii=0;ii<xl;ii++)
648 2 {
649 3 wr_lcd (comm,0x34);
650 3 wr_lcd (comm,y0+jj);
651 3 wr_lcd (comm,x0+ii);
652 3 wr_lcd (comm,0x30);
653 3 wr_lcd (dat,data1);
654 3 wr_lcd (dat,data2);
655 3 }
656 2 }
657 1 wr_lcd (comm,0x36);
658 1 }
659
660 void SentAIns(char LCD_Comand) //进入液晶普通指令模式
661 {
662 1 wr_lcd (0,LCD_Comand);
663 1 }
664 void SentAData(char LCD_Data)
665 {
666 1 wr_lcd (1,LCD_Data);
667 1 }
668 void SetALineReverse (char SelectLine) //填充所需反白
669 {//char line;
670 1 //lat_disp (0x00,0x00);
671 1 switch(SelectLine)
672 1 {
673 2 case 1:
674 2 con_disp (0xff,0xff,0x80,0x80,4,16);///反白
675 2 break;
C51 COMPILER V7.50 串口_8竉键盘程序 05/04/2007 10:30:05 PAGE 12
676 2
677 2 case 2:
678 2 con_disp (0xff,0xff,0x90,0x90,4,16);///反白
679 2 break;
680 2
681 2 case 3:
682 2 con_disp (0xff,0xff,0x88,0x80,4,16);///反白
683 2 break;
684 2 case 4:
685 2 con_disp (0xff,0xff,0x98,0x90,4,16);///反白
686 2 break;
687 2 default:break;
688 2 }
689 1 }
690 void init_lcd ()
691 {
692 1 rst=1;
693 1 psb=0;
694 1 //wr_lcd (comm,0x30); /*30---基本指令动作*/
695 1 //wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
696 1 SentAIns(0x30); //进入液晶普通指令模式
697 1 SentAIns(0x01); //清屏
698 1 delay (100);
699 1 // wr_lcd (comm,0x06); /*光标的移动方向*/
700 1 //wr_lcd (comm,0x0c); /*开显示,关游标*/
701 1 SentAIns(0x06); //进入液晶普通指令模式
702 1 SentAIns(0x0c); //清屏
703 1 }
704 void start_init()
705 {
706 1 EA=1; //开总中断
707 1 ES=1; //允许串行中断
708 1 SCON=0x50;//串口模式1
709 1 PCON=0; //波特率不翻倍
710 1 TMOD=0x20; //定时器1工作方式2
711 1 TL1=TH1=0xFD; //波特率9600bps(11.0592M)
712 1 TR1=1; //启动定时器1
713 1 send=0;
714 1 Speaker=0;//关
715 1 }
716 void delay (uint us) //delay time
717 {
718 1 while(us--);
719 1 }
720 void key_delay(int delay_time)
721 { unsigned int x,w;
722 1 for(x=0;x<delay_time;x++)
723 1 { w=0;
724 2 while(w<3000)w++;
725 2 }
726 1 }
727 void Disp_String(uint a,uint b,uchar *dd)
728 {
729 1 uint line,i;
730 1 switch(a)
731 1 {
732 2 case 1:
733 2 line=0x00;
734 2
735 2 break;
736 2 case 2:
737 2 line=0x10;
C51 COMPILER V7.50 串口_8竉键盘程序 05/04/2007 10:30:05 PAGE 13
738 2
739 2 break;
740 2 case 3:
741 2 line=0x08;
742 2
743 2 break;
744 2 case 4:
745 2 line=0x18;
746 2
747 2 break;
748 2 default:
749 2 break;
750 2 }
751 1 wr_lcd(0,0x80+line+b-1);
752 1 for(i=0;(i<16)&&*(dd+i);i++)//i<16
753 1 wr_lcd(1,*(dd+i));
754 1
755 1 }
756 void lat_disp (uchar data1,uchar data2)
757 {
758 1 uchar i,j,k,x;
759 1 x=x1;
760 1 for(k=0;k<2;k++)
761 1 {
762 2 for(j=0;j<16;j++)
763 2 {
764 3 for(i=0;i<8;i++)
765 3 {
766 4 wr_lcd (comm,0x34);
767 4 wr_lcd (comm,y+j*2);
768 4 wr_lcd (comm,x+i);
769 4 wr_lcd (comm,0x30);
770 4 wr_lcd (dat,data1);
771 4 wr_lcd (dat,data1);
772 4 }
773 3 for(i=0;i<8;i++)
774 3 {
775 4 wr_lcd (comm,0x34);
776 4 wr_lcd (comm,y+j*2+1);
777 4 wr_lcd (comm,x+i);
778 4 wr_lcd (comm,0x30);
779 4 wr_lcd (dat,data2);
780 4 wr_lcd (dat,data2);
781 4 }
782 3 }
783 2 x=x2;
784 2 }
785 1 wr_lcd (comm,0x36);
786 1 }
787
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1986 ----
CONSTANT SIZE = 634 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 30
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -