单片机之按键检测

按键思维导图

独立按键电路:

独立按键电路

独立按键编程:

一个独立按键和单片机的一个I/O口连接,当按键按下时,对应I/O口由高电平变为低电平
sbit key=P1^0;
 if(key==0)
{
    delay(15ms);
    if(key==0)//消除按键抖动
    {

        功能代码块

    }

}

矩阵式按键电路:

矩阵式按键电路图

通过八个I/0口控制16个按键

44列
列线P1^0-P1^3,行线P1^4-P1^7
用定时器T0中断控制按键扫描

P1=0X0F;
uchar k,flag;

keycode()//扫描按下键的列线,列线值存在k中
{
    flag=P1&0x0f;//如果扫描的不是按键所在的行,则flag=0x0f,若是按键所在的行,则该语句可将所在列取出,存入k中,和中断函数中的 P1=0x7f,_cror_(P1,1)配合使用
    if(flag!=0x0f)
    {
        switch(flag)
        {
            case 0x07:k=1;break;
            case 0x0b:k=2;break;
            case 0x0d:k=3;break;
            case 0x0e:k=4;break;
         }
    }
}

void timer0() interrupt 1
{
uchar m;
P1=0x0f;//行线置低,列线置高
    if((P1&0x0f)!=0x0f)
        {
            delay(15ms)
                 if((P1&0x0f)!=0x0f)//判断是否有按键按下
            for(m=0;m<4;m++)//如果有按键按下,进入行线扫描
                {
                    P1=0x7f;//第一条行线置低
                    delay(5ms);
                    keycode();//进入列线扫描函数,若该行的4列均没有按键按下,则k为初始值0
                    t=k+4*m;
                    if(k!=0) goto L1;//K!-0时,说明已找到对应按键,跳转
                    P1=_cror_(P1,1);//
                 }
         }    

L1: P1=0x0f;k=0;//找到按键之后,行线置低,列线置高
while((P1&0x0f)!=0x0f);//若按键没有释放,循环等待
TH0=---;
TL0=---;
}

发布了4 篇原创文章 · 获赞 4 · 访问量 80

猜你喜欢

转载自blog.csdn.net/a_chengpp/article/details/104742029