第十九课 按键之五 矩阵按键之查表扫描
程序讲解(矩阵按键头文件)
/*--------------------------------------------------------------*/
//4*4矩阵键盘的设计
//Time: 21:04 2009-4-28
/*--------------------------------------------------------------*/
#ifndef __Key_Board_H__
#define __Key_Board_H__
/*--------------------------------------------------------------*/
//键盘接口定义
#define key_port P2
/*--------------------------------------------------------------*/
//键盘键值码 可根据实际情况更改
unsigned char code key_table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
/*--------------------------------------------------------------*/
//延时5000+0us 函数定义
void delay5ms(void)
{
unsigned char i,j;
for(i=185;i>0;i--)
for(j=12;j>0;j--);
}
/*--------------------------------------------------------------*/
//键盘查表扫描
unsigned char key_scan(void)
{
unsigned char i, key_code;
key_port = 0x0f; //此时 key_port = P2=00001111,S1按下,数据变成00001110
if(key_port != 0x0f) //key_port = P2=00001110满足if条件
{
delay5ms(); //延时消斗
if(key_port != 0x0f) //再次判断
{
key_code = key_port; //数据暂存key_code = key_port=00001110
key_port = 0xf0; //此时 key_port = P2=11110000,S1按下,数据变成11100000
key_code |= key_port; //key_code = 00001110 | 11100000=11101110 即 0xee
for(i = 0; i < 16; i++) //判断key_code=0xee对应key_table 的哪个数,即用i标记
{ //对应的按键
if(key_table == key_code) break; //取出按下S1产生的数据对应的key_table
} //表中的i
while(key_port != 0xf0);
}
}
return (i); //返回按下S1对应的i值
}
/*--------------------------------------------------------------*/
#endif
本节重点
1、和选择法大同小异,但较之精简!
文章评论(0条评论)
登录后参与讨论