在AT89S52 单片机上连接矩阵键盘-51单片机与4x4键盘

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
unsigned char Key_Scan(void)//键盘扫描函数 如果有键按下返回键 ASC 值 若无返回 0 {
P1=0XF0; if(P1!=0XF0)//先确定是否有键按下 {
Delay(5);//稍微延时 避开按键前期抖动 if(P1!=0xf0)//再次检测是否按下
{ //--------------1-----------------------------------P1=0XFE;//第一次把 P1^7 拉低 switch (P1)//测 P1^0~~~P1^3 有没有低的 { case 0xee: while(P1!=0xfe);return '0';//P1^3 低 while();是在等待松手
//-------------3-------------------------------------P1=0XFB;//第三次把 P1^5 拉低 switch (P1)//测 P1^0~~~P1^3 有没有低的 {
case 0xeb: return '8';//P1^3 低 返回‘8’ case 0xdb: return '9';//P1^2 低 返回‘9’ case 0xbb: return 'A';//P1^1 低 返回‘A’ case 0x7b: return 'B';//P1^0 低 返回‘B’ default: break;//没有本行的键按下 继续下面扫描 }
case 0xe7: return 'C';//P1^3 低 返回‘C’ case 0xd7: return 'D';//P1^2 低 返回‘D’ case 0xb7: return 'E';//P1^1 低 返回‘E’ case 0x77: return 'F';//P1^0 低 返回‘F’ default: break;//没有键按下 继续下面 } } return 0; } 希望新入行的兄弟上机试一下这段函数 可以配个 LCD 来做显示 也可以用串口发回电脑显 示 否则光是看看印象不会很深的 严重不建议简单电路使用软件仿真 还是要 搭板子 编程 烤片 试验的
在 AT89S52 单片机上连接矩阵键盘
本文说说矩阵键盘和 51 单片机连接的情况。先说下独立键盘的应用。 当一个单片机系统只需要少量的键盘的时候 用简单的独立键盘最好 见下图
比如说按一个键亮一个灯就可以这样搞 果说真的要求就这么简单 其实连单片机也可以 省了 我自己感觉哈 学会用单片机的时候 就开始不喜欢用以前的电路啦 老是有一种单片 机可以搞定所有问题的感觉 其实这样不好 但是单片机确实很“万能”
上面函数是直接把 矩阵键盘检测按键的方法 翻译成 C 程序的 这样直接做当然是有很多问 题的 但是在拿到一个问题后不知道如何程序化的前提下 不妨就这样先直译 译完了 再确 定 功能是否实现 功能是否有缺陷 如何改良 。
上面的函数 功能是实现了 但是有 2 个致命的缺陷 (试过程序就知道)
1 没有键盘消抖和松手检测 2 代码过长
case 0xed: while(P1!=0xfd);return '4';//P1^3 低 返回‘4’ case 0xdd: while(P1!=0xfd);return '5';//P1^2 低 返回‘5’ case 0xbd: while(P1!=0xfd);return '6';//P1^1 低 返回‘6’ case 0x7d: while(P1!=0xfd);return '7';//P1^0 低 返回‘7’ default: break;//没有本行的键按下 继续下面扫描 } //----------------------------------------------------
松手后返回‘0’下面相同 case 0xde: while(P1!=0xfe);return '1';//P1^2 低 返回‘1’ case 0xbe: while(P1!=0xfe);return '2';//P1^1 低 返回‘2’ case 0x7e: while(P1!=0xfe);return '3';//P1^0 低 返回‘3’ default: break;//没有本行的键按下 继续下面扫描
//-------------3-------------------------------------P1=0XFB;//第三次把 P1^5 拉低 switch (P1)//测 P1^0~~~P1^3 有没有低的 {
case 0xeb: while(P1!=0xfb);return '8';//P1^3 低 返回‘8’ case 0xdb: while(P1!=0xfb);return '9';//P1^2 低 返回‘9’ case 0xbb: while(P1!=0xfb);return 'A';//P1^1 低 返回‘A’ case 0x7b: while(P1!=0xfb);return 'B';//P1^0 低 返回‘B’ default: break;//没有本行的键按下 继续下面扫描 } //----------------------------------------------------
//-------------2-------------------------------------P1=0XFD;//第二次把 P1^6 拉低 switch (P1)//测 P1^0~~~P1^3 有没有低的 {
case 0xed: return '4';//P1^3 低 返回‘4’ case 0xdd: return '5';//P1^2 低 返回‘5’ case 0xbd: return '6';//P1^1 低 返回‘6’ case 0x7d: return '7';//P1^0 低 返回‘7’ default: break;//没有本行的键按下 继续下面扫描 } //----------------------------------------------------
unsigned int sum; sum=1+2+3+4+5+......1000; } 这样写是会死人的 要么累死 要么被老大秒杀 看看下面的 void ADD1_1000(void) //(此段函数未调试 只是说明问题) { unsigned int sum,i; while(i!=1001) {
4
//-------------4-------------------------------------P1=0XF7;//第三次把 P1^4 拉低 switch (P1)//测 P1^0~~~P1^3 有没有低的 {
case 0xe7: while(P1!=0xf7);return 'C';//P1^3 低 返回‘C’ case 0xd7: while(P1!=0xf7);return 'D';//P1^2 低 返回‘D’ case 0xb7: while(P1!=0xf7);return 'E';//P1^1 低 返回‘E’ case 0x77: while(P1!=0xf7);return 'F';//P1^0 低 返回‘F’ default: break;//没有键按下 继续下面 } } return 0; }
关于没有键盘消抖和松手检测的现象我不想多说了 请试下就知道效果了 说说如何在上步程序的基础上加上 请看改良过 1 次的函数
void Delay(unsigned int Time)//新添加的延时函数 {
unsigned char t; while(Time--) {
for(t=0;t<100;t++); } }
1
下面出个检测矩阵键盘的函数秀秀哈(主函数略过) 采用最原始的想法哈 (除特殊说明外本资料里面程序均调试正常工作)
unsigned char Key_Scan(void)//键盘扫描函数 如果有键按下返回键 ASC 值 若无返回 0 {
P1=0XF0; if(P1!=0XF0)//先确定是否有键按下 {
} 这次试机的时候发现按一个键出 1 个字了吧(当然键盘不能超抖) 嘿嘿 程序就是这样调试的 先把功能搞出来 然后根据毛病再改良 老手也是这样来的 新人 更是如此 慢慢来 不要再不熟悉的情况下追求完美 会晕的 另外提下 程序这种东西永远没 有最完美 只有更完美 当你深深的感觉到 你编的程序在某种情况下是为了弥补硬件上的缺 陷的时候 那恭喜你 你就大概齐明白了为啥要用程序驱动电路了 呵呵
这样做了以后 上面红字第 1 个的毛病就克服了 但是更突出的是第 2 行红字的毛病了 咱们再改 细看程序 能发现程序中有很多一样或者相似的内容 具体的暂时先表管 只要是有这个感觉 就好办 以后别的函数也一样哈 先要有这个感觉 然后再细细琢磨你的感觉 我告诉大家只 要是有重复的东西就可以用循环搞定的 这也是简化代码的最直接办法 另外再扯点别的阿 计算机是计算的 有些时候 越是那种类似于 1+2+3+1000 之类的问题越 是要交给计算机算 不要人算 要知道 它算得比人快 N 倍 就说加法这个问题 如果按照人正常的想法 程序是这样编的 void ADD1_1000(void)//(此段函数未调试 只是说明问题) {
但是当系统需要比较多的键盘时 采用矩阵键盘就比较方便 见下图
常见的遥控器 大楼安保密码键盘 保险柜的键盘 电话机的键盘 手机键盘 上网聊 QQ 的键 盘 等等等等 都是这样的 4x4 矩阵键盘检测按键的方法是 先拉低第一行的电平,检测 1~4 列有无键按下 如有返回键值 如无看下行 再拉低第二行的电平,检测 1~4 列有无键按下 如有返回键值 如无看下行 先拉低第三行的电平,检测 1~4 列有无键按下 如有返回键值 如无看下行 再拉低第四行的电平,检测 1~4 列有无键按下 如有返回键值 如无则返回无键按下
sum=sum+i; i++; }
5
} 比较老实的弄法 有学生的风格 下面看个玩得更拽的 void ADD1_1000(void) //(此段函数未调试 只是说明问题) {
unsigned int sum,i; while(i!=1001) {
sum+=(i++); } } 其实和第 2 个是一个东西 只是压缩了一行 其实不建议这样压缩的 这样做完了 只能是程 序的可读性下降了(对于新人) 其他的好处不是很大 咱们以后也是阿 有时候是需要玩下 拽的(即特殊的时候) 但平时工作能老老实实就老老实的比较好 毕竟写完的程序还是自己 粘的时候比较多 再说了 以后编程很可能是论行算钱的 就更没有必要压缩这些不需要压缩的行了 但是如果 咱们的 Key_Scan()函数不压缩的话基本类似第一个加法函数也会被老大秒杀的 这都扯到 哪里了 言归正传哈
2
//----------------------------------------------------
//-------------4-------------------------------------P1=0XF7;//第三次把 P1^4 拉低 switch (P1)//测 P1^0~~~P1^3 有没有低的 {
//--------------1-----------------------------------P1=0XFE;//第一次把 P1^7 拉低 switch (P1)//测 P1^0~~~P1^3 有没有低的 {
case 0xee: return '0';//P1^3 低 返回‘0’ case 0xde: return '1';//P1^2 低 返回‘1’ case 0xbe: return '2';//P1^1 低 返回‘2’ case 0x7e: return '3';//P1^0 低 返回‘3’ default: break;//没有本行的键按下 继续下面扫描 } //----------------------------------------------------
} //----------------------------------------------------
//-------------2-------------------------------------P1=0XFD;//第二次把 P1^6 拉低 switch (P1)//测 P1^0~~~P1^3 有没有低的 {
相关文档
最新文档