📄 keyscan.c
字号:
/*
----------------------------------------------------------
; (c) Copyright xami All Rights Reserved
----------------------------------------------------------
; SOURCE_FILE: KEYSCAN.C
; APPLICATION: 80c51\80c52
; DESCRIPTION: 键盘扫描
; AUTHOR: xami
; DATE: 28 Apr. 2007
----------------------------------------------------------
*/
/*
//----------------------------------------------------------
//[测试版]
//----------------------------------------------------------
unsigned char keyscan(void)
{
unsigned char keytab[]={
0x11,0x12,0x14,0x18,
0x21,0x22,0x24,0x28,
0x41,0x42,0x44,0x48,
0x81,0x82,0x84,0x88} ; //行数,列数,行列综合后的键码,键码表
unsigned char resh,resl,res;
//取得行数
P1=0x0f; //行位全部置高
delay(2);
if((P1&0x0f)!=0x0f) //读取行,按下的键位为零
{
delay(20); //去抖动
if((P1&0x0f)!=0x0f)
{
resh=P1;
}
}
//取得列数
P1=0xf0; //列位全部置高
delay(2);
if((P1&0xf0)!=0xf0) //读取列,按下的键位为零
{
delay(20); //去抖动
if((P1&0xf0)!=0xf0)
{
resl=P1;
}
}
res=resh^resl; //行与列综合
return(res);
}
*/
/*
**********************************************************
; (c) Copyright xami All Rights Reserved
----------------------------------------------------------
; SOURCE_FILE: keyscan.c
; APPLICATION: 80c51\80c52 use port P1
; DESCRIPTION: [4*4 keboard scan programme] v1.0.1
输入: 无
输出: 1、检测到按键,输出对应的键码。
2、未检测到按键,输出0
//键盘编码数组结构
//-----------------------------------------------------
//unsigned char keytab[]={
// 0x11,0x12,0x14,0x18,
// 0x21,0x22,0x24,0x28,
// 0x41,0x42,0x44,0x48,
// 0x81,0x82,0x84,0x88} ;
//-----------------------------------------------------
//硬件接口说明
//-----------------------------------------------------
//列线都分别通过上拉电阻接5V正电;
//P1.0~P1.3分别接键盘的列线0~3列;
//P1.4~P1.7分别接键盘的行线0~3行;
//行线、列线交叉点通过按键相连接;
//-----------------------------------------------------
; AUTHOR: xami
; DATE: 16 Apr. 2007
**********************************************************
*/
//----------------------------------------------------------
//[改进版]
//----------------------------------------------------------
unsigned char keyscan(void)
{
unsigned char res;
P1 = 0; //初始化端口
P1 = 0x0f; //列位全部置高,准备读数据
delay(1); //(*配合硬件调节)
if((P1&0x0f)!= 0x0f){ //有键按下
delay(20); //去抖动延时(*需要配合硬件调节)
if((P1&0x0f)!= 0x0f){ //仍有按键
res = (~P1)&0x0f; //读取列,有键按下的列电平被拉低,所以先取反统一编码
P1 = 0xf0; //行位全部置高,准备读数据
delay(1); //(*配合硬件调节)
if((P1&0xf0)!= 0xf0){ //检查到行有按键(*实际去掉这个判断也应该没什么问题)
res |= (~P1)&0xf0; //读取行,有键按下的列电平被拉低,同时把它与列的结果合并
}else{
return 0;}
}else{ //只是抖动,返回0
return 0;}
}else{ //没有检测到按键,返回0
return 0;}
return(res);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -