80C51单片机:5.独立键盘、矩阵键盘检测

80C51单片机:5.独立键盘、矩阵键盘检测,第1张

80C51单片机系列
  1. 80C51单片机
  2. 点亮第一个发光二极管,及流水灯案例
  3. 数码管显示及封装与消隐
  4. 中断、定时器
  5. 独立键盘、矩阵键盘检测

文章目录
  • 80C51单片机系列
  • 前言
  • 独立键盘
  • 独立键盘封装
  • 矩阵键盘
  • 矩阵键盘封装
  • 下一章:


前言

键盘的检测非常简单,就是判断键盘对应串口高低电平。

当一个按键被按下,对应串口输出的电平就会发生改变。只需要判断哪个串口发生了即可。


独立键盘

原理图如下:

代码如下:

#include
#include

// 包含封装的数码管显示头文件
#include"num_led.h"

typedef unsigned int uint;
typedef unsigned char uchar;

sbit ke_1 = P1^4;
sbit ke_2 = P1^5;
sbit ke_3 = P1^6;
sbit ke_4 = P1^7;
sbit ke_5 = P3^5;

unsigned char du_jian_value();


void main()
{
	uchar num;
	while(1){
		num = du_jian_value();
		num = (int)num - '0';
		Num_show(num); // 调用数码管显示函数
	}
}

unsigned char du_jian_value()
{
	if(!ke_1){// 键盘按下时为低电平
		while(!ke_1);// 消抖,当键盘为高电平时说明按键被松手,返回键盘值
		return '1';
	}
	if(!ke_2){
		while(!ke_2);
		return '2';
	}
	if(!ke_3){
		while(!ke_3);
		return '3';
	}
	if(!ke_4){
		while(!ke_4);
		return '4';
	}
	if(!ke_5){
		while(!ke_5);
		return '5';
	}
	return ' ';
}
独立键盘封装

进行模块化

.c文件:

#include
#include"du_jian.h"


unsigned char du_jian_value()
{
	if(!ke_1){// 键盘按下时为低电平
		while(!ke_1);// 消抖,当键盘为高电平时说明按键被松手,返回键盘值
		return '1';
	}
	if(!ke_2){
		while(!ke_2);
		return '2';
	}
	if(!ke_3){
		while(!ke_3);
		return '3';
	}
	if(!ke_4){
		while(!ke_4);
		return '4';
	}
	if(!ke_5){
		while(!ke_5);
		return '5';
	}
	return ' ';
}

.h文件:

#include

sbit ke_1 = P1^4;
sbit ke_2 = P1^5;
sbit ke_3 = P1^6;
sbit ke_4 = P1^7;
sbit ke_5 = P3^5;

unsigned char du_jian_value();

矩阵键盘

由于我的板子上没有矩阵键盘,所以就外接了一个矩阵键盘,外接到了P3口上。

代码如下(示例):

#include
#include"num_led.h"

#define ju_jian P3

typedef unsigned int uint;
typedef unsigned char uchar;

//每行置0
unsigned char low[4] = {0x7f,0xbf,0xdf,0xef};

unsigned char ju_jian_num[16] = {'1','2','3','4','5','6','7','8','9','0','+','-','*','/','%','='};

//矩阵键盘检测
unsigned char ju_jian_value();



void main()
{
	uchar num;
	while(1)
	{
		num =  ju_jian_value();
		num = (int)num - '0';
		Num_show(num);
	} 
	
	
}


//矩阵键盘检测函数
/*
1	2	3	4	
5	6	7	8 
9	0	+	-
*	/	%	+
*/
unsigned char ju_jian_value()
{
	unsigned char i,num = ' ';
	
	for(i=0;i<4;i++){
		ju_jian = low[i];
		if((ju_jian & 0x0f) != 0x0f){
			switch(ju_jian & 0x0f){
				case 0x07:
					num = ju_jian_num[(i * 4) + 0];
					break;
				case 0x0b:
					num = ju_jian_num[(i * 4) + 1];
					break;
				case 0x0d:
					num = ju_jian_num[(i * 4) + 2];
					break;
				case 0x0e:
					num = ju_jian_num[(i * 4) + 3];
					break;
				default:
					num = ' ';
			}
			while((ju_jian & 0x0f) != 0x0f);
			return num;
		}
		
	}
	return ' ';
}
矩阵键盘封装

.c文件:

#include
#include"ju_jian.h"


//每行置0
unsigned char low[4] = {0x7f,0xbf,0xdf,0xef};

unsigned char ju_jian_num[16] = {'1','2','3','4','5','6','7','8','9','0','+','-','*','/','%','='};



//矩阵键盘检测函数
/*
1	2	3	4	
5	6	7	8 
9	0	+	-
*	/	%	+
*/
unsigned char ju_jian_value()
{
	unsigned char i,num = '';
	
	for(i=0;i<4;i++){
		ju_jian = low[i];
		if((ju_jian & 0x0f) != 0x0f){
			switch(ju_jian & 0x0f){
				case 0x07:
					num = ju_jian_num[(i * 4) + 0];
					break;
				case 0x0b:
					num = ju_jian_num[(i * 4) + 1];
					break;
				case 0x0d:
					num = ju_jian_num[(i * 4) + 2];
					break;
				case 0x0e:
					num = ju_jian_num[(i * 4) + 3];
					break;
				default:
					num = ' ';
			}
			while((ju_jian & 0x0f) != 0x0f);
			return num;
		}
		
	}
	return ' ';
}

.h文件:

#include

#define ju_jian P3

//矩阵键盘检测
unsigned char ju_jian_value();

极力建议模块化,封装对后面使用非常方便!


下一章:

下一章:无

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1499203.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存