📄 dm642_key.c
字号:
#include "msp430x12x.h"
#include "KeyDefine.h"
short Error_Flag = 1;
unsigned int KeyHex=0;
void Set_For_Press(void);
void Debounce(void);
void KeyScan(void);
short KeyLookup(void);
void Wait_For_Release(void);
void SendKey(short KeyVal);
void main(void)
{
short KeyVal=0;
short EnF1,EnF2,EnF3,EnHook,EnMenu;
WDTCTL = WDTPW + WDTHOLD; //关闭Watchdog
P1DIR = 0xf0; //P1.0~P1.3为输入,P1.4~P1.8为输出
P2DIR = 0x20; //P2.5为输出,P2.0~P2.4为输入
P3DIR = 0xff; //P3为输出
P2OUT = 0x20;
P3OUT = 0xe0;
P1OUT = 0x10;
EnF1=1;
EnF2=0;
EnF3=0;
EnHook=1;
EnMenu=1;
_EINT(); //开中断
while(1)
{
Set_For_Press();
_BIS_SR(LPM4);
_NOP();
Debounce();
KeyScan();
if(Error_Flag!=NoKey)
{
KeyVal=KeyLookup();
if((KeyVal==20) && (EnHook==1))
{
P2OUT^=0x20;
KeyVal = 20+((P2OUT & 0x20)>>5);
EnF1^=0x1;
EnMenu^=0x1;
// EnF2^=0x1;
// EnF3^=0x1;
}
else if((KeyVal==13) && (EnF1==1))
{
P3OUT^=0x20;
KeyVal = 13+9*(((P3OUT & 0x20)>>5));
EnHook^=0x1;
EnMenu^=0x1;
// EnF2^=0x1;
// EnF3^=0x1;
}
else if((KeyVal==14) && (EnF2==1))
{
P3OUT^=0x40;
KeyVal = 14+9*(((P3OUT & 0x40)>>6));
EnHook^=0x1;
EnF1^=0x1;
EnF3^=0x1;
EnMenu^=0x1;
}
else if((KeyVal==15) && (EnF3==1))
{
P1OUT^=0x10;
KeyVal = 15+9*(((P1OUT & 0x10)>>4));
EnHook^=0x1;
EnF1^=0x1;
EnF2^=0x1;
EnMenu^=0x1;
}
else if((KeyVal==18) && (EnMenu==1))
{
EnF1=0;
EnF2=0;
EnF3=0;
EnHook=0;
}
SendKey(KeyVal);
Wait_For_Release();
}
}
}
void Set_For_Press(void)
{
P2DIR = 0x20; //P2.5为输出,P2.0~P2.4为输入
P3OUT = (P3OUT & 0xe0) | 0x9f;
P1IES = 0;
P1IFG = 0;
P1IE = BIT0+BIT1+BIT2+BIT3;
Error_Flag=0;
}
short KeyLookup(void)
{
short x,y,i;
short KeyTab[20]={7,4,1,13,11,8,5,2,14,10,9,6,3,15,12,19,18,17,20,16};
x=KeyHex & 0x1f;
y=(KeyHex & 0x0f00)>>8;
i=0;
do
{
x=x >>1;
if(x)
{
i++;
}
}while(x);
do
{
y=y >>1;
if(y)
{
i+=5;
}
}while(y);
_NOP();
return(KeyTab[i]);
}
void Wait_For_Release(void)
{
short Rcount;
do
{
Rcount =1;
KeyHex=KeyHex & 0x1f;
P3OUT|=KeyHex;
// P1DIR=0x00;
// P1OUT=0x00;
P1DIR=0xf0;
P1OUT &= 0x10;
P1IES=0x0f;
P1IFG=0;
P1IE=0x0f;
_BIS_SR(LPM4);
Debounce();
KeyScan();
}while (!(Error_Flag & NoKey));
Error_Flag=0;
}
void Debounce(void)
{
TACTL=TASSEL1+TACLR;
CCTL0 = CCIE;
CCR0 = 5125; //延迟40ms
TACTL |= MC1;
_BIS_SR(LPM0);
_NOP();
}
void SendKey(short KeyVal)
{
P2DIR=0x3f; //P2.0~P2.5为输出
P2OUT=KeyVal | (P2OUT & 0x20);
Debounce();
P3OUT =(P3OUT | 0x1f) & 0x7f;
}
interrupt[PORT1_VECTOR] void P1ISR(void)
{
LPM4_EXIT;
P1IFG=0;
}
interrupt[TIMERA0_VECTOR] void CCR0_ISR(void)
{
LPM0_EXIT;
TACTL=TACLR;
CCR0 += 5125;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -