在线情况
楼主
  • 头像
  • 级别
    • 积分15
    • 经验505
    • 文章16
    • 注册2011-09-08
    分享个MSP430矩阵键盘反转扫描程序
    与平时的矩阵键盘扫描方法基本相似,扫描按键识别的过程如下。
       1)、判断键盘中是否有按键按下。将I/O口输出0xf0,然后读I/O口状态。只要读回值不等于0xf0,则说明有键按下并且保存读回值(实际编程时,还要考虑按键的消抖)。如读回值等于0xf0,则表示无键按下。

       2)、判断闭合键所在位置。在确认有键按下后,即可进入确定具体哪个键按下的过程。其思路是:将I/O口输出0x0f,然后读I/O口状态并且保存读会值,将两次的读回值相或就得到闭合按键的位置。

       所谓“反转扫描”是根据扫描按键时,按键所在I/O口输出值由0xf0转为0x0f而得名。

    [P][CODE]uchar flag;
    uchar keycode[16]={
           0xee,0xde,0xbe,0x7e,
           0xed,0xdd,0xbd,0x7d,
           0xeb,0xdb,0xbb,0x7b,
           0xe7,0xd7,0xb7,0x77,        
        };//矩阵键盘按键码
    unsigned char key_done() //按键反转法扫描
    {
      unsigned char row,col,i,k=16;
      flag=0;
      P4DIR=0xf0;
      P4OUT=0x0f;
      if((P4IN&0x0f)!= 0x0f)
      {
        delay1ms(5);
        if((P4IN&0x0f)!= 0x0f)
        {
         
          col=P4IN&0x0f;
          P4DIR=0x0f;
          P4OUT=0xf0;
          row=P4IN&0xf0;
          for(i=0; i<16; i++)
          {
           if((row|col)==keycode[I])
           {
             k=i;
             flag=1;
             break;
           }
          }
        }
        P4DIR=0xf0;
        P4OUT=0x0f;
        while((P4IN&0x0f)!=0x0f);
      }
      return k;
    }
    [/CODE]
    [/P][P][/P][P]注意:矩阵键盘行线、列线均要接上拉电阻。[/P][P]原理图:[FACE=宋体][SIZE=10px] [/FACE][/SIZE]
    [upload=2085,0]4x4.png[/upload][/P]
    [ 此贴最后由DC在2011-9-22 12:39:29编辑过 ]
    MSP430忠实粉丝!
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    [P]谢谢楼主分享,能否编辑原贴上传一个直观的键阵列部分的电路呢?要配合起来看才比较好理解。[/P][P]再问“[B]反转扫描[/B]”是啥意思?[/P]
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分15
      • 经验505
      • 文章16
      • 注册2011-09-08
      [SIZE=4]与平时的矩阵键盘扫描方法基本相似,[/SIZE][LINE-HEIGHT=150%][FACE=宋体][SIZE=12pt]扫描按键识别的过程如下。[/SIZE][/FACE][/LINE-HEIGHT][P][LINE-HEIGHT=150%][LINE-HEIGHT=150%][FACE=宋体][SIZE=12pt]    [/SIZE][/FACE][/LINE-HEIGHT]1)、判断键盘中是否有按键按下。将I/O口输出0xf0,然后读I/O口状态。只要读回值不等于0xf0,则说明有键按下并且保存读回值(实际编程时,还要考虑按键的消抖)。如读回值等于0xf0,则表示无键按下。[/LINE-HEIGHT][/P][P][LINE-HEIGHT=150%][LINE-HEIGHT=150%][FACE=宋体][SIZE=12pt]    [/SIZE][/FACE][/LINE-HEIGHT]2)、判断闭合键所在位置。在确认有键按下后,即可进入确定具体哪个键按下的过程。其思路是:将I/O口输出0x0f,然后读I/O口状态并且保存读会值,将两次的读回值相或就得到闭合按键的位置。[/LINE-HEIGHT][/P][P][LINE-HEIGHT=150%][LINE-HEIGHT=150%][FACE=宋体][SIZE=12pt]    所谓“反转扫描”是根据扫描按键时,按键所在I/O口输出值由0xf0转为0x0f而得名。[/SIZE][/FACE][/LINE-HEIGHT][/LINE-HEIGHT][/P]
      MSP430忠实粉丝!
      Powered by LeadBBS 9.2 .
      Page created in 0.2500 seconds with 5 queries.