📄 44jianpansaomiao.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 + -