1.键盘的分类:
①键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘;
②而靠软件编程来识别的称为非编码键盘;
③在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的.
非编码键盘又分为:独立键盘和行列式(又称为矩阵式)键盘
2.用键盘上的一个键控制第一个LED灯的开关:
#include<reg52.h>
sbit d1 = P1^0;
sbit key1 = P3^4;
void main()
{
while(1)
{
if(key1 == 0)
d1 = 0;
else
d1 = 1;
}
}
3.抖动现象:
刚刚的程序比较简单,键盘的抖动对其没有太大的影响,什么是键盘抖动呢?
按键在闭合和断开时,触点会存在抖动现象:
4.抖动现象的影响及消除:
例程序如下:(每次点亮LED 灯的同时用数码管计数)
#include<reg52.h>
sbit d1 = P1^0;
sbit key1 = P3^4;
sbit wela = P2^7;
sbit dula = P2^6;
unsigned int temp,ge,shi;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void display(int temp);
void delay(int c)
{
int a,b;
for(a=100;a>0;a--)
for(b=c;b>0;b--);
}
void main()
{
temp=0;
display(temp);
while(1)
{
if(key1 == 0)
{
d1 = 0;
temp++;
while(!key1);
}
else
{
d1 = 1;
}
display(temp);
}
}
void display(int temp)
{
if(temp < 10)
{
wela = 1;
P0 = 0xfe;
wela = 0;
dula = 1;
P0 = table[temp];
dula = 0;
}
if(temp >= 10)
{
ge = temp%10;
shi = temp/10;
wela = 1;
P0 = 0xfe;
wela = 0;
dula = 1;
P0 = table[shi];
dula = 0;
delay(1);
wela = 1;
P0 = 0xfd;
wela = 0;
dula = 1;
P0 = table[ge];
dula = 0;
delay(1);
}
}
5.键盘的结构:
键盘识别方法:
识别按键的方法很多其中,最常见的方法是扫描法:
按键按下时,与此键相连的行线与列线导通,行线在无按键按下时处在高电平。如果所有的列线都处在高电平,则按键按下与否不会引起行线电平的变化,因此必须使所有列线处在电平。这样,当有按键按下时,改键所在的行电平才回由高变低。才能判断相应的行有键按下。
独立按键数量少,可根据实际需要灵活编码。矩阵键盘,按键的位置由行号和列号唯一确定,因此可以分别对行号和列号进行二进制编码,然后两值合成一个字节,高4位是行号,低4位是列号。
例程序如下:
此程序将第一排键盘定义为0,1,2,3;按不同的键数码管上显示不同的数字.
#include<reg52.h>
sbit wela = P2^7;
sbit dula = P2^6;
unsigned char temp,num;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay(int c)
{
int a,b;
for(a=100;a>0;a--)
for(b=c;b>0;b--);
}
void main()
{
wela = 1;
P0 = 0xc0;
wela = 0;
dula = 1;
P0 = 0;
dula = 0;
while(1)
{
P3 = 0xfe;
temp = P3;
temp = temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp = P3;
temp = temp&0xf0;
while(temp!=0xf0)
{
temp = P3;
switch(temp)
{
case 0xee : num = 1;
break;
case 0xde : num = 2;
break;
case 0xbe : num = 3;
break;
case 0x7e : num = 4;
break;
}
dula = 1;
P0 = table[num-1];
dula = 0;
}
}
}
}
6.完整的键盘编码:
编码16个键分别设置为1~f,按键盘上的前四列四行的键使数码管上显示编码的字符.
遇上一个程序不同的是:次程序中加入了松手检测,才能使程序正常运行.
#include<reg52.h>
sbit wela = P2^7;
sbit dula = P2^6;
unsigned char temp,num;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay(int c)
{
int a,b;
for(a=100;a>0;a--)
for(b=c;b>0;b--);
}
void main()
{
wela = 1;
P0 = 0xc0;
wela = 0;
dula = 1;
P0 = 0;
dula = 0;
while(1)
{
P3 = 0xfe;
temp = P3;
temp = temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp = P3;
temp = temp&0xf0;
while(temp!=0xf0)
{
temp = P3;
switch(temp)
{
case 0xee : num = 1;
break;
case 0xde : num = 2;
break;
case 0xbe : num = 3;
break;
case 0x7e : num = 4;
break;
}
while(temp!=0xf0)
{
temp = P3;
temp = temp&0xf0;
}
dula = 1;
P0 = table[num-1];
dula = 0;
}
}
P3 = 0xfd;
temp = P3;
temp = temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp = P3;
temp = temp&0xf0;
while(temp!=0xf0)
{
temp = P3;
switch(temp)
{
case 0xed : num = 5;
break;
case 0xdd : num = 6;
break;
case 0xbd : num = 7;
break;
case 0x7d : num = 8;
break;
}
while(temp!=0xf0)
{
temp = P3;
temp = temp&0xf0;
}
dula = 1;
P0 = table[num-1];
dula = 0;
}
}
P3 = 0xfb;
temp = P3;
temp = temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp = P3;
temp = temp&0xf0;
while(temp!=0xf0)
{
temp = P3;
switch(temp)
{
case 0xeb : num = 9;
break;
case 0xdb : num = 10;
break;
case 0xbb : num = 11;
break;
case 0x7b : num = 12;
break;
}
while(temp!=0xf0)
{
temp = P3;
temp = temp&0xf0;
}
dula = 1;
P0 = table[num-1];
dula = 0;
}
}
P3 = 0xf7;
temp = P3;
temp = temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp = P3;
temp = temp&0xf0;
while(temp!=0xf0)
{
temp = P3;
switch(temp)
{
case 0xe7 : num = 13;
break;
case 0xd7 : num = 14;
break;
case 0xb7 : num = 15;
break;
case 0x77 : num = 16;
break;
}
while(temp!=0xf0)
{
temp = P3;
temp = temp&0xf0;
}
dula = 1;
P0 = table[num-1];
dula = 0;
}
}
}
}