- 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文件:
#includesbit 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); } } //矩阵键盘检测函数 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','+','-','*','/','%','='}; //矩阵键盘检测函数 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();
极力建议模块化,封装对后面使用非常方便!
下一章:
下一章:无



