矩阵键盘扫描


uchar key_scan()//判断按键是否按下
{
    uchar x = 0;
    P30 = 1; P31 = 1; P32 = 1; P33 = 1;
    P44 = 0; P42 = 0; P35 = 0; P34 = 0;

    if ((P30 == 0) || (P31 == 0) || (P32 == 0) || (P33 == 0))
    {
        x = 1;
    }
    else
    {
        x = 0;
    }
    return x;
}

uchar h_l_go() //行列扫描
{
    uchar i, j;
    for (i = 1; i < 5; i++) {
        P3 = h_l[i];
        P42 = 1;
        P44 = 1;
        _nop_();
        _nop_();

        if (P34 == 0) 
        {
            Delay(10);
            if (P34 == 0) {
                j = 4;
                while (P34 == 0);
                return key_go1(i, j);
            }
        }
        else if (P35 == 0) 
        {
            Delay(10);
            if (P35 == 0) {
                j = 3;
                while (P35 == 0);
                return key_go1(i, j);
            }
        }
        else if (P42 == 0) 
        {
            Delay(10);
            if (P42 == 0) {
                j = 2;
                while (P42 == 0);
                return key_go1(i, j);
            }
        }
        else if (P44 == 0) 
        {
            Delay(10);
            if (P44 == 0) 
            {
                j = 1;
                while (P44 == 0);
                return key_go1(i, j);
            }
        }
    }
    return 0;
}

uchar key_go1(uchar i, uchar j)//行列扫描后要处理的事,
{
    uchar xx = 0;
    switch (i)
    {
        case 1:
        {
            switch (j)
            {
                case 1:
                {
                    xx = 1;
                    break;
                }
                case 2:
                {
                    xx = 2;
                    break;
                }
                case 3:
                {
                    xx = 3;
                    break;
                }
                case 4:
                {
                    xx = 4;
                    break;
                }
            }
            break;
        }
        case 2:
        {
            switch (j)
            {
                case 1:
                {
                    xx = 5;
                    break;
                }
                case 2:
                {
                    xx = 6;
                    break;
                }
                case 3:
                {
                    xx = 7;
                    break;
                }
                case 4:
                {
                    xx = 8;
                    break;
                }
            }
            break;
        }
        case 3:
        {
            switch (j)
            {
                case 1:
                {
                    xx = 9;
                    break;
                }
                case 2:
                {
                    xx = 10;
                    break;
                }
                case 3:
                {
                    xx = 11;
                    break;
                }
                case 4:
                {
                    xx = 12;
                    break;
                }
            }
            break;
        }
        case 4:
        {
            switch (j)
            {
                case 1:
                {
                    xx = 13;
                    break;
                }
                case 2:
                {
                    xx = 14;
                    break;
                }
                case 3:
                {
                    xx = 15;
                    break;
                }
                case 4:
                {
                    xx = 16;
                    break;
                }
            }
            break;
        }
    }
    return xx;
}

void key_go(uchar i)//按键按下做的事
{
    switch (i)
    {
        case 1:
        {
            break;
        }
        case 2:
        {
            break;
        }
        case 3:
        {
            break;
        }
        case 4:
        {
            break;
        }
        case 5:
        {
            break;
        }
        case 6:
        {
            break;
        }
        case 7:
        {
            break;
        }
        case 8:
        {
            break;
        }
        case 9:
        {
            break;
        }
        case 10:
        {
            break;
        }
        case 12:
        {
            break;
        }
        case 13:
        {
            break;
        }
        case 14:
        {
            break;
        }
        case 15:
        {    gomain1++;
            if(gomain1>=3)
            {gomain1=0;
        
            }
            break;
        }
        case 16:
        {
            break;
        }
    }
}

void key_togo()
{      
        if(key_scan())//有按键按下,按键检测
        {    key_shake++;//去抖时间累计处理。
        
        }
        
        else//没有按键按下,
        {
        key_shake=0;
        
        }

        if(key_shake==2)//短按
        {//这里加短按标志
                if(key_scan())
                {
                keynum=h_l_go();
                
                
                }
        key_go(keynum);
        
        }
        
        else
        {        if(key_shake>=150)长按
                    {
                    key_shake=151;
                    
                    
                    
                    }
        
        
        
        }
}

