#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;//中断标志清零
}
|