- 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();
极力建议模块化,封装对后面使用非常方便!
下一章:
下一章:无
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)