51单片机学习5_独立键盘/4*4矩阵键盘实现

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 51单片机学习5_独立键盘/4*4矩阵键盘实现

51单片机的键盘操作还是蛮简单的,首先从独立键盘开始实验,独立键盘的原理图如下所示:

独立键盘原理图

独立键盘原理图

从上述原理图,我们知道这四个独立的键盘,位于P3口的4,5,6,7位,于是,我们就要对这几位进行操作即可.默认IO口都是高电平,当按键按下去的时候,变成了低电平.根据这个原理,我们就去检测按键是否被按下.这中间涉及到了键盘消除抖动的程序,具体处理办法就是延迟5~10ms进行处理,时间自行选择.下面是独立键盘的实现代码:

 

/*四个独立键盘,每次按下,
第一个发光二极管点亮,松手就熄灭 
*/
//引入头文件,定义宏 
#include <reg52.h>
#define uint unsigned int

//根据电路图,每个独立键盘所对应的特殊位 
sbit dled1 = P3 ^ 4;
sbit dled2 = P3 ^ 5;
sbit dled3 = P3 ^ 6;
sbit dled4 = P3 ^ 7;

//延时函数 
void delay(uint time)
{
	uint x, y;
	for (x = time; x > 0; x--)
		for (y = 110; y > 0; y--);
}
//点亮发光二极管 
void openlight()
{
	P1 = 0xfe;
}

//熄灭发光二极管 
void closelight()
{
	P1 = 0xff;
}
void main()
{

	while (1) {
		//当dled1检测到低电平的时候,证明按键被按下了 
		if (dled1 == 0) {
			delay(10);//消除抖动特别延时10s 
			if (dled1 == 0) {
				openlight();
			}

			while (!dled1) {
				delay(10);//消除抖动特别延时10s
				while (!dled1);
			}

		} else {
			closelight();
		}

		//参考dled1
		if (dled2 == 0) {
			delay(10);
			if (dled2 == 0) {
				openlight();
			}

			while (!dled2) {
				delay(10);
				while (!dled2);
			}

		} else {
			closelight();
		}

		//参考dled1
		if (dled3 == 0) {
			delay(10);
			if (dled3 == 0) {
				openlight();
			}
			while (!dled3) {
				delay(10);
				while (!dled3);
			}

		} else {
			closelight();
		}

		//参考dled1
		if (dled4 == 0) {
			delay(10);
			if (dled4 == 0) {
				openlight();
			}
			while (!dled4) {
				delay(10);
				while (!dled4);
			}

		} else {
			closelight();
		}

	}
}

同样的,矩阵键盘的检测也是检测是否有低电平,不过矩阵键盘需要线与下才能进行判断,当一个线上有低电平的时候,两根线线与的话便会变成低电平.矩阵的4*4键盘原理图如下:

51单片机4*4矩阵键盘原理图

51单片机4*4矩阵键盘原理图

实验的演示代码如下:

 

/*
	4 * 4矩形键盘,按某个键盘,第一个数码管显示他的数
	即为0~F 
*/ 
//引入头文件,宏定义 
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit dula = P2 ^ 6;//段选控制位 
sbit wela = P2 ^ 7;//位选控制位 
uchar num, temp;
//数码管显示数 
uchar code table[]={
	0x3f, 0x06, 0x5b, 0x4f,
	0x66, 0x6d, 0x7d, 0x07,
	0x7f, 0x6f, 0x77, 0x7c,
	0x39, 0x5e, 0x79, 0x71,
	0
};

//数码管显示函数 
void display(uchar num)
{
	dula = 1;
	P0 = table[num - 1];
	dula = 0;
}

//延时函数 
void delay(uint time)
{
	uint x, y;
	for (x = time; x > 0; x--)
		for (y = 110; y > 0; y--);
}

//扫描键盘输入 
uchar scan()
{

	P3 = 0xfe;//设置第一行全部为低电平,其余为高电平 
	temp = P3;//监听P3口 
	temp &= 0xf0;//与0xf0与运算,判断是否真的有键盘按下 
	//如果temp的高4位变化,说明高四位有按键按下 
	if (temp != 0xf0) {
		delay(10);//消除抖动,延时10ms 
		temp = P3;//再次进行赋值 
		temp &= 0xf0;//再次进行与运算
		//再次进行判断过了抖动之后是否真的有按键按下 
		if (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 &= 0xf0;
			}
		}
	}

	//类似第一行的键盘操作,参考第一个
	P3 = 0xfd;
	temp = P3;
	temp &= 0xf0;
	if (temp != 0xf0) {
		delay(10);
		temp = P3;
		temp &= 0xf0;
		if (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 &= 0xf0;
			}
		}
	}

	//类似第一行的键盘操作,参考第一个
	P3 = 0xfb;
	temp = P3;
	temp &= 0xf0;
	if (temp != 0xf0) {
		delay(10);
		temp = P3;
		temp &= 0xf0;
		if (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 &= 0xf0;
			}
		}
	}

	//类似第一行的键盘操作,参考第一个
	P3 = 0xf7;
	temp = P3;
	temp &= 0xf0;
	if (temp != 0xf0) {
		delay(10);
		temp = P3;
		temp &= 0xf0;
		if (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 &= 0xf0;
			}
		}
	}

	return num;
}

void main()
{
	num = 17;
	wela = 1;
	P0 = 0xfe;
	wela = 0;

	dula = 1;
	P0 = 0;
	dula = 0;

	while (1) {
		display(scan());
	}
}

以上程序在TX-1C板子上均通过运行,不正请拍砖.

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 51单片机学习5_独立键盘/4*4矩阵键盘实现

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: