按键
五、按键
按键原理图

普通键盘
原理:按键未按下是低电平,按下的时候变为低电平
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//按键
sbit K1 = P2^0;
sbit K2 = P2^1;
sbit K3 = P2^2;
sbit K4 = P2^3;
//显示相关寄存器
sbit K13 = P1^3;
sbit wela = P1^5;
sbit dula = P1^4;
//段选 0~9
uint table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//位选 1~8
uchar positions[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
//函数声明
void delay();
void display(int position, int n);
/**
*当分别按下K17到K20,分别显示0到3
*/
void main()
{
P2 = 0xFF;
while(1)
{
//按键一
if(K1 == 0)
{
delay();
if(K1 ==0) display(0,1);
}
//按键二
if(K2 == 0)
{
delay();
if(K2 ==0) display(1,2);
}
//按键三
if(K3 == 0)
{
delay();
if(K3 ==0) display(2,3);
}
//按键四
if(K4== 0)
{
delay();
if(K4 ==0) display(3,4);
}
}
}
//数码管显示
void display(int position, int n)
{
//异常检查
if(n < 0 || n > 17) return ;
if(position < 0 || position > 7) return ;
//“总开关”打开
K13 = 0;
//消隐
dula = 1;
P0 = 0x00;
dula = 0;
//位选
P0 = positions[position];
wela = 1;//高电平数据直通
wela = 0;//低电平锁存
//段选
P0 = table[n];
dula = 1;
}
//延时
void delay()
{
int x,y;
for (x = 10;x > 0; x--)
for (y = 110;y > 0;y--);
}
矩阵键盘
原理:

代码理解
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//按键
sbit K20 = P2^0;
sbit K21 = P2^1;
sbit K22 = P2^2;
//段选 0~9
uint table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//位选 1~8
uchar positions[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
void display(int position, int n);
void delay();
//K1~K16分别显示0~F
void main(){
unsigned char x;
P2 = 0xFF;
while(1){
/* K1~K4*/
P2 = positions[0];//0xFE
x = P2 & 0xF0;
if(x != 0xF0)
{
delay();
if(x != 0xF0)
{
switch (x)
{
case 0xE0:
display(0,0);
break;
case 0xD0:
display(1,1);
break;
case 0xB0:
display(2,2);
break;
default:
display(3,3);
break;
}
}
}
/* K5~K8*/
delay();
P2 = positions[1];//0xFD
x = P2 & 0xF0;
if(x != 0xF0)
{
delay();
if(x != 0xF0){
switch (x)
{
case 0xE0:
display(4,4);
break;
case 0xD0:
display(5,5);
break;
case 0xB0:
display(6,6);
break;
default:
display(7,7);
break;
}
}
}
/* K8~K12*/
delay();
P2 = positions[2];//0xFB
x = P2 & 0xF0;
if(x != 0xF0)
{
delay();
if(x != 0xF0)
{
switch (x)
{
case 0xE0:
display(0,8);
break;
case 0xD0:
display(1,9);
break;
case 0xB0:
display(2,10);
break;
default:
display(3,11);
break;
}
}
}
/* K12~K16*/
delay();
P2 = positions[3];//0xF7
x = P2 & 0xF0;
if(x != 0xF0)
{
delay();
if(x != 0xF0)
{
switch (x)
{
case 0xE0:
display(4,12);
break;
case 0xD0:
display(5,13);
break;
case 0xB0:
display(6,14);
break;
default:
display(7,15);
break;
}
}
}
}
}
//显示
void display(int position, int n)
{
K13 = 0;
//位选
K15 = 1;//高电平数据直通
P0 = positions[position];//1111 1110
K15 = 0;//低电平锁存
//段选
P0 = table[n]; //0000 0110
K14 = 1;
K14 = 0;
}
//延时
void delay()
{
int x,y;
for (x = 10;x > 0; x--)
for (y = 110;y > 0;y--);
}

浙公网安备 33010602011771号