原创 第十九课 按键之五 矩阵按键之查表扫描

2009-6-2 16:41 5334 10 10 分类: MCU/ 嵌入式

第十九课 按键之五 矩阵按键之查表扫描


点击开大图


程序讲解(矩阵按键头文件)


/*--------------------------------------------------------------*/
//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条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条