【C51自学笔记】独立键盘+矩阵键盘

独立键盘:

键盘:

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;

		}
	}
}

猜你喜欢

转载自blog.csdn.net/f_zmmfs/article/details/81152981