//4x4矩阵键盘扫描例程(C51)
//使用P0口上的LED灯显示4x4键盘扫描得到的键值
//
//广西民大物电学院 李映超 2010.4.19
#include
#define uchar unsigned char
#define uint unsigned int
#define key_4x4_port P3 //定义4x4键盘使用的单片机端口
uchar key; //4x4键盘扫描所得的键值保存到这里
void delayms(uint xms); //声明延时子函数
void key_4x4_scan(); //声明4x4键盘扫描子函数,得到的键值送至全局变量key
//========================================================
void main()
{
P0=0xff; //P0开机初始化
key=0xff; //键盘值开机初始化为ff(检测到的键值应为0----15)
while(1)
{
key_4x4_scan();//不停调用键盘扫描程序
P0=key; //用P0来显示键值
}
}
//========================================================
void delayms(uint xms) //延时子函数
{ uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
//---------------------------------------------
void key_4x4_scan() //4x4键盘扫描子函数,得到的键值送至全局变量key
{ uchar temp ;
key_4x4_port=0xfe; //送出最高位0电平去扫描
temp=key_4x4_port; //读出整个口的得到的值
temp=temp&0xf0; //屏蔽低4位
if(temp!=0xf0) //假如高4位不是全1
{ delayms(10); //延时消抖再读
temp=key_4x4_port;
temp=temp&0xf0;
if(temp!=0xf0) //消抖后如果再次确定高4位不是全1
{ temp=key_4x4_port; //读出此次按键的值
switch(temp)
{ case 0xee:
key=0; break;
case 0xde:
key=1; break;
case 0xbe:
key=2; break;
case 0x7e:
key=3; break;
}
while(temp!=0xf0) //等待按键放开
{ temp=key_4x4_port;
temp=temp&0xf0;
}
}
}
key_4x4_port=0xfd;
temp=key_4x4_port;
temp=temp&0xf0;
if(temp!=0xf0)
{ delayms(10);
temp=key_4x4_port;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=key_4x4_port;
switch(temp)
{ case 0xed:
key=4; break;
case 0xdd:
key=5; break;
case 0xbd:
key=6; break;
case 0x7d:
key=7; break;
}
while(temp!=0xf0)
{ temp=key_4x4_port;
temp=temp&0xf0;
}
}
}
key_4x4_port=0xfb;
temp=key_4x4_port;
temp=temp&0xf0;
if(temp!=0xf0)
{ delayms(10);
temp=key_4x4_port;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=key_4x4_port;
switch(temp)
{ case 0xeb:
key=8; break;
case 0xdb:
key=9; break;
case 0xbb:
key=10; break;
case 0x7b:
key=11; break;
}
while(temp!=0xf0)
{ temp=key_4x4_port;
temp=temp&0xf0;
}
}
}
key_4x4_port=0xf7;
temp=key_4x4_port;
temp=temp&0xf0;
if(temp!=0xf0)
{ delayms(10);
temp=key_4x4_port;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=key_4x4_port;
switch(temp)
{ case 0xe7:
key=12; break;
case 0xd7:
key=13; break;
case 0xb7:
key=14; break;
case 0x77:
key=15; break;
}
while(temp!=0xf0)
{ temp=key_4x4_port;
temp=temp&0xf0;
}
}
}
}
//---------------------------------------------
上一篇:51单片机矩阵键盘编码方法
下一篇:51单片机外设之——矩阵键盘(传统法一)
推荐阅读最新更新时间:2024-03-16 16:06