4乘4矩阵键盘总结.doc_第1页
4乘4矩阵键盘总结.doc_第2页
4乘4矩阵键盘总结.doc_第3页
4乘4矩阵键盘总结.doc_第4页
4乘4矩阵键盘总结.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281代码有错,正确的可见单片机上机作业/*/*C51按键识别函数集源文件 */*/ 作者:Ryudo 桂林电子科技大学 / 开发开始时间:2006年8月15日/ 说明: 涉及到的所有的延时函数配合C51延时函数包使用 默认晶振频率12MHZ/ 版本信息:Ver 1.0/*/ 扫描方法一: 06.8.15 添加 4X4矩阵按键逐行扫描(一次)识别法函数/ 硬件连接 : / _VCC/ | | | |/ | | | |/ | | | |/ R R R R/ | | | |/ | | | |/ / | / | / | / |/ P X.7 -/-|-/-|-/-|-/-| 每个按键对应的识别码是:0x88,0x84,0x82,0x81/ | | | |/ / | / | / | / |/ P X.6 -/-|-/-|-/-|-/-| 0x48,0x44,0x42,0x41/ | | | |/ / | / | / | / |/ P X.5 -/-|-/-|-/-|-/-| 0x28,0x24,0x22,0x21/ | | | |/ / | / | / | / |/ P X.4 -/-|-/-|-/-|-/-| 0x18,0x14,0x12,0x11/ | | | |/ | | | |/ P X.3 -| | | |/ | | |/ | | |/ P X.2 -|-| | |/ | |/ | | / P X.1 -|-|-| |/ |/ |/ P X.0 -|-|-|-|/*/ 扫描方法二: 06.8.15 添加 4X4矩阵键盘线翻转识别法函数/ 硬件连接 : / | | | | / / | / | / | / |/ P X.7 -/-|-/-|-/-|-/-| 每个按键对应的识别码是:0x77,0x7b,0x7d,0x7e/ | | | | / / | / | / | / | / P X.6 -/-|-/-|-/-|-/-| 0xb7,0xbb,0xbd,0xbe / | | | |/ / | / | / | / |/ P X.5 -/-|-/-|-/-|-/-| 0xd7,0xdb,0xdd,0xde/ | | | |/ / | / | / | / |/ P X.4 -/-|-/-|-/-|-/-| 0xe7,0xeb,0xed,0xee/ | | | |/ | | | |/ P X.3 -| | | |/ | | |/ | | |/ P X.2 -|-| | |/ | |/ | | / P X.1 -|-|-| |/ |/ |/ P X.0 -|-|-|-|/*/ 扫描方法三: 06.8.16 添加 4X4矩阵键盘行扫描识别法函数(只返回4个识别码)/ 硬件连接 : / | | | | / / | / | / | / |/ P X.7 -/-|-/-|-/-|-/-| 通用识别码: 0x07,0x0b,0x0d,0x0e/ | | | |/ / | / | / | / |/ P X.6 -/-|-/-|-/-|-/-| 0x07,0x0b,0x0d,0x0e/ | | | |/ / | / | / | / |/ P X.5 -/-|-/-|-/-|-/-| 0x07,0x0b,0x0d,0x0e/ | | | |/ / | / | / | / |/ P X.4 -/-|-/-|-/-|-/-| 0x07,0x0b,0x0d,0x0e/ | | | |/ | | | |/ P X.3 -| | | |/ | | |/ | | |/ P X.2 -|-| | |/ | |/ | | / P X.1 -|-|-| |/ |/ |/ P X.0 -|-|-|-|/*#include#include/*/ 扫描方法一: 4X4矩阵按键逐行扫描(一次)识别法函数/ 函数假设硬件接在P1口,及说明中X=1/ 返回的是识别码,调用函数根据识别码动作/ 说明:算法稍烦,进阶使用 unsigned char uc_Line_Scan_Send16(void) unsigned char uc_Temp_1,uc_Temp_2; P1=0x0f; /先将所有行线拉低 if(P1&0x0f!=0x0f) /如果列线有变化 Delay_12M_50ms(); /延迟一段时间。 if((P1&0x0f)!=0x0f) /如果此时此刻列线还有变化,说明确实有按键按下 uc_Temp_1=0x7f; /用变量保存下第一次发送的扫描码0111,1111 while(uc_Temp_1&0x08!=0) /如果四个行线被完整扫描一次还没有完成,就进入循环,继续扫描下一行 P1=uc_Temp_1; /给P1口赋扫描码,每次只拉低一行 if(P1&0x0f!=0x0f) /如果判断为真,则说明找到了按键按下的行 uc_Temp_2=(P1&0x0f)|0xf0; /计算识别码的算法,灵活性很大。 return (uc_Temp_1)+(uc_Temp_2); /返回识别码,识别码是根据上一条语句的算法计算好的,每个识别码对应一个按键,一共有16个识别码。 else /否则依次将第二,第三,第四行拉低 uc_Temp_1=1; 01111111 00111111 uc_Temp_1|=0x80; 10111111 11011111 11101111 11110111 *0* /*/ 扫描方法二: 4X4矩阵键盘线翻转识别法函数/ 函数假设硬件接在P1口,及说明中X=1/ 返回的是识别码,调用函数根据识别码动作/ 说明 :算法简单易懂,初级使用unsigned char uc_Line_Turn(void) unsigned char uc_Temp_1,uc_Temp_2; P1=0xff; /P1口置高电平,准备输入 P1=0x0f; /P1口高4位作为输出,输出0,低四位作为输入 if(P1&0x0f!=0x0f) /如果按键有反应 Delay_12M_50ms(); /延时去抖 if(P1&0x0f!=0x0f) /如果为真,则确实有按键按下 uc_Temp_1=P1; /把这时P1口状态保存在一个变量中 00001110 P1=0xf0; /把P1口高四位置输入,低四位作为输出,注意:这就是线翻转 (即输入输出翻转)的本质所在 uc_Temp_2=P1; /把这时P1口状态保存在一个变量中 01110000 return uc_Temp_1|uc_Temp_2; /或操作,返回识别码 01111110 10000001 /*/ 扫描方法三:4X4矩阵键盘行扫描识别法函数(4个识别码)/ 函数假设硬件接在P1口,及说明中X=1/ 说明:个人不推荐使用这种方法,代码比较长,占用大量CPU时间,按键有时反应不够灵敏/ void Line_Scan_Send4(void) P1=0xff; /P1口置高,低四位准备接收输入 P1_7=0; /把P1口低四位作为输入,高四位作为输出,先扫描第一行,P17发送0。之前要把高四位进行位定义,这里只是作说明用。下同。 if(P1&0x0f!=0x0f) /如果检测到按键有反应 Delay_12M_50ms(); /延迟去抖 if(P1&0x0f!=0x0f) /此时确定有按键按下 switch(P1&0x0f) case 0x07: /*动作 */; /这里的动作根据实际要求添加,也可以作为返回值使用。 break; case 0x0b: /*动作 */; break; case 0x0d: /*动作 */; break; case 0x0e: /*动作 */; break; default:break; /不动作 while(P1&0x0f!=0x0f); /等待按键跳起 / P1=0xff; /P1口置高,低四位准备接收输入 P1_6=0; if(P1&0x0f!=0x0f) /如果检测到按键有反应 Delay_12M_50ms(); /延迟去抖 if(P1&0x0f!=0x0f) /此时确定有按键按下 switch(P1&0x0f) case 0x07: /*动作 */; /这里的动作根据实际要求添加,也可以作为返回值使用。 break; case 0x0b: /*动作 */; break; case 0x0d: /*动作 */; break; case 0x0e: /*动作 */; break; default:break; /不动作 while(P1&0x0f!=0x0f); /等待按键跳起 / P1=0xff; /P1口置高,低四位准备接收输入 P1_5=0; if(P1&0x0f!=0x0f) /如果检测到按键有反应 Delay_12M_50ms(); /延迟去抖 if(P1&0x0f!=0x0f) /此时确定有按键按下 switch(P1&0x0f) case 0x07: /*动作 */; /这里的动作根据实际要求添加,也可以作为返回值使用。 break; case 0x0b: /*动作 */; break; case 0x0d: /*动作 */; break; case 0x0e: /*动作 */; break; default:break; /不动作 while(P1&0x0f!=0x0f); /等待按键跳起 / P1=0xff; /P1口置高,低四位准备接收输入 P1_4=0; if(P1&0x0f!=0x0f) /如果检测到按键有反应 Delay_12M_50ms(); /延迟去抖 if(P1&0x0f!=0x0f) /此时确定有按键按下 switch(P1&0x0f) case 0x07: /*动作 */; /这里的动作根据实际要求添加,也可以作为返回值使用。 break; case 0x0b: /*动作 */; break; case 0x0d: /*动作 */; break; case 0x0e: /*动作 */; break; default:break; /不动作 while(P1&0x0f!=0x0f); /等待按键跳起 /* uchar keyscan(void) /键盘扫描函数,使用行列反转扫描法. uchar cord_h, cord_l; /行列值中间变量. P2 = 0x0f; /高四位全输出0 cord_h = P2 & 0x0f; /读

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论