uchar key_scan()//判断按键是否按下
{

    uchar x = 0;
    P30 = 1; P31 = 1; P32 = 1; P33 = 1;
    P44 = 0; P42 = 0; P35 = 0; P34 = 0;

    if ((P30 == 0) || (P31 == 0) || (P32 == 0) || (P33 == 0))
    {

        x = 1;
    }
    else
    {

        x = 0;
    }
    return x;
}

uchar h_l_go() //行列扫描
{

    uchar i, j;
    for (i = 1; i < 5; i++) {

        P3 = h_l[i];
        P42 = 1;
        P44 = 1;
        _nop_();
        _nop_();

        if (P34 == 0) 
        {

            Delay(10);
            if (P34 == 0) {

                j = 4;
                while (P34 == 0);
                return key_go1(i, j);
            }
        }
        else if (P35 == 0) 
        {

            Delay(10);
            if (P35 == 0) {

                j = 3;
                while (P35 == 0);
                return key_go1(i, j);
            }
        }
        else if (P42 == 0) 
        {

            Delay(10);
            if (P42 == 0) {

                j = 2;
                while (P42 == 0);
                return key_go1(i, j);
            }
        }
        else if (P44 == 0) 
        {

            Delay(10);
            if (P44 == 0) 
            {

                j = 1;
                while (P44 == 0);
                return key_go1(i, j);
            }
        }
    }
    return 0;
}

uchar key_go1(uchar i, uchar j)//行列扫描后要处理的事,
{

    uchar xx = 0;
    switch (i)
    {

        case 1:
        {

            switch (j)
            {

                case 1:
                {

                    xx = 1;
                    break;
                }
                case 2:
                {

                    xx = 2;
                    break;
                }
                case 3:
                {

                    xx = 3;
                    break;
                }
                case 4:
                {

                    xx = 4;
                    break;
                }
            }
            break;
        }
        case 2:
        {

            switch (j)
            {

                case 1:
                {

                    xx = 5;
                    break;
                }
                case 2:
                {

                    xx = 6;
                    break;
                }
                case 3:
                {

                    xx = 7;
                    break;
                }
                case 4:
                {

                    xx = 8;
                    break;
                }
            }
            break;
        }
        case 3:
        {

            switch (j)
            {

                case 1:
                {

                    xx = 9;
                    break;
                }
                case 2:
                {

                    xx = 10;
                    break;
                }
                case 3:
                {

                    xx = 11;
                    break;
                }
                case 4:
                {

                    xx = 12;
                    break;
                }
            }
            break;
        }
        case 4:
        {

            switch (j)
            {

                case 1:
                {

                    xx = 13;
                    break;
                }
                case 2:
                {

                    xx = 14;
                    break;
                }
                case 3:
                {

                    xx = 15;
                    break;
                }
                case 4:
                {

                    xx = 16;
                    break;
                }
            }
            break;
        }
    }
    return xx;
}

void key_go(uchar i)//按键按下做的事
{

    switch (i)
    {

        case 1:
        {

            break;
        }
        case 2:
        {

            break;
        }
        case 3:
        {

            break;
        }
        case 4:
        {

            break;
        }
        case 5:
        {

            break;
        }
        case 6:
        {

            break;
        }
        case 7:
        {

            break;
        }
        case 8:
        {

            break;
        }
        case 9:
        {

            break;
        }
        case 10:
        {

            break;
        }
        case 12:
        {

            break;
        }
        case 13:
        {

            break;
        }
        case 14:
        {

            break;
        }
        case 15:
        {    gomain1++;
            if(gomain1>=3)
            {gomain1=0;
        
            }
            break;
        }
        case 16:
        {

            break;
        }
    }
}

void key_togo()
{      
        if(key_scan())//有按键按下,按键检测
        {    key_shake++;//去抖时间累计处理。
        
        }
        
        else//没有按键按下,
        {

        key_shake=0;
        
        }

        if(key_shake==2)//短按
        {//这里加短按标志
                if(key_scan())
                {

                keynum=h_l_go();
                
                
                }
        key_go(keynum);
        
        }
        
        else
        {        if(key_shake>=150)长按
                    {

                    key_shake=151;
                    
                    
                    
                    }
        
        
        
        }
}

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容