矩阵键盘的扫描
P25 P26 P27有其他作用,
扫描程序应如何写。
给你写了一个2*3矩阵键盘演示程序,已经实物验证无误。有详细注释,不要说看不懂。是从异组端口4*4矩阵键盘演化而来。
#include <AT89X51.H>
#define uint unsigned int //宏定义数据类型uint
#define uchar unsigned char //宏定义数据类型uchar
sbit code0=P2^0; //定义2*3键盘端口
sbit code1=P2^1;
sbit code2=P2^2;
sbit code3=P2^3;
sbit code4=P2^4;
uchar key=0; //键值变量初始值
void PX(uchar i) //写入P2低5位数据
{
code0=i&0x01;i>>=1;
code1=i&0x01;i>>=1;
code2=i&0x01;i>>=1;
code3=i&0x01;i>>=1;
code4=i&0x01;
}
uchar PD() //读取P2低5位数据
{
uchar i=0;
i=code4;
i=(i<<1)|code3;
i=(i<<1)|code2;
i=(i<<1)|code1;
i=(i<<1)|code0;
return i;
}
void key_scan() //矩阵键盘扫描函数
{
uchar temp1,temp2,temp3; //临时变量
static bit sign=0; //按键自锁标志
static uint count=0; //消抖计数变量
PX(0x1C); //先给矩阵端口赋一个初值0x1C,高3位置0,中3位置1,低2位置0,0001 1100
if(PD()!=0x1C) //判断矩阵端口不等于所赋初值,说明有健按下
{
if(sign==0) //如果按键自锁标志为0
{
count++; //消抖计数
if(count>=200) //消抖计数自>=200,估算主循环周期调整
{ //摒弃Delay延时方式,
count=200; //防止溢出
sign=1; //按键自锁标志置1,键不抬起,按其他键无效
temp1=PD(); //temp1保存矩阵端口中3位变化,000x xx00
PX(0x03); //再给矩阵端口赋值0x03,0000 0011
temp2=PD(); //temp2保存矩阵端口低2位变化,0000 00xx
temp3=temp2|temp1; //temp3=低2位+中3位 000x xxxx
switch(temp3)
{
case 0x1a: key=1; break;
case 0x16: key=2; break;
case 0x0e: key=3; break;
case 0x19: key=4; break;
case 0x15: key=5; break;
case 0x0d: key=6; break;
default: break;
}
}
}
}
else //按键抬起
{
sign=0; //按键自锁标志清0
count=0; //消抖计数清0
}
}
void key_service() //按键服务程序
{
switch(key)
{
case 1: P1=0xfe; break;//LED显示键值
case 2: P1=0xfd; break;
case 3: P1=0xfb; break;
case 4: P1=0xf7; break;
case 5: P1=0xef; break;
case 6: P1=0xdf; break;
default: break;
}
}
void main()
{
while(1)
{
key_scan(); //键盘扫描
key_service(); //LED低电平亮显示键值
}
}
用5个I/O口做6个键的矩阵键盘有多大意义?
现在是发现了这个事情,但是板子已经做出来了 所以很难受
把矩阵键盘的接线图发上来,帮你看看。
和矩阵键盘扫描一样啊,扫描行列
和普通矩阵键盘一样的做法,只是要注意保护P2.5-P2.7的状态
这个接线图
就是想知道怎么保护 P2.5-P2.7
程序已写好,在审核中。仿真和实物测试都正常,不影响P2.5~2.7的状态,也与P2.5~2.7的状态无关,并可以移植到任意I/O口矩阵键盘。
非常感谢!
对P2.5-P2.7就是在对键盘引脚置1或清零的时候要保持P2.5-P2.7不变,一般就是在对键盘引脚设置时,通常对整个P2口进行操作,这时就是操作前先读P2数据,然后用与或者或的方式对键盘引脚设置,来保持P2.5-P2.7不变。
另外P2口可以位操作,那就可以用位操作的方式扫描键盘,也可以保持P2.5-P2.7不变
程序在7楼---字数补丁。
非常感谢!