打印
[MSP430]

麻烦各位大神们帮我看看这个中断扫描矩阵键盘程序为什么实现不了

[复制链接]
1635|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
黄德志|  楼主 | 2013-12-1 16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<msp430g2553.h>

#include "in430.h"

void init_plint();

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;
  init_plint();
  _EINT();
}
void init_plint()
{
   
   P1IE=0Xf0;//设置P1.4-P1.7可以中断
   P1IES=0xf0;//设置P1.4-P1.7位下降沿中断
   P1IFG =0; // P1中断标志位清零  
}
unsigned char p1keyj()
{
  unsigned char i;
  i=P1IN^0xf0;//P1.4-P1.7接有按键
  return i;
}

unsigned char keycode()
{
  unsigned char k;
  if(p1keyj()==0x10)//是否第一个按键
     k=1;
  else if((p1keyj())==0x20)//是否第二个按键
       k=2;
      else if((p1keyj()<<2)==0x40)//是否第三个按键
            k=3;
           else if((p1keyj())==0x80)//是否第四个按键
                 k=4;
                else  k=0;
  return k;
}

#pragma vector=PORT1_VECTOR
__interrupt void p1int()
{
  _DINT();    //关中断
  P1IFG &= ~0xFF;
  delay();
  while(p1keyj()!=0x00)//没有键按下,返回1--0x00
  {
    delay();//延时消抖
    while(p1keyj()!=0x00)
    {
      keybuf=keycode();//确信有按键按下,找按键的键值,送到全局变量keybuf
      while(p1keyj()==0x00)//等待按键松开
      {
        switch(keybuf)
        {
          case 1:P3OUT&=~BIT0;//点亮LED0
          case 2:P3OUT&=~BIT1;//点亮LED1
          case 3:P3OUT&=~BIT2;//点亮LED2
          case 4:P3OUT&=~BIT3;//点亮LED3
        }
      }   
    }
  }
   
}

相关帖子

沙发
黄德志|  楼主 | 2013-12-1 16:46 | 只看该作者
本帖最后由 黄德志 于 2013-12-1 16:48 编辑

#include<msp430g2553.h>

#include "in430.h"

void init_plint();

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;
  init_plint();
  _EINT();
}
void init_plint()
{
   
   P1IE=0Xf0;//设置P1.4-P1.7可以中断
   P1IES=0xf0;//设置P1.4-P1.7位下降沿中断
   P1IFG =0; // P1中断标志位清零  
}
unsigned char p1keyj()
{
  unsigned char i;
  i=P1IN^0xf0;//P1.4-P1.7接有按键
  return i;
}

unsigned char keycode()
{
  unsigned char k;
  if(p1keyj()==0x10)//是否第一个按键
     k=1;
  else if((p1keyj())==0x20)//是否第二个按键
       k=2;
      else if((p1keyj()<<2)==0x40)//是否第三个按键
            k=3;
           else if((p1keyj())==0x80)//是否第四个按键
                 k=4;
                else  k=0;
  return k;
}

#pragma vector=PORT1_VECTOR
__interrupt void p1int()
{
  _DINT();    //关中断
  P1IFG &= ~0xFF;
  delay();
  while(p1keyj()!=0x00)//没有键按下,返回1--0x00
  {
    delay();//延时消抖
    while(p1keyj()!=0x00)
    {
      keybuf=keycode();//确信有按键按下,找按键的键值,送到全局变量keybuf
      while(p1keyj()==0x00)//等待按键松开
      {
        switch(keybuf)
        {
          case 1 :  P3OUT&=~BIT0;//点亮LED0
          case 2 :  P3OUT&=~BIT1;//点亮LED1
          case 3 :  P3OUT&=~BIT2;//点亮LED2
          case 4 :  P3OUT&=~BIT3;//点亮LED3
        }
      }   
    }
  }
   
}

使用特权

评论回复
板凳
黄德志|  楼主 | 2013-12-1 16:47 | 只看该作者
#include<msp430g2553.h>

