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

📄 p0902-ps2.lst

📁 单片机与PS2键盘通讯的例子
💻 LST
📖 第 1 页 / 共 2 页
字号:
 309          //---------------------------------------
 310          //名称: LCD清屏函数
 311          //作者:cby
 312          //网站:宁波单片机开发网
 313          //网址:www.nbdpj.com
 314          //邮箱:nbdpj@nbdpj.com
 315          //日期:20081111  
 316          //----------------------------------------- 
 317          void LCD_clear(void)
 318          {
 319   1              unsigned char t;
 320   1              unsigned char k;   
 321   1              for(t=0;t<6;t++)
 322   1              { 
 323   2                      for(k=0;k<84;k++)
 324   2                      { 
 325   3                              LCD_write_byte(0,1);                    
 326   3                      } 
 327   2              }
 328   1      }
 329          //---------------------------------------
 330          //名称: 5110LCD初始化函数
 331          //作者:cby
 332          //网站:宁波单片机开发网
 333          //网址:www.nbdpj.com
 334          //邮箱:nbdpj@nbdpj.com
 335          //日期:20081111  
 336          //----------------------------------------- 
 337          void LCD_init(void)
 338          {
 339   1              LCD_write_byte(0x21,0); //LCD功能设置:芯片活动,水平寻址,使用扩展指令
 340   1              LCD_write_byte(0xc5,0); //设置偏置电压
 341   1              LCD_write_byte(0x06,0); //温度校正 
 342   1              LCD_write_byte(0x13,0); //1:48 
 343   1              LCD_write_byte(0x20,0); //LCD功能设置:芯片活动,水平寻址,使用基本指令
 344   1              LCD_clear();
 345   1              LCD_write_byte(0x0C,0); //设定显示配置:普通模式
 346   1      }
 347          //---------------------------------------
 348          //名称: 设置坐标函数
 349          //参数:X:0-83 Y:0-5
 350          //作者:cby
 351          //网站:宁波单片机开发网
 352          //网址:www.nbdpj.com
 353          //邮箱:nbdpj@nbdpj.com
 354          //日期:20081111  
 355          //-----------------------------------------   
 356          void LCD_set_XY(unsigned char X, unsigned char Y)
 357          {
 358   1              LCD_write_byte(0x40 | Y, 0);
 359   1              LCD_write_byte(0x80 | X, 0);
 360   1      }
 361          //---------------------------------------
 362          //名称: 显示英文字符
 363          //参数:c:显示的字符在font6x8表格中的位置
 364          //作者:cby
 365          //网站:宁波单片机开发网
