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

📄 8x8矩阵键盘识别技术.c

📁 64个(8x8)按键的矩阵键盘识别技术(利用Keil uVision2环境编写的)
💻 C
字号:
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// 8x8矩阵键盘
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <intrins.h>
#include "Reg54.h"

#define KEY_ROW_IO                  P1                                // 行线使用的I/O口
#define KEY_COL_IO                  P2                                // 列线使用的I/O口

typedef unsigned char  uchar;                                         // 取值范围: 0-255(0xFF)
typedef unsigned int   uint;                                          // 取值范围: 0-65535(0xFFFF)
typedef unsigned long  ulong;                                         // 取值范围: 0-4294967295(0xFFFFFFFF)

#ifndef True
  #define True                      1                                 // 逻辑"真"
#endif
#ifndef False
  #define False                     0                                 // 逻辑"假"
#endif

//==================================================================================================
// 功能: 扫描8x8矩阵键盘识别用户按下的按键.
// 返回: 用户按下的按键代号.
// 参数: None.
//==================================================================================================
uchar ScanKeyBoard8x8(void)
{
  uchar data vKeyID=0,vKeyCode;
  uchar data i,j,k;

  for(i=0; i<8; i++)
  {
    KEY_ROW_IO = 0xFF;                                                // 将所有行线拉高
    KEY_COL_IO = ~(0x01<<i);                                          // 将相应列线拉低(第[i]列)
    vKeyCode   = KEY_ROW_IO;                                          // 读取行线IO状态(Bit[0:7])
    if(vKeyCode!=0xFF)                                                // 判断有无行线被拉低(有表示有按键按下)
    {
      //==============================================================//
      // 检测到有按键按下时,需要执行按键除颤抖(只须延时100ms即可实现)
      //==============================================================//
      for(j=50; j>0; j--)
      {
        for(k=200; k>0; k--);
      }
      vKeyCode = KEY_ROW_IO;                                          // 读取行线IO状态(Bit[0:7])
      if(vKeyCode!=0xFF)                                              // 判断有无行线被拉低(有表示有按键按下)
      {
        vKeyCode = KEY_ROW_IO;                                        // 读取行线IO状态(Bit[0:7])
        //============================================================//
        // 找出被按下的按键(被拉低的行线与第[i]列线)
        //============================================================//
        switch(vKeyCode)                                              // 检测与第[i]列相连的8个按键中哪个被按下
        {
          case 0xFE:                                                  // Bit0被拉低
            vKeyID = 1;
            break;
          case 0xFD:                                                  // Bit1被拉低
            vKeyID = 2;
            break;
          case 0xFB:                                                  // Bit2被拉低
            vKeyID = 3;
            break;
          case 0xF7:                                                  // Bit3被拉低
            vKeyID = 4;
            break;
          case 0xEF:                                                  // Bit4被拉低
            vKeyID = 5;
            break;
          case 0xDF:                                                  // Bit5被拉低
            vKeyID = 6;
            break;
          case 0xBF:                                                  // Bit6被拉低
            vKeyID = 7;
            break;
          case 0x7F:                                                  // Bit7被拉低
            vKeyID = 8;
            break;
          default:                                                    // 按下超过1个按键
            vKeyID = 0;                                               // 不支持多个按键同时按下
            break;
        }
        vKeyCode = KEY_ROW_IO;                                        // 读取行线IO状态(Bit[0:7])
        while(vKeyCode!=0xFF) vKeyCode = KEY_ROW_IO;                  // 等待用户松开按键
        if(vKeyID!=0)
        {
          vKeyID += (i<<3);
          break;
        }
      }
    }
  }
  return(vKeyID);
}

⌨️ 快捷键说明

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