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

📄 key_scan.lst

📁 硬件平台:C8051F314 包括键盘扫描程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 240          影响:根据键值将相应的特殊键状态赋值,处理有优先级
 241          //void SpeKeyDeal(UCHAR key)
C51 COMPILER V8.02   KEY_SCAN                                                              09/17/2008 10:45:02 PAGE 5   

 242          *************************************************************/
 243          
 244          void SpeKeyDeal(UCHAR key)
 245          {
 246   1        switch(key){
 247   2              case 0x21:               // 有CTRL键切换动作
 248   2                      if(CtlKeyOn == 1) 
 249   2                        CtlKeyOn = 0;
 250   2                      else
 251   2                        CtlKeyOn = 1;
 252   2                      break;
 253   2          case 0x22:               // 有ALT键切换动作
 254   2              if(AltKeyOn == 1)
 255   2                AltKeyOn = 0;
 256   2              else
 257   2                AltKeyOn = 1;
 258   2            break;
 259   2          case 0x24:               // 有ALPHA键切换动作
 260   2              if(AlfaKeyOn == 1)
 261   2                AlfaKeyOn = 0;
 262   2              else
 263   2                AlfaKeyOn = 1;
 264   2            break;
 265   2          case 0x88:               // 有SHIFT键切换动作
 266   2              if(ShiftKeyOn == 1)
 267   2                ShiftKeyOn = 0;
 268   2              else
 269   2                ShiftKeyOn = 1;
 270   2            break;
 271   2          default:                 // 其他键不做处理
 272   2            break;
 273   2              }
 274   1      }
 275           
 276          /************************************************************
 277          键值转换为扫描码处理程序
 278          //void PutKbBuff(UCHAR KeyVal)
 279          功能:将键值转换为扫描码,及其无效键处理。
 280          *************************************************************/
 281          /************************************************************
 282          -----键值转换为扫描码处理程序-----
 283          功能:将键值转换为扫描码,及其无效键处理
 284          入口参数:查键值转换表所得扫描码
 285          影响:将扫描码填入KeyBuffer[],等待主机查询
 286          //void SpeKeyDeal(UCHAR key)
 287          *************************************************************/
 288          
 289          void PutKbBuff(UCHAR KeyVal)
 290          {
 291   1        if((AltKeyOn == 1) || (AlfaKeyOn == 1) || (ShiftKeyOn == 1) || (CtlKeyOn == 1))
 292   1        {
 293   2          if(AltKeyOn == 1)                     // ALT组合键
 294   2          {
 295   3            KeyBuffer[0] = '!';//0x21;//0xb0;
 296   3            KeyBuffer[1] = KeyVal;
 297   3          }
 298   2          else if(AlfaKeyOn == 1)               // 字母键
 299   2          {
 300   3            if(ShiftKeyOn == 1)
 301   3            {
 302   4              KeyBuffer[0] = '"';//0x22;//0xc0;              // 大写
 303   4              KeyBuffer[1] = KeyVal;
C51 COMPILER V8.02   KEY_SCAN                                                              09/17/2008 10:45:02 PAGE 6   

 304   4            }
 305   3            else
 306   3            {  
 307   4              KeyBuffer[0] = '#';//0x23;//0xd0;              // 小写
 308   4              KeyBuffer[1] = KeyVal;
 309   4            }
 310   3          }
 311   2          else if(ShiftKeyOn == 1)              // shift组合键
 312   2          {
 313   3            KeyBuffer[0] = '$';//0x24;//0xe0;
 314   3            KeyBuffer[1] = KeyVal;
 315   3          }
 316   2          else if(CtlKeyOn == 1)              // ctrl组合键
 317   2          {
 318   3            KeyBuffer[0] = '%';//0x25; //0xf0;
 319   3            KeyBuffer[1] = KeyVal;
 320   3          }
 321   2        }
 322   1        else
 323   1        {
 324   2          KeyBuffer[0] = '&';//0x26;//0xa0;                 // 常规按键
 325   2          KeyBuffer[1] = KeyVal;
 326   2        }
 327   1      }
 328          
 329          /************************************************************
 330          -----查表程序-----
 331          功能: 通过行列号查找键号
 332          参数: 行列号(ex。0x31 表示第3行第1列) 
 333          //说明: 
 334          //UCHAR lookup_table(UCHAR matrix)
 335          *************************************************************/
 336          
 337          UCHAR lookup_table(UCHAR matrix)
 338          {
 339   1        UCHAR i;
 340   1        UCHAR ret_key;
 341   1        for(i = 0; ((i < 44) && (key_table[i][0] != 0xff)); i++)
 342   1        {
 343   2          if(key_table[i][0] == matrix )
 344   2          {
 345   3            ret_key = key_table[i][1];        // 找到行列号,转换成键号
 346   3            break;
 347   3          }
 348   2        }
 349   1        return ret_key;
 350   1      }
 351          
 352          /************************************************************
 353          -----键扫描任务-----
 354          功能: 主程序调用该任务
 355          参数: 行列号(ex。0x31 表示第3行第1列) 
 356          //说明: 
 357          //void task_keyscan(void)
 358          *************************************************************/
 359          
 360          void task_keyscan(void)
 361          {
 362   1        UCHAR i;
 363   1        UCHAR temp_mat,temp_code;
 364   1        temp_mat = 0;
 365   1        temp_code = 0;
C51 COMPILER V8.02   KEY_SCAN                                                              09/17/2008 10:45:02 PAGE 7   

 366   1        
 367   1        temp_mat = GetKeyMatrix();   //取得键盘阵列号
 368   1        if(KbIsValid == 1)
 369   1        {
 370   2          SpeKeyDeal(temp_mat);
 371   2          temp_code = lookup_table(temp_mat);    //转换为键号
 372   2          PutKbBuff(temp_code);
 373   2          KbIrqOut = 0;                // 发起中断
 374   2          for(i = 0; i < 10; i++);
 375   2          KbIrqOut = 1;
 376   2        }
 377   1      }
 378          
 379          /************************************************************
 380          -----键扫描相关变量初始化-----
 381          功能: 主程序调用该函数
 382          参数: 
 383          //说明: 
 384          //void init_keyscan(void)
 385          *************************************************************/
 386          
 387          void init_keyscan(void)
 388          {
 389   1        UCHAR i;
 390   1        for(i = 0; i < 2; i++)
 391   1          KeyBuffer[i] = 0;
 392   1        KbIsPressed = 0;
 393   1        AltKeyOn = 0;            //=1 表示当前ALT键切换为ON状态,键值转义
 394   1        AlfaKeyOn = 0;           //=1 表示当前alpha键切换为ON状态,键值转义
 395   1        CtlKeyOn = 0;            //=1 表示当前ctrl键切换为ON状态,键值转义
 396   1        CapsKeyOn = 0;           //=1 表示当前Caps键切换为ON状态,键值转义
 397   1        ShiftKeyOn = 0;          //=1 表示当前Caps键切换为ON状态,键值转义
 398   1        KbIsValid = 0;           //=1 表示缓冲当前为有效值     
 399   1        KbBlCtl = 1;             //复位时点亮背光
 400   1        KeyBlOn_Count = 4;       //背光点亮定时4秒
 401   1      }
 402          
 403          
 404          /************************************************************
 405          -----行线输出扫描程序-----
 406          说明: 根据index,将指定行线驱动低电平,其余为高电平
 407                 
 408          //void KEY_ROW_LOW(UCHAR index)
 409          *************************************************************/
 410          
 411          void KEY_ROW_LOW(UCHAR index)
 412          {
 413   1      //  UCHAR i;
 414   1        UCHAR p1_shift;
 415   1        UCHAR p2_shift;
 416   1        UCHAR p2_bit7;
 417   1        UCHAR temp;
 418   1        
 419   1        p2_bit7 = P2&0x80;         // 暂存P2^7电平
 420   1        p1_shift = 0x10;           // 初始化p1移位初始值
 421   1        p2_shift = 0x01;           // 初始化p2移位初始值,因为P2.7为LED驱动,所以要保持他的值不变
 422   1        
 423   1      //  for(i = 0; i < index; i++)
 424   1      //  {
 425   1        if(index < 4)
 426   1        { 
 427   2          p1_shift = p1_shift << index;
C51 COMPILER V8.02   KEY_SCAN                                                              09/17/2008 10:45:02 PAGE 8   

 428   2          p1_shift = ~p1_shift;
 429   2          P1 = p1_shift;
 430   2          P2 = (P2&0x80)|0x7f;
 431   2        }
 432   1        else                   //if((i >= 4) && (i < 7))
 433   1        {
 434   2          temp = index;
 435   2              temp = ~(~temp + 4);      // 作减4求绝对值运算
 436   2      //        p2_shift <<= abs(4 - index);
 437   2          p2_shift <<= temp;
 438   2          P2 = (~p2_shift) | p2_bit7;
 439   2          P1 = 0xff;
 440   2        }
 441   1      //  }
 442   1      }
 443          
 444          
 445          void Timer0_ISR (void) interrupt 1
 446          {
 447   1        TR0 = 0;
 448   1      //  TMR0 = Tmr0Reload;
 449   1        TH0 = Tmr0High;
 450   1        TL0 = Tmr0Low;
 451   1        if(KeyDelayCount != 0) KeyDelayCount--;
 452   1        if(++intcount == 100)
 453   1        { 
 454   2          intcount = 0;
 455   2      //    if(KeyBlOn_Count != 0) KeyBlOn_Count--;
 456   2      //    if(KeyBlOn_Count != 0)   
 457   2      //    {
 458   2      //      KbBlCtl = 1;     // 点亮背光
 459   2      //    }
 460   2      //    else
 461   2      //    {
 462   2      //      KbBlCtl = 0;     // 关闭背光
 463   2      //    }
 464   2      //    KbBlCtl = ~KbBlCtl;
 465   2          AlphaLed = ~AlphaLed;
 466   2        }
 467   1        TF0 = 0;
 468   1        TR0 = 1;
 469   1      }
 470          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    503    ----
   CONSTANT SIZE    =     90    ----
   XDATA SIZE       =      4    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     10       3
   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 + -