📄 5 4x4 key.c
字号:
//4*4 键盘检测程序,按下键后相应的代码显示在数码管上
#include<reg51.h>
sbit beep=P2^3; //蜂鸣器接口
sbit dula=P2^6; //控制数码管段选的锁存器锁存端
sbit wela=P2^7; //控制数码管位选的锁存器锁存端
unsigned char i=100;
unsigned char j,k,temp,key;
void delay(unsigned char i) //可自定义延时长短的延时函数
{ //当 i=10 时大约为 10 毫秒
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71}; // 0-F编码
display(unsigned char num) // 显示子函数
{
P0=table[num]; //将第 num 个显示编码送 P0 口
dula=1; //一个下降沿将数据锁存
dula=0;
P0=0xc0; //位选通全部的数码管
wela=1; //一个下降沿将数据锁存
wela=0;
}
void main()
{ dula=0; //先关闭两个锁存器
wela=0;
while(1) //进入检测总循环
{ P3=0xfe; //给 P3.0 送低电平,其余为高电平
temp=P3; //把 P3 口数据读回来
temp=temp&0xf0; //把 P3 口与 11110000 相与
if(temp!=0xf0) //如果有键按下刚一定不相等,于是进入下一步检测
{ delay(10); //延时去抖动
if(temp!=0xf0) //再次判断是否有键按下
{ temp=P3; //判断为有,再次读 P3 口数据
switch(temp) //因为我们刚才是将第一行置的低
{ //在这里再判断是第几列
case 0xee: //如果 temp=0xee 则为第一行和第一列
key=0; //的交叉点,由此我们知道是矩阵键盘
break; //上的第一个键被按下,我们给 key=0。
case 0xde: //以后依此类推
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0) //这段程序是检测按键是否被释放
{ temp=P3; //如果没有释放就一直等待并且
temp=temp&0xf0;
beep=0; //蜂鸣器一直响
}
beep=1; //释放后关闭蜂鸣器
display(key); //显示按下相应键值的数据
P1=0xfe; //将第一个发光二极管点亮(我写
} //程序的时候测试用的)
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
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=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xfc;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
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=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xf8;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
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=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xf0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -