矩阵键盘

硬件连接:P2:4*4矩阵键盘,行接低四位,列接高四位

扫描方法:线反转法 

即先给P2赋值0x0f,当有按键按下后,P2的低四位必然有一位可检测到高电平,此时用if 可确定是哪一位,从而确定了被按下按键的行数

然后给P2赋值0xf0,同理,按键按下后,高四位中有一位可检测到高电平,于是便确定了列数。  行和列唯一确定了哪个按键被按下。

(用去抖延时,可避免因按键的微弱抖动造成检测误差, 什么?不知道何为去抖延时?百度吧少年···)


下面的demo稍显复杂,待日后有空补上个通俗点的


/*----------------------------------------------------------------------- 
keyxy  : 判定硬件编号 
            根据硬件连接而定 
输入参数:xx    :4位二进制; 
-----------------------------------------------------------------------*/  
  
uchar keyxy(uchar xx)  
{  
    uchar ans;  
    switch(xx)  
    {  
            case 0x07:ans=3;break;  
            case 0x0b:ans=2;break;  
            case 0x0d:ans=1;break;  
            case 0x0e:ans=0;break;  
    }  
    return ans;  
}  
  
/*----------------------------------------------------------------------- 
keyscan  : 矩阵键盘扫描 
返回值   :0-15  精确扫描,必须有键按下,且松开的时候返回 
-----------------------------------------------------------------------*/  
  
uchar keyscan()  
{  
    uchar h, l;  
    P2=0x0f;  
    while(1)  
    {  
            while(P2==0x0f);  
                delay_nms(8);//去抖  
                if(P2!=0x0f)  
                {  
                h=keyxy(P2);  
                P2=0xf0;  
                l=keyxy(P2/16);  
                while(P2!=0xf0);//松手检测  /待调研/  
                return 4*h+l;                 
                }  
     }  
}   
  
  
/*----------------------------------------------------------------------- 
lzkeyscan  : 矩阵键盘扫描 
返回值   :0-15   懒惰扫描,每次按键抖动之后返回。(默认99) 
-----------------------------------------------------------------------*/  
uchar lzkeyscan()  
{  
    uchar h, l, s = 99;  
    P2=0x0f;  
    if(P2!=0x0f)  
    {  
        delay_nms(8);//去抖  
        if(P2!=0x0f)      
        {  
            h=keyxy(P2);  
            P2=0xf0;  
            l=keyxy(P2/16);  
            s=4*h+l;  
        }  
    }  
    return s;  
}   


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值