⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dm642_key.c

📁 430单片机键盘扫描源码
💻 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 + -