独立键盘:
键盘:
v键盘分编码键盘(如PS2的键盘)和非编码键盘。
v键盘上按键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如BCD码键盘、ASCLL码键盘等。
v而靠软件编程来识别的称为非编码键盘;
v 在单片机组成的各种系统中,用的最多的是非编码键盘。非编码键盘又分为:独立式非编码键盘和行列式非编码键盘。
独立键盘:
符合线与概念:开关闭合之后,IO为低电平(一条线上,一端为0,另一端也为0)
线或:有一端为高组态,完全看另一端的表现。
防抖动:
硬件消抖:CPU太过繁忙
软件消抖:延时函数
如何检测键盘是否按下:
给IO口置为1,时刻检测IO,如果IO为0,说明按下。
举例:
利用key1控制数码管的数字变化:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^2;//key1按键
sbit led0=P0^0;
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//大约50ms的延时
//************************************************
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void main()
{
uchar num;
P3=0xff;
while(1)
{
if(key1==0)
{
delay_50us(200);
if(key1==0)
{
num++;
led0=0;//led灯的反馈 亮
if(num==10)
num=0;
while(!key1);
}
delay_50us(200);
while(!key1);//等待松手进入下一次循环
}
else
led0=1;//led灯的反馈 灭
P1=smg_du[num];//松手变数
}
}
矩阵键盘:
如果开发的系统要用到很多的按键,为了节省I/O口,我们一般使用4*4键盘。
这样用一个8位的I/O口就可以驱动16个键盘。
原理图:
0-3:行线
4-7:列线
扫描按键的方法:
- 初始化P3= 1111 0000
- k = P3 读取P3状态
- k&1111 0000(获取高四位)(获得列位置)
- k= k|00001111(高四位+低四位全为1)
- P3 = k(可以获得行位置,线与)
- k2 = P3(获取状态)
- k2 = k2&00001111(屏蔽高四位)k = k&11110000(屏蔽低四位)
- a = k+k1(获取位置)
- switch语句判断
实例:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50ms的延时
//************************************************
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void main()
{
uchar key_l,key_h;
uchar key;
while(1)
{
P3=0xf0;
key_l=P3;
key_l=key_l&0xf0;
if(key_l!=0xf0)
{
delay_50us(100);
if(key_l!=0xf0)
{
key_l=P3&0xf0; //11100000
key_l=key_l|0x0f;//11101111
P3=key_l;
key_h=P3;
key_h=key_h&0x0f;//00001110
key_l=key_l&0xf0;//11100000
key=key_h+key_l; //11101110
}
}
switch (key)
{
case 0xee:P1=smg_du[0];break;
case 0xde:P1=smg_du[1];break;
case 0xbe:P1=smg_du[2];break;
case 0x7e:P1=smg_du[3];break;
case 0xed:P1=smg_du[4];break;
case 0xdd:P1=smg_du[5];break;
case 0xbd:P1=smg_du[6];break;
case 0x7d:P1=smg_du[7];break;
case 0xeb:P1=smg_du[8];break;
case 0xdb:P1=smg_du[9];break;
case 0xbb:P1=smg_du[10];break;
case 0x7b:P1=smg_du[11];break;
case 0xe7:P1=smg_du[12];break;
case 0xd7:P1=smg_du[13];break;
case 0xb7:P1=smg_du[14];break;
case 0x77:P1=smg_du[15];break;
}
}
}