分享个MSP430矩阵键盘反转扫描程序

楼主
分享个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]
1楼
[P]谢谢楼主分享,能否编辑原贴上传一个直观的键阵列部分的电路呢?要配合起来看才比较好理解。[/P][P]再问“[B]反转扫描[/B]”是啥意思?[/P]
2楼
[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]

电脑版 Page created in 0.1094 seconds width 2 queries.