第十八课 按键之四 矩阵按键之算法
程序讲解
/*--------------------------------------------------------------*///4*4矩阵键盘的设计//Time: 21:04 2009-4-28//说明:由于开发板是端口复用,可能相关器件(A/D)对按键会有干扰,若有干扰,可以取下相关芯片!
/*--------------------------------------------------------------*///包含头文件#include <AT89X52.H>
/*--------------------------------------------------------------*///键盘接口定义#define key_port P2
/*--------------------------------------------------------------*///延时5000+0us 函数定义void delay5ms(void){ unsigned char i,j; for(i=185;i>0;i--) for(j=12;j>0;j--);}
/*--------------------------------------------------------------*///col对应key_port的高四位,row对应key_port的低四位//按键ID号如下:/*┏━┳━┳━┳━┓ ┳┃0 ┃ 1 ┃ 2 ┃3 ┃ ┃R0┣━╋━╋━╋━┫ ╋┃4 ┃ 5 ┃ 6 ┃7 ┃ ┃R1┣━╋━╋━╋━┫ ╋┃8 ┃ 9 ┃10┃11┃ ┃R2┣━╋━╋━╋━┫ ╋┃12┃13┃14┃15┃ ┃R3┗━┻━┻━┻━┛ ┻┣━╋━╋━╋━┫ C0 C1 C2 C3*//*--------------------------------------------------------------*///计算unsigned char key_scan(void){ unsigned char row, col, ok, key_code;
key_port = 0x0f; //此时P2=00001111,假若S1按下,则P2口数据变成 if(key_port != 0x0f) //00001110(不懂可参考上一课),此时满足if条件 { for(row = 0; row < 4; row++) //第一次循环 row = 0 { key_port = ~(0x10 << row); //即key_port =P2 = 11101111,因为S1按下了,故 for(col = 0; col < 4; col++) //key_port =P2 = 11101110 { //第一次循环 col = 0 ok = !(key_port & (0x01 << col)); //故ok = !(11101110&00000001)=1 if(ok) //满足if条件 { delay5ms(); if(ok) key_code = 4*col + row; //满足if条件 得到key_code =4*0 + 0=0 } //故得到S1对应的键值为0 } //大家可以依次类推得到S2,S3,S4...的键值 } return (key_code); //返回得到的键值 }}
/*--------------------------------------------------------------*///主函数void main(void){ while(1) { P1 = ~key_scan(); //显示按键键值 }}
1、本节重点。观念:当有按键按下对于单片机来说时间是很长的。
2、对比上节课的程序来说,实现同样的功能,但这节可的代码却减少了很多!希望大家能体会的算法的魅力!
相关程序:https://static.assets-stash.eet-china.com/album/old-resources/2009/6/2/48f4c0f2-d6b5-41f0-8ea8-63e60e62ffe3.rar
发布
用户602342 2009-6-13 13:24