// 此示例程序为中断方式,得到键盘的键值,存放在队列keybuff[10]中
// 此示例程序没有显示,
// 键盘的按键按下引起P1口的中断服务程序,得到键盘的键值,保存到键值队列
// 在其他的中断服务程序中通过键值队列中的数据引导程序的流程
#include <msp430x14x.h>
unsigned char keybuff[10];
unsigned char keypoint=0;
void delay(int v)
 {
 while(v!=0)v--;
 }
unsigned char key(void)
 {
 unsigned char x=0xff;
 P1DIR=0X0F;
 P1OUT=0X01; //扫描第一行
 if((P1IN&0X70)==0X10)
 x=0;
 else
 if((P1IN&0X70)==0X20)
 x=1;
 else
 if((P1IN&0X70)==0x40)
 x=2;
 else
 {
 P1OUT=0X2; //扫描第二行
 if((P1IN&0X70)==0X10)
 x=3;
 else
 if((P1IN&0X70)==0X20)
 x=4;
 else
 if((P1IN&0X70)==0x40)
 x=5;
 else
 {
 P1OUT=0X4; //扫描第三行
 if((P1IN&0X70)==0X10)
 x=6;
 else
 if((P1IN&0X70)==0X20)
 x=7;
 else
 if((P1IN&0X70)==0x40)
 x=8;
 else
 {P1OUT=8; //扫描第四行
 if((P1IN&0X70)==0X10)
 x=9;
 else
 if((P1IN&0X70)==0X20)
 x=10;
 else
 if((P1IN&0X70)==0x40)
 x=11;
 }
 }
 }
 return(x);
 }
unsigned char keyj(void)
 {unsigned char x;
 P1DIR=0x0f;
 P1OUT=0x0f; //键盘硬件:P10--P13为行线,最上面一根为P10
 x=(P1IN&0X70); // P14--P16为列线,最左边一根为P14,列线下拉
 return(x); // 无按键,返回 0?; 有按键返回 非0
 }
interrupt[PORT1_VECTOR] void port1key(void)
 {
 if(keyj()!=0X00)
 {
 delay(300) ; //消抖动
 if(keyj()!=0X0)
 {
 keybuff[keypoint]=key(); //按键见键值保存到队列
 keypoint++; //
 if(keypoint==10)
 keypoint=0;
 }
 }
 P1OUT=0X0F;
 P1IFG=0X0; //清除中断标志
 }
void main(void)
{
 WDTCTL = WDTPW + WDTHOLD; /* // Stop WDT */
 P1DIR=0XF;
 P1OUT=0XF;
 P1IES=0X0;
 P1IE=0X70; //列线上升沿允许P1中断
 _EINT(); /*/ Enable interrupts */
 while(1)
 {
 LPM0;
 _NOP();
 }
}