51单片机矩阵键盘的c语言程序与分析

51单片机矩阵键盘的c语言程序与分析

ID:13708980

大小:76.00 KB

页数:3页

时间:2018-07-24

51单片机矩阵键盘的c语言程序与分析_第1页
51单片机矩阵键盘的c语言程序与分析_第2页
51单片机矩阵键盘的c语言程序与分析_第3页
资源描述:

《51单片机矩阵键盘的c语言程序与分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、51单片机矩阵键盘的C语言程序与分析2009-10-1719:25学习51单片机矩阵键盘时,我有点迷乱了,不知道是怎样处理的,经过仔细分析电路,然后终于明白其中的原理,这样的话,再看程序,就是那样的简单了。。首先看一下电路图是怎样连接的,我买的开发板上是AT89S52单片机,矩阵键盘在P3口。接法如下图:当然上面的图的意思是P3.1~P3.3跟P3.4~P3.7不一样的,他们是相互连接(当按下键时),组成4*4=16个键的。如果给P3一个扫描初值的话:如0x0F,则没有键按下时为:P3.1~P3.3为1,P3.4~P3.7为0。如果有键按下,则情况发生变化:高电平接入低电平:如P3.3

2、与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。则P3此时为:00000111,这时如果用P3&0x0F,则高四位为0,低四位保留,可以得到低四位的内容了。通过去抖操作,即一个delay,可以得到低四位内容。这里设为:h=P3&0x0F;如果再得到高四位内容,则可以组成一个数,来定位哪个键了。用P3=h

3、0xF0;这会出现什么情况呢?1

4、0=1  1

5、1=1,这里难道高四位全置1吗?不是的,当赋值后,如果有键按下的话,P3高四位不会全为1111,被拉到0了。如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。即:01110111,&F0之后,得到01110

6、000,这样的话,我们得到高四位的值了,用高四位+低四位,就可以得到一个数值,确定一个键。下面看看人家编写的程序,相信不是太难了吧。//keyboard.c  这里的行与列的扫描,也就是把字节的8位,高四位与低四位分开来,从而确定坐标。//行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍#include//包含头文件#defineucharunsignedchar#defineuintunsignedintunsignedcharconstdofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,  

7、                 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F,数码管来显示按下键的值。ucharkeyscan(void);           //主要的矩阵键盘扫描函数。voiddelay(uinti);voidmain(){ucharkey;P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符while(1){key=keyscan();//调用键盘扫描,switch(key){case0x7e:P0=dofly[0];break;//0按下相应的键显示相对应的码值原理就是高四位一列低四位一列的组//合。0111   111

8、07e   0表示按键后为0,1表示没有按键按下的。即P3.7与P3.1连接为低电平,为S1键//其他类推。case0x7d:P0=dofly[1];break;//1case0x7b:P0=dofly[2];break;//2case0x77:P0=dofly[3];break;//3case0xbe:P0=dofly[4];break;//4case0xbd:P0=dofly[5];break;//5case0xbb:P0=dofly[6];break;//6case0xb7:P0=dofly[7];break;//7case0xde:P0=dofly[8];break;//8ca

9、se0xdd:P0=dofly[9];break;//9case0xdb:P0=dofly[10];break;//acase0xd7:P0=dofly[11];break;//bcase0xee:P0=dofly[12];break;//ccase0xed:P0=dofly[13];break;//dcase0xeb:P0=dofly[14];break;//ecase0xe7:P0=dofly[15];break;//f}}}ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法比如:行为低电位,列为高四位{ucharcord_h,cord_l;//行列值P3=0

10、x0f;           //行线输出全为0cord_h=P3&0x0f;    //读入列线值if(cord_h!=0x0f)   //先检测有无按键按下{delay(100);       //去抖if(cord_h!=0x0f){   cord_h=P3&0x0f;//读入列线值   P3=cord_h

11、0xf0;//输出当前列线值   cord_l=P3&0xf0;//读入行线值   return(cord_h+cord_l);//

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。