#include "msp430x41x.h" #define KEY_IN P1DIR&=~0x3f #define KEY_IN_VALUE P1IN&0x3f #define KEY1 0x01 #define KEY2 0x02 #define KEY3 0x04 #define KEY4 0x08 #define KEY5 0x10 #define KEY6 0x20 #define Key_mask 0x00 #define No_key 0xff unsigned char Timer_keyFlag; /* 初始化KEY及LED端口 in: 无 out:无 */ void Init_key (void) { KEY_IN; } /* 读取判断按键值 in: 无 out:按键值 key_return */ unsigned char Read_key(void) { static unsigned char key_state = 0; static unsigned int key_value1,key_value; unsigned char key_return=No_key; if(Timer_keyFlag==1)//判断扫描KEY时间标志位 { Timer_keyFlag=0; //如果是N*N键盘方式,再次添加循环检测代码,检测有按键时,返回按键输入值,没有返回无按键 switch (key_state) { case 0: //判断是否有按键 { key_value=KEY_IN_VALUE; if(key_value==Key_mask)//无按键重新判断 { key_state=0; } else //有按键判断按键值 { key_state++; } break; } case 1://判断按键值 { key_value1=KEY_IN_VALUE; if(key_value1==Key_mask)//无按键重新判断 { key_state=0; } else if(key_value==key_value1)//有按键判断按键值是否与上一次读取值相等,相等判断按键值(可判断持续按键及组合键) { switch (key_value) { case KEY1: // { key_return = 1; break; } case KEY2: // { key_return = 2; break; } case KEY3: // { key_return = 3; break; } case KEY4: // { key_return = 4; break; } case KEY5: // { key_return = 5; break; } case KEY6: // { key_return = 6; break; } } } else//有按键与上一次读取值不等,等按键松开后重新判断 { key_state++; } break; } case 2://松开按键判断 { key_value=KEY_IN_VALUE; if(key_value==Key_mask) { key_state=0; } break; } } } return key_return; } /* TimerA0初始化 in: 定时时间vlaue //vlaue=2048 1/16 S out:无 */ void Init_TimerA0(unsigned int vlaue) { TACTL=TASSEL0+TACLR; //32K ACLK TACCTL0=CCIE; if(vlaue>32768) { vlaue=32768; } TACCR0=vlaue; TACTL|=MC0; } /* TimerA0中断 in: 无 out:无 */ #pragma vector=TIMERA0_VECTOR __interrupt void TimerA0(void) { Timer_keyFlag=1; } |
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) | Powered by Discuz! X3.4 |