天天看點

MSP430按鍵中斷

#include<msp430f149.h>

typedef unsigned char uchar;
typedef unsigned int uint;
#define keyin (P1IN & 0X0F)
#define wei_h P5OUT |= BIT5
#define wei_l P5OUT &= BIT5
#define duan_l P6OUT &= ~BIT6
#define duan_h P6OUT |= BIT6

uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num = 0;

void delay(int z)
{
  int i,j;
  for(i=z;i>0;i--)
    for(j=112;j>0;j--);
}

void display(uchar dat)
{
  P4OUT = table[dat];
  duan_h;
  duan_l;
  P4OUT = 0x00;
  wei_h;
  wei_l;
}

void main( void )
{
  uchar temp,keyval;
//  P1DIR = 0XFF;P1OUT = 0XFF;
  P2DIR = 0XFF;P2OUT = 0XFF;
  P3DIR = 0XFF;P3OUT = 0XFF;
  P4DIR = 0XFF;P4OUT = 0XFF;
  P5DIR = 0XFF;P5OUT = 0XFF;
  P6DIR = 0XFF;P6OUT = 0XFF;
  P1DIR = 0XF0;
  int num = 0;
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  while(1)
  {
    if(keyin != 0x0f)
    {
      delay(5);
      if(keyin != 0x0f)
      {
        temp = keyin;
        while(keyin != 0x0f);//松手檢測
        switch(temp)
        {
/* 1       case 0x0e: keyval = 1;display(keyval);break;
        case 0x0d: keyval = 2;display(keyval);break;
        case 0x0b: keyval = 3;display(keyval);break;
        case 0x07: keyval = 4;display(keyval);break;
        default: keyval = 8;display(keyval);break; */
/* 2       case 0x0d: num++;if(num==16)num=0;display(num);break;
        case 0x0b: num--;if(num==0)num=15;display(num);break;*/
        }
      }
    }
  }

}