行列反转法在矩阵键盘中的应用及编程思想.docVIP

行列反转法在矩阵键盘中的应用及编程思想.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
行列反转法在矩阵键盘中的应用及编程思想.doc

行列反转扫描法在矩阵键盘中的应用及编程思想 我现在正在学习51单片机,学到矩阵键盘时,遇到了一些小问题,感觉行列扫描法原理简单,但编程较啰嗦,而且没有固定的编程模式,一个人一个编法,代码复杂,一会儿就能把人绕晕。于是我就想寻找有没有一种编程思想灵巧,代码简便的程序,通过苦苦在网上寻觅,终于找到了反转法。 行列反转扫描法法可能有些教材资料里都有,但是介绍都不够详细,我找到一个资料,代码非常简单,但是并不好理解,我苦苦思索了一个晚上才弄明白。于是根据反转法的思想,我写了一个代码不是最少,但却是非常容易理解的程序,在此拿来与大家共享。此程序已在开发板及Proteus软件中仿真成功。 电路原理图: P1口接矩阵键盘,其中P1.0~P1.3接行线,P1.4~P.7接列线,P0口接共阴极7段数码管。 反转法的原理: 反转法就是通过给单片机的端口赋值两次,最后得出所按键的值的一种算法。 for example: 如图1所示,取P1口的低四位为行线,高四位为列线。 1.我们给P1口赋值0x0f,假设0键按下了,则这时P1口的实际值 2.我们给P1口再赋值0xf0,如果0键按下了,则这时P1口的实际值 3.我们把两次P1口的实际值相加即0xee。 由此我们便得到了按下0键时所对应的数值0xee,以此类推可得出其他15个按键对应的数值,有了这种对应关系,矩阵键盘编程问题也就解决了,也就是程序的算法已经有了。对应关系见图2. 以下为程序: /*反转法矩阵键盘的应用,我认为这是一个编程简便又容易理解的矩阵键盘编程应用*/ #includereg52.h //头文件 #define uchar unsigned char //宏定义 #define uint unsigned int uchar key,n; //定义变量 uchar code table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //反转法矩阵键盘的各个按键的计算值 uchar code yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管显示0~F void delay(uint i) //延时函数 { while(i--); } void keyscan() { uchar l,h,i; //定义局部变量,用l得出低4位的值,用h得出高4位的值 P1=0x0f; //给P1赋 l=P10x0f; if(l!=0x0f) { delay(100); if(l!=0x0f) l=P10x0f; //若有键按下,得出低四位的值 } P1=0xf0; //给P1赋 h=P10xf0; if(h!=0xf0) { delay(100); if(h!=0xf0) h=P10xf0; //若有键按下,得出高4位的值 } key=l+h; //高4位的值与低4位的值相加 for(i=0;i16;i++) { if(key==table[i]) //通过查表得出n的值 n=i; } } void main() { while(1) { keyscan(); P0=yin[n]; //在数码管上显示相应的键值 } } temp_key=P2; //0键按下时P2=0000 1110; temp1=temp_key|0xf0;//确定了在哪一行temp1=1111 1110 P2=temp1;// temp_key=P2;确定了在哪一列//temp_key=1110 1110 P3=0xf0; temp=P3; if(temp!=0xf0) { delay(5); P3=0xf0; temp=P3; if(temp!=0xf0) { P3=0x0f; temp2=P3; if(temp2!=0x0f) { temp3=temp|temp2; }

文档评论(0)

wuyouwulu + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档