C51 COMPILER V8.05a   P0902_PS2                                                            04/02/2009 17:17:44 PAGE 7   

 366          //网址:www.nbdpj.com
 367          //邮箱:nbdpj@nbdpj.com
 368          //日期:20081111  
 369          //-----------------------------------------     
 370          void LCD_write_char(unsigned char c)
 371          {
 372   1              unsigned char line;
 373   1              c-= 32;
 374   1              for (line=0; line<6; line++)
 375   1              LCD_write_byte(font6x8[c][line], 1);
 376   1      }
 377          //---------------------------------------
 378          //名称: 英文字符串显示函数
 379          //参数:*s:英文字符串指针
 380          //作者:cby
 381          //网站:宁波单片机开发网
 382          //网址:www.nbdpj.com
 383          //邮箱:nbdpj@nbdpj.com
 384          //日期:20081111  
 385          //-----------------------------------------  
 386          void LCD_write_String(unsigned char X,unsigned char Y,char *s)
 387          {
 388   1              LCD_set_XY(X,Y);
 389   1              while (*s) 
 390   1              {
 391   2                      LCD_write_char(*s);
 392   2                      s++;
 393   2              }
 394   1      } 
 395          void LCD_write_String1(unsigned char X,unsigned char Y,unsigned char s)
 396          {
 397   1              unsigned char line;
 398   1              LCD_set_XY(X*6,Y);
 399   1              for (line=0; line<6; line++)
 400   1                      LCD_write_byte(font6x8[s][line], 1);    
 401   1      } 
 402          //---------------------------------------
 403          //名称: SPI初始化函数  
 404          //作者:cby
 405          //网站:宁波单片机开发网
 406          //网址:www.nbdpj.com
 407          //邮箱:nbdpj@nbdpj.com
 408          //日期:20090325 
 409          //-----------------------------------------  
 410          void init_spi()
 411          {
 412   1              P1M0=0X40;
 413   1              P1M1=0XA0;
 414   1              SPCTL=0XD0;
 415   1              SPSTAT=0XC0;    
 416   1      }
 417          //---------------------------------------
 418          //名称: 使用SPI接口写数据到LCD
 419          //参数:dt:写入的数据 command: 1-数据/0-命令
 420          //作者:cby
 421          //网站:宁波单片机开发网
 422          //网址:www.nbdpj.com
 423          //邮箱:nbdpj@nbdpj.com
 424          //日期:20090325  
 425          //-----------------------------------------  
 426          void LCD_write_byte(unsigned char dt, unsigned char command)
 427          {
C51 COMPILER V8.05a   P0902_PS2                                                            04/02/2009 17:17:44 PAGE 8   

 428   1              sce=0;
 429   1              dc=command;
 430   1              SPDAT=dt;
 431   1              while(!(SPSTAT&0X80));
 432   1              SPSTAT=0XC0;
 433   1              dc=1;
 434   1              sce=1;
 435   1              sdin=1;
 436   1      }
 437          //---------------------------------------
 438          //名称: 写一个汉字到LCD函数
 439          //参数:x,y:写入汉字的地址 address: 写入汉字在han表格中的位置
 440          //作者:cby
 441          //网站:宁波单片机开发网
 442          //网址:www.nbdpj.com
 443          //邮箱:nbdpj@nbdpj.com
 444          //日期:20081111  
 445          //-----------------------------------------             
 446          void disp16_16(unsigned char x,unsigned char y,unsigned char address) 
 447          { 
 448   1              unsigned char c; 
 449   1              LCD_set_XY(x*8, y); 
 450   1              for(c=0;c<16;c++) 
 451   1              {                       
 452   2                      LCD_write_byte(han[address*32+c],1); 
 453   2              } 
 454   1          LCD_set_XY(x*8, y+1);
 455   1              for(c=16;c<32;c++) 
 456   1              {                       
 457   2                      LCD_write_byte(han[address*32+c],1); 
 458   2              } 
 459   1      } 
 460          unsigned char  Decode(unsigned char ScanCode)
 461          //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H?
 462          //也就是说shift的通码+G的通码+shift的断码+G的断码
 463          {
 464   1              unsigned char TempCyc; 
 465   1              unsigned char KeyChar=0;
 466   1              if (!Key_UP) //当键盘松开时
 467   1              {
 468   2                      switch (ScanCode)
 469   2                      {
 470   3                              case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
 471   3                              Key_UP = 1;
 472   3                      break;
 473   3      
 474   3                              case 0x12 : // 左 SHIFT
 475   3                              Shift = 1;
 476   3                      break;
 477   3      
 478   3                              case 0x59 : // 右 SHIFT
 479   3                              Shift = 1;
 480   3                  break;
 481   3                              case 0x66:  //backspace
 482   3                                      if(weizhi>0)
 483   3                                      {
 484   4                                              weizhi--;
 485   4                                              disbuf[weizhi]=0;
 486   4                                              disbit=1;
 487   4                                      }
 488   3                              break;
 489   3                              default: 
C51 COMPILER V8.05a   P0902_PS2                                                            04/02/2009 17:17:44 PAGE 9   

 490   3                              if (DisNum > 15) DisNum = 0; 
 491   3                              if(!Shift) //如果SHIFT没按下
 492   3                              {
 493   4                                      for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
 494   4                                      if (UnShifted[TempCyc][0] == ScanCode) 
 495   4                                              {
 496   5                              KeyChar=UnShifted[TempCyc][1];  
 497   5                                                      disbit=1;
 498   5                                                      disbuf[weizhi]=KeyChar;
 499   5                                                      if(weizhi<83) weizhi++;
 500   5                                              }                               
 501   4                                      DisNum++;
 502   4                              } 
 503   3                              else //按下SHIFT
 504   3                              {
 505   4                                      for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
 506   4                                      if (Shifted[TempCyc][0] == ScanCode) 
 507   4                                              {
 508   5                              KeyChar=Shifted[TempCyc][1];
 509   5                                                      disbit=1;
 510   5                                                      disbuf[weizhi]=KeyChar;
 511   5                                                      if(weizhi<83) weizhi++;
 512   5                                              }
 513   4                                      DisNum++;
 514   4                              }
 515   3                      break;
 516   3              }
 517   2              }
 518   1              else
 519   1              { 
 520   2                      Key_UP = 0;
 521   2                      switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
 522   2                      {
 523   3                              case 0x12 : // 左 SHIFT
 524   3                              Shift = 0;
 525   3                      break;
 526   3                              case 0x59 : // 右 SHIFT
 527   3                              Shift = 0;
 528   3                      break;
 529   3                      }
 530   2              }
 531   1              return KeyChar;
 532   1      }                 
 533          void scakey()
 534          {               
 535   1              if (BF)
 536   1              {                               
 537   2                      Decode(keybuf);
 538   2                      BF=0;
 539   2                      EX1=0;  
 540   2                      EA=1;           
 541   2              }
 542   1              else
 543   1              EX1 = 1; //开中断               
 544   1      } 
 545          void init1()interrupt 2 using 0
 546          {
 547   1              if ((IntNum > 0) && (IntNum < 9))
 548   1              { 
 549   2                      KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
 550   2                      if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
 551   2              }
C51 COMPILER V8.05a   P0902_PS2                                                            04/02/2009 17:17:44 PAGE 10  

 552   1              IntNum++;
 553   1              while (!Key_CLK); //等待PS/2CLK拉高
 554   1              if (IntNum > 10)
 555   1              {
 556   2                      IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
 557   2                      BF = 1; //标识有字符输入完了 
 558   2                      keybuf=KeyV;
 559   2                      KeyV=0;                 
 560   2              }
 561   1      }
 562          //---------------------------------------
 563          //名称: 主函数           
 564          //作者:cby
 565          //网站:宁波单片机开发网
 566          //网址:www.nbdpj.com
 567          //邮箱:nbdpj@nbdpj.com
 568          //日期:20081111  
 569          //-----------------------------------------     
 570          void main()
 571          {
 572   1              unsigned char k;
 573   1              unsigned char l;
 574   1              init_spi();
 575   1              res=0;
 576   1              for(k=0;k<250;k++);
 577   1              for(k=0;k<84;k++) disbuf[k]=0;
 578   1              res=1;                          //LCD复位
 579   1              LCD_init();             //初始化LCD模块 
 580   1              LCD_clear();            //清屏幕         
 581   1              disp16_16(0,0,0);       //宁
 582   1              disp16_16(2,0,1);       //波
 583   1              disp16_16(4,0,2);       //单
 584   1              disp16_16(6,0,3);       //片
 585   1              disp16_16(8,0,4);       //机
 586   1              disp16_16(1,2,5);       //开
 587   1              disp16_16(4,2,6);       //发
 588   1              disp16_16(7,2,7);       //网
 589   1              LCD_write_String(1,5,"www.nbdpj.com");  //www.nbdpj.com
 590   1              back_led=0;                     //开背光
 591   1              EX1=1;  
 592   1              EA=1;
 593   1              weizhi=0;
 594   1              while(1)
 595   1              {
 596   2                      scakey();
 597   2                      if(disbit)
 598   2                      {
 599   3                              disbit=0;
 600   3                              for(k=0;k<6;k++)
 601   3                              {
 602   4                                      for(l=0;l<14;l++)
 603   4                                      {
 604   5                                              LCD_write_String1(l,k,disbuf[k*14+l]);
 605   5                                      }
 606   4                              }
 607   3                      }
 608   2              }
 609   1      }
 610          


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V8.05a   P0902_PS2                                                            04/02/2009 17:17:44 PAGE 11  

   CODE SIZE        =    869    ----
   CONSTANT SIZE    =   1062    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     91      18
   IDATA SIZE       =   ----    ----
   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 + -