80C51单片机:5.独立键盘、矩阵键盘检测
时间:2022-08-03 17:19:00
80C51单片机系列
文章目录
- 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();
极力建议模块化,封装对后面使用非常方便!
下一章:
下一章:无