矩阵键盘

P10~P13是4根设计成输出口的行线,P14~P17是4根设计成输入口的列线。如此的设计该怎样区别是什么按键被按下了呢?判断方法如下:

1. 扫描P10行:

a) 将P10~P13输出为0 、1、1、1

b) 读P14~P17这4个输入口的电平。如果S0~S3都没被按下,则因为P14~P17都是上拉到VCC,所以都为高;如果有1个被按下比如是S1,则因P10输出为低,所以S1开关导通后P16应为低;如果有2个按下比如是S1,S2,则P16与P17应为低。

c) 根据P14~P17的电平即可得知S0~S3中共有几个按键被按下。

2. 扫描P11行:

a) 将P10~P13输出为1 、0、1、1

b) 读P14~P17这4个输入口的电平。如果S4~S7都没被按下,则因为P14~P17都是上拉到VCC,所以都为高;如果有1个被按下比如是S5,则因P10输出为低,所以S5开关导通后P16应为低;如果有2个按下比如是S5,S6,则P16与P17应为低。

c) 根据P14~P17的电平即可得知S4~S7中共有几个按键被按下。

3. 扫描P12行:将P10~P13输出为1 、1、0、1,其他步骤同上。

4. 扫描P13行:将P10~P13输出为1 、1、1、0,其他步骤同上。

通过这4行的扫描,我们已经能够确定S0~S15这16个按键当前的状态了。

C语言实现如下:

void key_scan() //键盘扫描函数

{

     int i;

     unsigned char n, row, rowmask ;

    row = 1;

   for(i=0; i<4; i++) //共扫描4条行线

   {

      rowmask = ~(row<<i); //i=0时,rowmask=0xfe, i=1时rowmask=0xfd…

     P1=rowmask;

     n = P1;

     n &= 0xf0;

    if(n != 0xf0)

    {

        Delay();//防抖动

        P1=rowmask;

       n = P1;

       n &= 0xf0;

     if(n != 0xf0)

    {

     switch(n)

    {

         case 0xE0://S(3+i*4)按下

             break;

         case 0xD0://S(2+i*4)按下

              break;

         case 0xB0://S(1+i*4)按下

              break;

        case 0x70://S(0+i*4)按下

            break;

     }

     }

   }

  }

}

void Delay() //延时函数

{

int i,j;

for(i=0; i<100; i++)

{

for(j=0; j<100; j++);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值