第十八课 按键之四 矩阵按键之算法
程序讲解
/*--------------------------------------------------------------*/
//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