矩阵键盘

本文介绍了一种使用8个IO口实现16个按键检测的方法,通过两种不同的扫描函数实现矩阵键盘的有效识别,并提供了具体的编码及去抖处理过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

矩阵键盘

它用8个IO口实现了16个按键的扫描检测,实现了IO口更充分的利用。
这里写图片描述

unsigned char code keycode[]={
0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77
};        //矩阵键盘编码
根据按键返回相应的值

方法一

unsigned char keyscan1()//4*4矩阵按键扫描函数:(要去抖)扫描哪个键被按下。若有按键按下,返回对应的按键值(0-15),否则返回16
{ unsigned char i=16,hang,temp;//初值设置为16,目的是:没有按键按下时返回16;若不设初值(默认值为0),没有按键按下时,将返回0,会显示0,误认为0被按下  
  P3=0x0f;//列输出全0,行输出全1
  temp=P3;//读行列输入
  if(temp!=0x0f) //若无按键按下,输入仍为0x0f;若有按键按下对应行输入变为0,其他不变
    { delay(10);//去抖
      temp=P3;//再次读行列输入
      if(temp!=0x0f)
          //根据temp的值可知哪一行有按键按下,然后送对应的行扫描信号
          //若第一行有按键按下temp=00001110,第一行行扫描信号hang=11111110
          //若第二行有按键按下temp=00001101,第一行行扫描信号hang=11111101
          //若第三行有按键按下temp=00001011,第一行行扫描信号hang=11111011
          //若第四行有按键按下temp=00000111,第一行行扫描信号hang=11110111
         { hang=temp^0xf0;
           P3=hang;//输出行扫描信号
           temp=P3;//读行列输入
           for(i=0;i<16;i++)
               if(temp==keycode[i]) break;    
           P3=0x0f;//等待按键释放
           while((temp=P3)!=0x0f);
         }   
    }
  return(i);
}

方法二

unsigned char keyscan2()//4*4矩阵按键扫描函数:(要去抖)扫描哪个键被按下。若有按键按下,返回对应的按键值(0-15),否则返回16
{ unsigned char i=16,j,hang,lie,temp;//初值设置为16,目的是:没有按键按下时返回16;若不设初值(默认值为0),没有按键按下时,将返回0,会显示0,误认为0被按下 
  P3=0x0f;//列输出全0,行输出全1
  temp=P3;//读行列输入
  if(temp!=0x0f) //若无按键按下,输入仍为0x0f;若有按键按下对应行输入变为0,其他不变
    { delay(10);//去抖
      temp=P3;//再次读行列输入
      if(temp!=0x0f)//有键按下
       //进行行列扫描
          { for(i=0,hang=0xfe;i<=3;i++,hang=_crol_(hang,1))
              { P3=hang;//输出行扫描信号hang,依次为:111111110、11111101、11111011、11110111
                temp=P3;//读行列输入
                for(j=0,lie=0x10;j<=3;j++,lie=lie<<1)//列扫描:扫描第i行第j列是否被按下             
                   if(temp==(hang^lie)) break;   //hang^lie(00010000、00100000、01000000、10000000)依次将行扫描信号对应的各列信号取反,比对是否为该列有按键按下
                if(j<4) break;//若找到,结束扫描,否则继续扫描下一行    
              }
            P3=0x0f;//检测按键是否释放
            while((temp=P3)!=0x0f);
          }
     }
  if(i<4) return(4*i+j);//找到
  else return(16);//没找到
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值