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

📄 ps2lcd.lst

📁 this program tell you how to connect ps2 to a mcu(for example at89s51)
💻 LST
📖 第 1 页 / 共 2 页
字号:
 192   1              LCM_E=0; //若晶振速度太高可以在这后加小的延时
 193   1              LCM_E=0; //延时
 194   1              LCM_E=1;
 195   1      }
 196          
 197          //写指令
 198          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
 199          {
 200   1              if (BuysC) ReadStatusLCM(); //根据需要检测忙
 201   1              LCM_Data = WCLCM;
 202   1              LCM_RS = 0;
 203   1              LCM_RW = 0;     
 204   1              LCM_E = 0;
 205   1              LCM_E = 0;
 206   1              LCM_E = 1;      
 207   1      }
 208          
 209          //读数据
 210          unsigned char ReadDataLCM(void)
 211          {
 212   1              LCM_RS = 1; 
 213   1              LCM_RW = 1;
 214   1              LCM_E = 0;
 215   1              LCM_E = 0;
 216   1              LCM_E = 1;
 217   1              return(LCM_Data);
 218   1      }
 219          
 220          //读状态
 221          unsigned char ReadStatusLCM(void)
 222          {
 223   1              LCM_Data=0xFF; 
 224   1              LCM_RS=0;
 225   1              LCM_RW=1;
 226   1              LCM_E=0;
 227   1              LCM_E=0;
 228   1              LCM_E=1;
 229   1              while(LCM_Data & Busy); //检测忙信号
 230   1              return(LCM_Data);
 231   1      }
 232          
 233          void LCMInit(void) //LCM初始化
 234          {
 235   1              LCM_Data=0;
 236   1              WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 237   1              Delay5Ms(); 
 238   1              WriteCommandLCM(0x38,0);
 239   1              Delay5Ms(); 
 240   1              WriteCommandLCM(0x38,0);
 241   1              Delay5Ms(); 
C51 COMPILER V8.02   PS2LCD                                                                06/02/2007 12:08:11 PAGE 5   

 242   1      
 243   1              WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 244   1              WriteCommandLCM(0x08,1); //关闭显示
 245   1              WriteCommandLCM(0x01,1); //显示清屏
 246   1              WriteCommandLCM(0x06,1); // 显示光标移动设置
 247   1              WriteCommandLCM(0x0F,1); // 显示开及光标设置
 248   1      }
 249          
 250          //按指定位置显示一个字符
 251          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 252          {
 253   1              Y &= 0x1;
 254   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 255   1              if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 256   1              X |= 0x80; //算出指令码
 257   1              WriteCommandLCM(X, 1); //发命令字
 258   1              WriteDataLCM(DData); //发数据
 259   1      }
 260          
 261          //按指定位置显示一串字符
 262          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 263          {
 264   1              unsigned char ListLength;
 265   1      
 266   1        ListLength = 0;
 267   1              Y &= 0x1;
 268   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 269   1              while (DData[ListLength]>0x20) //若到达字串尾则退出
 270   1                      {
 271   2                              if (X <= 0xF) //X坐标应小于0xF
 272   2                                      {
 273   3                                              DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
 274   3                                              ListLength++;
 275   3                                              X++;
 276   3                                      }
 277   2                      }
 278   1      }
 279          
 280          //5ms延时
 281          void Delay5Ms(void)
 282          {
 283   1              unsigned int TempCyc = 5552;
 284   1              while(TempCyc--);
 285   1      }
 286          
 287          //400ms延时
 288          void Delay400Ms(void)
 289          {
 290   1              unsigned char TempCycA = 5;
 291   1              unsigned int TempCycB;
 292   1              while(TempCycA--)
 293   1                      {
 294   2                              TempCycB=7269;
 295   2                              while(TempCycB--);
 296   2                      };
 297   1      }
 298          
 299          void Keyboard_out(void) interrupt 0
 300          {
 301   1              if ((IntNum > 0) && (IntNum < 9))
 302   1                      {                       
 303   2                              KeyV = KeyV >> 1; //因键盘数据是低>>高,所以右移一位
C51 COMPILER V8.02   PS2LCD                                                                06/02/2007 12:08:11 PAGE 6   

 304   2                              if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
 305   2                      }
 306   1              IntNum++;
 307   1              while (!Key_CLK); //等待PS/2CLK拉高
 308   1      
 309   1              if (IntNum > 10)
 310   1                      {
 311   2                              IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
 312   2                              BF = 1; //标识有字符输入完了
 313   2                              EA = 0; //关中断等显示完后再开中断 
 314   2                      }
 315   1      }
 316          
 317          void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码
             -+shift的断码+G的断码
 318          {
 319   1              unsigned char TempCyc;  
 320   1      
 321   1              if (!Key_UP)                //当键盘松开时
 322   1                      {
 323   2                              switch (ScanCode)
 324   2                                      {
 325   3                                              case 0xF0 :     // 当收到0xF0,Key_UP置1表示断码开始
 326   3                                                      Key_UP = 1;
 327   3                                              break;
 328   3      
 329   3                                              case 0x12 :     // 左 SHIFT
 330   3                                                      Shift = 1;
 331   3                                              break;
 332   3      
 333   3                                              case 0x59 :     // 右 SHIFT
 334   3                                                      Shift = 1;
 335   3                                              break;
 336   3                          
 337   3                                              default:                                                
 338   3                                                              if (DisNum > 15)
 339   3                                                              {
 340   4                                                                      DisplayListChar(0, 1, Cls);//清LCD第二行
 341   4                                                                      DisNum = 0; 
 342   4                                                              }
 343   3                                                      if(!Shift)      //如果SHIFT没按下
 344   3                                                              {
 345   4                                                                      for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
 346   4                                                                      if (UnShifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]);
 347   4                                                                      DisNum++;
 348   4                                                              } 
 349   3                                                      else  //按下SHIFT
 350   3                                                              {
 351   4                                                                      for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
 352   4                                                                      if (Shifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, Shifted[TempCyc][1]);
 353   4                                                                      //if (Shifted[TempCyc][0] == 0x4b) DisplayListChar(0, 1, sz);
 354   4                                                                      DisNum++;
 355   4                                                              }
 356   3      
 357   3                                              break;
 358   3                                      }
 359   2                      }
 360   1              else
 361   1                      {       
 362   2                              Key_UP = 0;
 363   2                              switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
 364   2                                      {
C51 COMPILER V8.02   PS2LCD                                                                06/02/2007 12:08:11 PAGE 7   

 365   3                                              case 0x12 :     // 左 SHIFT
 366   3                                                      Shift = 0;
 367   3                                              break;
 368   3      
 369   3                                              case 0x59 :     // 右 SHIFT
 370   3                                                      Shift = 0;
 371   3                                              break;
 372   3                                      }
 373   2                      }
 374   1              BF = 0; //标识字符处理完了
 375   1      } 


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    598    ----
   CONSTANT SIZE    =    278    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6      11
   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 + -