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

📄 44jianpansaomiao.c

📁 4*4键盘扫描
💻 C
字号:
//*************************************************************************************************
//**<程序名>:键盘扫描子程序                 **
//**<功能>:,使用列扫描的方式获取键码
//**<作者>:河北工程大学 电工电子实验室 kaixinlaohe
//**<版本>:20090129
//*************************************************************************************************
//*************************************************************************************************

#include <at89x51.h>
#define SCANPORT P1      //4×4键盘扫描端口,低4位是行线,高4位是列线。
          //采用逐列扫描的方法,无按键时,低4位输出1,高4位输出0。
          //当有按键时,高4位输出扫描电位,低4位输入扫描结果。


unsigned char uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F};   //列线扫描电压,分为第1,2,3,4根列线
                 //为低电平,其他为高电平。
//*************************************************************************************************
//*函数名称: unsigned char ucKeyScan()                       
//*入口参数: 无
//*出口参数: unsigned char
//*编写日期: 2009-01-29
//*************************************************************************************************
unsigned char ucKeyScan()
{
unsigned char ucTemp=0;     //扫描状态暂存。
unsigned char ucRow=0,ucLine=0;     //行号,列号。

EX0=0;          //在键扫描处理时,关闭外部中断0,防抖动。

for(ucLine=0;ucLine<4;ucLine++)   //列扫描
   {
    SCANPORT=uca_LineScan[ucLine];      //输出扫描电位。
    ucTemp=SCANPORT&0x0F;        //输入扫描电位,并屏蔽高4位。
    if(ucTemp!=0x0F)   
     {           //判断该列是否有按键按下。
     switch(ucTemp)
      {
      case 0x0E: ucRow=0x10;break;    //如果有,则判断行号。
      case 0x0D: ucRow=0x20;break;
      case 0x0B: ucRow=0x30;break;
      case 0x07: ucRow=0x40;break;
      default:   ucRow=0x50;break;
      }
     break;
     }
   }
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复键扫描处理前初始状态>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SCANPORT=0x0F;         //恢复P2口
EX0=1;        //恢复按键中断。

return ucRow+ucLine+1;    //返回按键编码。这个键号还要再进行处理。
}
//*************************************************************************************************
//*函数名称: unsigned char decodeKey(unsigned char value)                       
//*入口参数: 未处理过的键值
//*出口参数: 键值
//*编写日期: 2009-01-29
//*************************************************************************************************
unsigned char decodeKey(unsigned char value)
{
   unsigned char row ,line; //定义列和行的值,从上到下按1-16
    unsigned char result;
row = (value &0xF0)>>4;
line = value &0x0f;
result = (row -1)*4 +line;

return result;
}
//*************************************************************************************************
//*函数名称: unsigned char decodeKey(unsigned char value)                       
//*入口参数: 未处理过的键值
//*出口参数: 键值
//*编写日期: 2009-01-29
//*************************************************************************************************
void main()
{
unsigned char keyvalue = 0;

while(1)
{
    keyvalue = ucKeyScan();

    if(keyvalue !=5)
    {

      keyvalue=decodeKey(keyvalue);
    }
}

}

//------end
 

⌨️ 快捷键说明

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