锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-09-18 09:37:02 ke100二极管

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();

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


下一章:

下一章:无

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章