MSP430键盘程序[中断方式]

2008年01月01日 11:51    发布者:MSP430
// 此示例程序为中断方式,得到键盘的键值,存放在队列keybuff[10]中 // 此示例程序没有显示, // 键盘的按键按下引起P1口的中断服务程序,得到键盘的键值,保存到键值队列 // 在其他的中断服务程序中通过键值队列中的数据引导程序的流程 #include 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(); } }