#include "in430.h"

void init_plint();

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;
  init_plint();
  _EINT();
}
void init_plint()
{
   
   P1IE=0Xf0;//设置P1.4-P1.7可以中断
   P1IES=0xf0;//设置P1.4-P1.7位下降沿中断
   P1IFG =0; // P1中断标志位清零  
}
unsigned char p1keyj()
{
  unsigned char i;
  i=P1IN^0xf0;//P1.4-P1.7接有按键
  return i;
}

unsigned char keycode()
{
  unsigned char k;
  if(p1keyj()==0x10)//是否第一个按键
     k=1;
  else if((p1keyj())==0x20)//是否第二个按键
       k=2;
      else if((p1keyj()<<2)==0x40)//是否第三个按键
            k=3;
           else if((p1keyj())==0x80)//是否第四个按键
                 k=4;
                else  k=0;
  return k;
}

#pragma vector=PORT1_VECTOR
__interrupt void p1int()
{
  _DINT();    //关中断
  P1IFG &= ~0xFF;
  delay();
  while(p1keyj()!=0x00)//没有键按下,返回1--0x00
  {
    delay();//延时消抖
    while(p1keyj()!=0x00)
    {
      keybuf=keycode();//确信有按键按下,找按键的键值,送到全局变量keybuf
      while(p1keyj()==0x00)//等待按键松开
      {
        switch(keybuf)
        {
          case 1 : P3OUT&=~BIT0;//点亮LED0
          case 2 : P3OUT&=~BIT1;//点亮LED1
          case 3 : P3OUT&=~BIT2;//点亮LED2
          case 4 : P3OUT&=~BIT3;//点亮LED3
        }
      }   
    }
  }
   
}

使用特权

评论回复
地板
ayb_ice| | 2013-12-2 11:08 | 只看该作者
中断里居然还
等待按键松开

使用特权

评论回复
5
122541325| | 2013-12-2 14:28 | 只看该作者
中断里有问题

使用特权

评论回复
6
yangfan19641964| | 2013-12-2 15:14 | 只看该作者
if(p1keyj()==0x10)//是否第一个按键
     k=1;

感觉搞反了,应为:
if(p1keyj()==0xe0)//是否第一个按键
     k=1;

使用特权

评论回复
7
么么沫沫| | 2013-12-2 15:18 | 只看该作者
while(p1keyj()!=0x00)//没有键按下,返回1--0x00,//一直按的话,程序会不会死在中断里|?改成if应该会比较好吧

使用特权

评论回复
8
黄德志|  楼主 | 2013-12-2 21:49 | 只看该作者
yangfan19641964 发表于 2013-12-2 15:14
if(p1keyj()==0x10)//是否第一个按键
     k=1;

没反,按照你的灯都不亮。。。。

使用特权

评论回复
9
黄德志|  楼主 | 2013-12-2 21:58 | 只看该作者
ayb_ice 发表于 2013-12-2 11:08
中断里居然还
等待按键松开

有道理,谢谢!:handshake

使用特权

评论回复
10
黄德志|  楼主 | 2013-12-2 21:59 | 只看该作者
122541325 发表于 2013-12-2 14:28
中断里有问题

什么问题?求指教!

使用特权

评论回复
11
黄德志|  楼主 | 2013-12-2 22:00 | 只看该作者
么么沫沫 发表于 2013-12-2 15:18
while(p1keyj()!=0x00)//没有键按下,返回1--0x00,//一直按的话,程序会不会死在中断里|?改成if应该会比 ...

不是这样的。。。。。

使用特权

评论回复
12
黄德志|  楼主 | 2013-12-2 22:00 | 只看该作者
么么沫沫 发表于 2013-12-2 15:18
while(p1keyj()!=0x00)//没有键按下,返回1--0x00,//一直按的话,程序会不会死在中断里|?改成if应该会比 ...

不是这样的。。。。。

使用特权

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

本版积分规则

3

主题

11

帖子

0

粉丝