51单片机的键盘操作还是蛮简单的,首先从独立键盘开始实验,独立键盘的原理图如下所示:
从上述原理图,我们知道这四个独立的键盘,位于P3口的4,5,6,7位,于是,我们就要对这几位进行操作即可.默认IO口都是高电平,当按键按下去的时候,变成了低电平.根据这个原理,我们就去检测按键是否被按下.这中间涉及到了键盘消除抖动的程序,具体处理办法就是延迟5~10ms进行处理,时间自行选择.下面是独立键盘的实现代码:
/*四个独立键盘,每次按下, 第一个发光二极管点亮,松手就熄灭 */ //引入头文件,定义宏 #include <reg52.h> #define uint unsigned int //根据电路图,每个独立键盘所对应的特殊位 sbit dled1 = P3 ^ 4; sbit dled2 = P3 ^ 5; sbit dled3 = P3 ^ 6; sbit dled4 = P3 ^ 7; //延时函数 void delay(uint time) { uint x, y; for (x = time; x > 0; x--) for (y = 110; y > 0; y--); } //点亮发光二极管 void openlight() { P1 = 0xfe; } //熄灭发光二极管 void closelight() { P1 = 0xff; } void main() { while (1) { //当dled1检测到低电平的时候,证明按键被按下了 if (dled1 == 0) { delay(10);//消除抖动特别延时10s if (dled1 == 0) { openlight(); } while (!dled1) { delay(10);//消除抖动特别延时10s while (!dled1); } } else { closelight(); } //参考dled1 if (dled2 == 0) { delay(10); if (dled2 == 0) { openlight(); } while (!dled2) { delay(10); while (!dled2); } } else { closelight(); } //参考dled1 if (dled3 == 0) { delay(10); if (dled3 == 0) { openlight(); } while (!dled3) { delay(10); while (!dled3); } } else { closelight(); } //参考dled1 if (dled4 == 0) { delay(10); if (dled4 == 0) { openlight(); } while (!dled4) { delay(10); while (!dled4); } } else { closelight(); } } }
同样的,矩阵键盘的检测也是检测是否有低电平,不过矩阵键盘需要线与下才能进行判断,当一个线上有低电平的时候,两根线线与的话便会变成低电平.矩阵的4*4键盘原理图如下:
实验的演示代码如下:
/* 4 * 4矩形键盘,按某个键盘,第一个数码管显示他的数 即为0~F */ //引入头文件,宏定义 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula = P2 ^ 6;//段选控制位 sbit wela = P2 ^ 7;//位选控制位 uchar num, temp; //数码管显示数 uchar code table[]={ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0 }; //数码管显示函数 void display(uchar num) { dula = 1; P0 = table[num - 1]; dula = 0; } //延时函数 void delay(uint time) { uint x, y; for (x = time; x > 0; x--) for (y = 110; y > 0; y--); } //扫描键盘输入 uchar scan() { P3 = 0xfe;//设置第一行全部为低电平,其余为高电平 temp = P3;//监听P3口 temp &= 0xf0;//与0xf0与运算,判断是否真的有键盘按下 //如果temp的高4位变化,说明高四位有按键按下 if (temp != 0xf0) { delay(10);//消除抖动,延时10ms temp = P3;//再次进行赋值 temp &= 0xf0;//再次进行与运算 //再次进行判断过了抖动之后是否真的有按键按下 if (temp != 0xf0) { temp = P3; switch (temp) { case 0xee: num = 1; break; case 0xde: num = 2; break; case 0xbe: num = 3; break; case 0x7e: num = 4; break; } //按键始终处于监听状态 while (temp != 0xf0) { temp = P3; temp &= 0xf0; } } } //类似第一行的键盘操作,参考第一个 P3 = 0xfd; temp = P3; temp &= 0xf0; if (temp != 0xf0) { delay(10); temp = P3; temp &= 0xf0; if (temp != 0xf0) { temp = P3; switch (temp) { case 0xed: num = 5; break; case 0xdd: num = 6; break; case 0xbd: num = 7; break; case 0x7d: num = 8; break; } while (temp != 0xf0) { temp = P3; temp &= 0xf0; } } } //类似第一行的键盘操作,参考第一个 P3 = 0xfb; temp = P3; temp &= 0xf0; if (temp != 0xf0) { delay(10); temp = P3; temp &= 0xf0; if (temp != 0xf0) { temp = P3; switch (temp) { case 0xeb: num = 9; break; case 0xdb: num = 10; break; case 0xbb: num = 11; break; case 0x7b: num = 12; break; } while (temp != 0xf0) { temp = P3; temp &= 0xf0; } } } //类似第一行的键盘操作,参考第一个 P3 = 0xf7; temp = P3; temp &= 0xf0; if (temp != 0xf0) { delay(10); temp = P3; temp &= 0xf0; if (temp != 0xf0) { temp = P3; switch (temp) { case 0xe7: num = 13; break; case 0xd7: num = 14; break; case 0xb7: num = 15; break; case 0x77: num = 16; break; } while (temp != 0xf0) { temp = P3; temp &= 0xf0; } } } return num; } void main() { num = 17; wela = 1; P0 = 0xfe; wela = 0; dula = 1; P0 = 0; dula = 0; while (1) { display(scan()); } }
以上程序在TX-1C板子上均通过运行,不正请拍砖.
文章的脚注信息由WordPress的wp-posturl插件自动生成