打印
[MSP430]

请教一下我写的这个中断扫描矩阵键盘的程序为什么只扫描出第一行

[复制链接]
1716|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
黄德志|  楼主 | 2013-12-3 13:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<msp430g2553.h>
#define flag (P1IN&0Xf0)

unsigned char keybuf;

void delay()
{
  unsigned int i;
  for(i=0;i<500;i++);
}

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P1SEL=0;
  P3SEL=0;
  P3DIR|=0xff;//设置P3为输出方向,接LED灯
  P3OUT|=0xff;//输出高电平
  P1DIR=0x0f;//设置P1.0-P1.3为输出方向,矩阵键盘行线;P1.4-P1.7为输入方向,矩阵键盘列线
  P1REN=0xf0;
  //P1OUT=0xf0;
  P1IE=0Xf0;//设置P1.4-P1.7可以中断
  P1IES=0xf0;//设置P1.4-P1.7位下降沿中断
  P1IFG =0; // P1中断标志位清零  
  _EINT();
  while(1);
}

unsigned char keycode()
{
  unsigned char k;
  P1OUT=0xfe;//扫描第一行
  if(flag==0xe0)//是否第一个按键
    k=1;
  else if(flag==0xd0)//是否第二个按键
    k=2;
  else if(flag==0xb0)//是否第三个按键
    k=3;
  else if(flag==0x70)//是否第四个按键
    k=4;
  else
  {
    P1OUT=0xfd;//扫描第二行
    if(flag==0xe0)//是否第5个按键
      k=5;
    else if(flag==0xd0)//是否第6个按键
      k=6;
    else if(flag==0xb0)//是否第7个按键
      k=7;
    else if(flag==0x70)//是否第8个按键
       k=8;
      else
      {
        P1OUT=0xfb;
        if(flag==0xe0)//是否第9个按键
          k=9;
        else if(flag==0xd0)//是否第10个按键
          k=10;
        else if(flag==0xb0)//是否第11个按键
          k=11;
        else if(flag==0x70)//是否第12个按键
           k=12;
        else
        {
          P1OUT=0xf7;
          if(flag==0xe0)//是否第13个按键
            k=9;
          else if(flag==0xd0)//是否第14个按键
            k=10;
          else if(flag==0xb0)//是否第15个按键
            k=11;
          else if(flag==0x70)//是否第16个按键
             k=12;
        }
      }
    }
  return k;
}

#pragma vector=PORT1_VECTOR
__interrupt void p1int()
{
  delay();
  while(flag!=0xf0)//没有键按下,返回0xf0
  {
    delay();//延时消抖
    while(flag!=0xf0)
    {
      keybuf=keycode();//确信有按键按下,找按键的键值,送到全局变量keybuf
      switch(keybuf)
      {
        case 1 :P3OUT&=~BIT0;break;//点亮LED0
        case 2 :P3OUT&=~BIT1;break;//点亮LED1
        case 3 :P3OUT&=~BIT2;break;//点亮LED2
        case 4 :P3OUT&=~BIT3;break;//点亮LED3
        case 5 :P3OUT&=~BIT4;break;//点亮LED4
        case 6 :P3OUT&=~BIT5;break;//点亮LED5
        case 7 :P3OUT&=~BIT6;break;//点亮LED6
        case 8 :P3OUT&=~BIT7;break;//点亮LED7
        case 9 :P3OUT&=~BIT0;break;//点亮LED0
        case 10 :P3OUT&=~BIT1;break;//点亮LED1
        case 11 :P3OUT&=~BIT2;break;//点亮LED2
        case 12 :P3OUT&=~BIT3;break;//点亮LED3
        case 13 :P3OUT&=~BIT4;break;//点亮LED4
        case 14 :P3OUT&=~BIT5;break;//点亮LED5
        case 15 :P3OUT&=~BIT6;break;//点亮LED6
        case 16 :P3OUT&=~BIT7;break;//点亮LED7
        default :P3OUT=0xff;break;
      }   
    delay();
    P3OUT=0xff;  
  }
}
P1IFG &= ~0xFF;//中断标志清零
}

相关帖子

沙发
黄德志|  楼主 | 2013-12-3 13:09 | 只看该作者
#include<msp430g2553.h>
#define flag (P1IN&0Xf0)

unsigned char keybuf;

void delay()
{
  unsigned int i;
  for(i=0;i<500;i++);
}

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P1SEL=0;
  P3SEL=0;
  P3DIR|=0xff;//设置P3为输出方向,接LED灯
  P3OUT|=0xff;//输出高电平
  P1DIR=0x0f;//设置P1.0-P1.3为输出方向,矩阵键盘行线;P1.4-P1.7为输入方向,矩阵键盘列线
  P1REN=0xf0;
  //P1OUT=0xf0;
  P1IE=0Xf0;//设置P1.4-P1.7可以中断
  P1IES=0xf0;//设置P1.4-P1.7位下降沿中断
  P1IFG =0; // P1中断标志位清零  
  _EINT();
  while(1);
}

