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

📄 ps2key.lst

📁 51单片机下的104个按键功能程序!适用遥控器与多功能控制!
💻 LST
📖 第 1 页 / 共 2 页
字号:
 164   1      L1602_E=1;   //数据送出
 165   1      _nop_();
 166   1      _nop_();
 167   1      _nop_();
 168   1      L1602_E=0;
 169   1      }
 170          
 171          
 172          /**********************************************************************************************
 173          函数名称:LCD检测忙函数
 174          函数功能:检测LCD是否处于忙状态
 175          说明: 
 176          **********************************************************************************************/
 177          BOOL lcd_bz()
 178          {                                                       // 测试LCD忙碌状态
 179   1              BOOL result;
C51 COMPILER V8.02   PS2KEY                                                                08/01/2008 02:32:02 PAGE 4   

 180   1              L1602_RS=0;
 181   1          L1602_RW=1;
 182   1          L1602_E=1;
 183   1              _nop_();
 184   1              _nop_();
 185   1              _nop_();
 186   1              _nop_();
 187   1              result = (BOOL)(P0 & 0x80);
 188   1              L1602_E = 0;
 189   1              return result;  
 190   1      }
 191          /**********************************************************************************************
 192          函数名称:中断函数
 193          函数功能:用中断的方式获取键盘数据
 194          说明: 
 195          **********************************************************************************************/
 196          void Keyboard_out(void) interrupt 2
 197          {
 198   1              if ((IntNum > 0) && (IntNum < 9))
 199   1                      {                       
 200   2                              KeyV = KeyV >> 1;                   //因键盘数据是低>>高,结合上一句所以右移一位
 201   2                              if (Key_Data) KeyV = KeyV | 0x80;    //当键盘数据线为1时为1到最高位
 202   2                      }
 203   1              IntNum++;
 204   1              while (!Key_CLK);            //等待PS/2CLK拉高
 205   1      
 206   1              if (IntNum > 10)
 207   1                      {
 208   2                              IntNum = 0;           //当中断11次后表示一帧数据收完,清变量准备下一次接收
 209   2                              BF = 1;               //标识有字符输入完了
 210   2                              EA = 0;//关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要
             -声明为再入函数)
 211   2                      }
 212   1      }
 213          
 214          /**********************************************************************************************
 215          函数名称:Decode函数
 216          函数功能:分析键盘码
 217          说明: 
 218          **********************************************************************************************/
 219          void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码
             -+shift的断码+G的断码
 220          {
 221   1              unsigned char TempCyc;  
 222   1      
 223   1              if (!Key_UP)                //当键盘松开时
 224   1                      {
 225   2                              switch (ScanCode)
 226   2                                      {
 227   3                                              case 0xF0 :     // 当收到0xF0,Key_UP置1表示断码开始
 228   3                                                      Key_UP = 1;
 229   3                                              break;
 230   3      
 231   3                                              case 0x12 :     // 左 SHIFT
 232   3                                                      Shift = 1;
 233   3                                              break;
 234   3      
 235   3                                              case 0x59 :     // 右 SHIFT
 236   3                                                      Shift = 1;
 237   3                                              break;
 238   3      
 239   3                                              default:                                                
C51 COMPILER V8.02   PS2KEY                                                                08/01/2008 02:32:02 PAGE 5   

 240   3                                                      
 241   3                                                      if(!Shift)      //如果SHIFT没按下
 242   3                                                              {
 243   4                                                                      for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
 244   4                                                                      if (UnShifted[TempCyc][0] == ScanCode) 
 245   4                                                                      Key_code = UnShifted[TempCyc][1];SBUF=Key_code;while(!TI);TI=0;
 246   4                                                               
 247   4                                                              } 
 248   3                                                      else  //按下SHIFT
 249   3                                                              {
 250   4                                                                      for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
 251   4                                                                      if (Shifted[TempCyc][0] == ScanCode) 
 252   4                                                                      Key_code = Shifted[TempCyc][1];SBUF=Key_code;while(!TI);TI=0;
 253   4                                                               
 254   4                                                              }
 255   3      
 256   3                                              break;
 257   3                                      }
 258   2                      }
 259   1              else
 260   1                      {       
 261   2                              Key_UP = 0;
 262   2                              switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
 263   2                                      {
 264   3                                              case 0x12 :     // 左 SHIFT
 265   3                                                      Shift = 0;
 266   3                                              break;
 267   3      
 268   3                                              case 0x59 :     // 右 SHIFT
 269   3                                                      Shift = 0;
 270   3                                              break;
 271   3                                      }
 272   2                      }
 273   1              BF = 0; //标识字符处理完了
 274   1      } 
 275          
 276          /**********************************************************************************************
 277          函数名称:主函数
 278          函数功能:主函数
 279          说明: 
 280          **********************************************************************************************/
 281          void main(void)
 282          {
 283   1              void print(uchar a,uchar *str);
 284   1              void print1(uchar a,uchar t); 
 285   1              void LCM1602_Init();
 286   1              unsigned char TempCyc;
 287   1              SCON=0x50; //MODER1,REN=1;
 288   1              TMOD=0x20; //TIMER1 MODER2;
 289   1              TH1=0xf4;  //bode=2400
 290   1              TL1=0xf4;
 291   1              //ET1=1;
 292   1              TR1=1;
 293   1      
 294   1              LCM1602_Init();
 295   1              print(0x80,Welcome);
 296   1              print(0xc0,Welcome1);
 297   1              LCM1602_Delay(10);      
 298   1          for (TempCyc=0; TempCyc<2; TempCyc++)
 299   1                              Delay400Ms();         //延时
 300   1      
 301   1              LCM1602_Init();
C51 COMPILER V8.02   PS2KEY                                                                08/01/2008 02:32:02 PAGE 6   

 302   1              IT1 = 0;                   //设外部中断1为低电平触发
 303   1              EA = 1;
 304   1              EX1 = 1;                   //开中断
 305   1      
 306   1              do
 307   1                      {
 308   2                              if (BF)
 309   2                                      Decode(KeyV);
 310   2                              else
 311   2                                      EA = 1;         //开中断
 312   2                      }
 313   1              while(1);
 314   1      }
 315          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    539    ----
   CONSTANT SIZE    =    275    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       7
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -