⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 串口+8个键盘程序.lst

📁 用stc89c51,单片机
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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 + -