//-----------------------------返回码-----------------------------
// P1.4 P1.5 P1.6 P1.7
// P1.0 0x11 0x21 0x41 0x81
// P1.1 0x12 0x22 0x42 0x82
// P1.2 0x14 0x24 0x44 0x84
// P1.3 0x18 0x28 0x48 0x88
// 无按键返回0
//----------------------------------------------------------------
//-----------------------------头文件-----------------------------
#include <reg51.h>
//----------------------------------------------------------------
//-----------------------------宏定义-----------------------------
#define uchar unsigned char
#define uint unsigned int
#define KEYPORT P3 //键盘扫描端口
//--------------------------------------------------------------------
//-----------------------------延迟函数-----------------------------
static void vDelay_uint(uint m)
{
for (m>0m--)
}
//-----------------------------按键扫描函数-----------------------------
uchar ucKb4X4_Scan(void)
{ uint m //用作连续按键的延时
uchar sccode,recode //sccode表示行,recode表示列,ucKeyVal表示返回码
KEYPORT=0xf0 //付初值KEYPORT = 11110000
if ((KEYPORT&0xf0)!=0xf0) //判断是否有按键,有按键则不为初值
{
vDelay_uint(200) //延时去抖动
if ((KEYPORT&0xf0)!=0xf0)
{
sccode=0xfe //使sccode = 11111110
while ((sccode&0x10)!=0) //用于循环4次因为是4*4键盘
{
KEYPORT=sccode
if ((KEYPORT&0xf0)!=0xf0) //判断按键是否在此行
{
recode=(KEYPORT&0xf0)|0x0f //确定列的位置
for (m=0((KEYPORT&0xf0)!=0xf0)&&(m<10000)m++)
//用m做一个10000次的延迟,(P1&0xf0)!=0xf0用于判定是否还在按着,
//如果是延迟20000次返回一次值码
vDelay_uint(10000) //延时10000次,共20000次返回一次值码
return((~sccode)+(~recode)) //返回按键码
}
else
sccode=(sccode<<1)|0x01 //不在此行下移一行
}
}
}
return(0) //无按键返回0
}
2*3的键盘,太简单了,不值得用循环,特别是双重循环。最简明、高效的程序如下:
sbit P10 = P1^0
sbit P11 = P1^1
sbit P12 = P1^2
sbit P13 = P1^3
sbit P14 = P1^4
char scan_key(void)
{
P13 = 0
if (!P10) return 0
if (!P11) return 1
if (!P12) return 2
P13 = 1
P14 = 0
if (!P10) return 3
if (!P11) return 4
if (!P12) return 5
}
本程序,使用的变量最少,也不涉及其它接口。
代码最少,执行效率最高。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)