unsigned char keycode()
{
  unsigned char k;
  P1OUT=0xfe;//扫描第一行
  if(flag==0xe0)//是否第一个按键
    k=1;
  else if(flag==0xd0)//是否第二个按键
    k=2;
  else if(flag==0xb0)//是否第三个按键
    k=3;
  else if(flag==0x70)//是否第四个按键
    k=4;
  else
  {
    P1OUT=0xfd;//扫描第二行
    if(flag==0xe0)//是否第5个按键
      k=5;
    else if(flag==0xd0)//是否第6个按键
      k=6;
    else if(flag==0xb0)//是否第7个按键
      k=7;
    else if(flag==0x70)//是否第8个按键
       k=8;
      else
      {
        P1OUT=0xfb;
        if(flag==0xe0)//是否第9个按键
          k=9;
        else if(flag==0xd0)//是否第10个按键
          k=10;
        else if(flag==0xb0)//是否第11个按键
          k=11;
        else if(flag==0x70)//是否第12个按键
           k=12;
        else
        {
          P1OUT=0xf7;
          if(flag==0xe0)//是否第13个按键
            k=9;
          else if(flag==0xd0)//是否第14个按键
            k=10;
          else if(flag==0xb0)//是否第15个按键
            k=11;
          else if(flag==0x70)//是否第16个按键
             k=12;
        }
      }
    }
  return k;
}

#pragma vector=PORT1_VECTOR
__interrupt void p1int()
{
  delay();
  while(flag!=0xf0)//没有键按下,返回0xf0
  {
    delay();//延时消抖
    while(flag!=0xf0)
    {
      keybuf=keycode();//确信有按键按下,找按键的键值,送到全局变量keybuf
      switch(keybuf)
      {
        case 1 : P3OUT&=~BIT0;break;//点亮LED0
        case 2 : P3OUT&=~BIT1;break;//点亮LED1
        case 3 : P3OUT&=~BIT2;break;//点亮LED2
        case 4 : P3OUT&=~BIT3;break;//点亮LED3
        case 5 : P3OUT&=~BIT4;break;//点亮LED4
        case 6 : P3OUT&=~BIT5;break;//点亮LED5
        case 7 : P3OUT&=~BIT6;break;//点亮LED6
        case 8 : P3OUT&=~BIT7;break;//点亮LED7
        case 9 : P3OUT&=~BIT0;break;//点亮LED0
        case 10 : P3OUT&=~BIT1;break;//点亮LED1
        case 11 : P3OUT&=~BIT2;break;//点亮LED2
        case 12 : P3OUT&=~BIT3;break;//点亮LED3
        case 13 : P3OUT&=~BIT4;break;//点亮LED4
        case 14 : P3OUT&=~BIT5;break;//点亮LED5
        case 15 : P3OUT&=~BIT6;break;//点亮LED6
        case 16 : P3OUT&=~BIT7;break;//点亮LED7
        default : P3OUT=0xff;break;
      }   
    delay();
    P3OUT=0xff;  
  }
}
P1IFG &= ~0xFF;//中断标志清零
}

使用特权

评论回复
板凳
yc_2503| | 2013-12-13 12:18 | 只看该作者
else if(flag==0xb0)//是否第三个按键
    k=3;
  else if(flag==0x70)//是否第四个按键
    k=4;
  else                                             // 为么要用else啊  感觉问题就出在这里
  {
    P1OUT=0xfd;//扫描第二行
    if(flag==0xe0)//是否第5个按键
      k=5;
    else if(flag==0xd0)//是否第6个按键
      k=6;

使用特权

评论回复
地板
maxmilia| | 2013-12-13 13:04 | 只看该作者
去了else试试看吧

使用特权

评论回复
5
qawszxedr| | 2013-12-13 14:16 | 只看该作者
:P厉害!:P厉害!:P厉害!啊!

使用特权

评论回复
6
weizheng07| | 2013-12-13 15:57 | 只看该作者
本帖最后由 weizheng07 于 2013-12-13 15:58 编辑

unsigned char GetKeyNum(unsigned char OutData)
{
                unsigned char DataNum = 0x00;
               P1OUT |= 0xFF;
                P1OUT &=~(0x01<<(OutData-1));
               
                DataNum = P1IN&0xF0;
               
                if(DataNum != 0xf0)
                {
                        DataNum = DataNum | OutData;
                        }
                else
               
                 DataNum = 0x00;

        return DataNum;

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