端口寄存器的值只能软件改变,按键只是暂时改变端口电平状态,不能改变端口寄存器的值,一旦按键抬起,端口电平状态恢复为端口寄存器的值。给你一个4*4矩阵键盘程序参考,每句都有注释,不难理解。
#include <reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
uchar key=0; //键值变量
void key_scan() //矩阵键盘扫描函数
{
uchar temp1,temp2,temp3; //临时变量
static bit sign=0; //按键自锁标志
static uchar count=0; //消抖计数变量
P3=0xf0; //先给P3赋一个初值1111 0000
if(P3!=0xf0) //判断P3不等于所赋初值,说明有健按下
{
if(sign==0) //如果按键自锁标志为0
{
count++; //消抖计数,摒弃Delay延时方式
if(count>=250) //估算主循环周期调整100~255
{
sign=1; //按键自锁标志置1,键不抬起,按其他键无效
temp1=P3; //temp1保存高4位变化xxxx 0000
P3=0x0f; //再给P3赋值0x0f 0000 1111
temp2=P3; //temp2保存低4位变化0000 xxxx
temp3=temp2|temp1; //temp3=temp2按位与temp1,等效于低4位+高4位
key=temp3; //保存键值
}
}
}
else //按键抬起
{
sign=0; //按键自锁标志清0
count=0; //消抖计数清0
}
}
void main()
{
while(1)
{
key_scan(); //键盘扫描
P1=key; //LED低电平亮显示键值
}
} |