- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
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与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。
则P3此时为:00000111,这时如果用P30x0F,则高四位为0,低四位保留,可
以得到低四位的内容了。
通过去抖操作,即一个delay,可以得到低四位内容。这里设为:h=P30x0F;
如果再得到高四位内容,则可以组成一个数,来定位哪个键了。
用P3=h|0xF0;这会出现什么情况呢?1|0=11|1=1,这里难道高四位全置1吗?不是的,当赋值后,如果有键按下的话,P3高四位不会全为1111,被拉到0了。如P3.3与P3.7连接的键按下,则P3.3与P3.7为0,即接地了。即:0111
0111,F0之后,得到01110000,这样的话,我们得到高四位的值了,用高四位+低四位,就可以得到一个数值,确定一个键。
下面看看人家编写的程序,相信不是太难了吧。
//keyboard.c 这里的行与列的扫描,也就是把字节的8位,高四位与低四位分开来,从而确定坐标。
//行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍#includereg52.h//包含头文件
#defineucharunsignedchar#defineuintunsignedint
unsignedcharconstdofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
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 11107e 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;//8case0xdd: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=0x0f; //行线输出全为0cord_h=P30x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖if(cord_h!=0x
您可能关注的文档
- 30万元左右小别墅效果图、设计图.docx
- 30元牛皮赚到1000万的创业故事.docx
- 30则感人的微小说.docx
- 31赤水市小学课改课堂教学评价表.docx
- 31飞向蓝天的恐龙.docx
- 31恐龙灭绝分析和总结.docx
- 31奶牛酮病分析和总结.docx
- 31学查纠活动工作计划.docx
- 32 地球仪和地图 同步练习及答案.docx
- 32 解一元一次方程合并同类项与移项导学案.docx
- 分析let s单元56ago2卷纸zheng unit56.pdf
- 塑胶材料其它分类原料pa9t 12.pdf
- md16x16数字媒体切换器设备.pdf
- 者参考项目发起人学科类型单位序列承包商修订页代码顺序典型.pdf
- 届世界天然气大会阿姆斯特丹2006add10288.pdf
- 期测试记录表每周weekly g1g6 journeys tests level 6 lesson26.pdf
- modernize-whitepaper现代化您应用程序白皮书.pdf
- anybackup产品典型案例分析.pdf
- 约克金融工程课程tfeslide32.pdf
- 广州市妇女儿童医疗中心历份教学药历01tjy.pdf
文档评论(0)