找回密码
 注册
关于网站域名变更的通知
查看: 477|回复: 5
打印 上一主题 下一主题

四种4*4矩阵键盘的扫描方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-10-8 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
第一种:这种方法很容易理解,但是程序比较长。
    P2=0xfe;//给第一列送低电平
    temp=P2;
    temp=temp&0xf0;
    while(temp!=0xf0)
    {   
          delay(10); //去抖
         temp=P2;
         temp=temp&0xf0;
           while(temp!=0xf0)
           {   
               temp=P2;
               switch(temp)
                {       case 0xee:num=1;break;
                         case 0xee:num=2;break;
                         case 0xee:num=3;break;
                         case 0xee:num=4;break;
                 }
            while(temp!=0xf0)    //按键释放
             {
                  temp=P2;
                  temp=temp&0xf0;
             }   
         }
     }
然后再给第二、三、四列依次送低电平检查,也就是说再重复上边的程序四次
) n! E! o) i* X2 V& F
第二种
uchar keyscan(void)  
{
unsigned char cord_h,cord_l;
P2=0x0f;            //行线输出全为0
cord_h=P2&0x0f;     //读入列线值
if(cord_h!=0x0f)    //先检测有无按键按下
{
  delayms(10);        //去抖
  if((P2&0x0f)!=0x0f)
  {
    cord_h=P2&0x0f;  //读入列线值
   P2=cord_h|0xf0;  //输出当前列线值
   cord_l=P2&0xf0;  //读入行线值
   while((P2&0xf0)!=0xf0);//等待松开并输出
   return(cord_h+cord_l);//键盘最后组合码值
  }
}
return(0xff);     //返回该值
0 Y1 Z6 `- v9 t
第三种
uchar keyscan()                    
{
    uchar i=0,j=0,key;
    P2=0xf0;               // 高位拉高,低位拉低
    if(((~P2)&0xf0)!=0)
    {
        delay(10);
        if(((~P32&0xf0)!=0)
        {
            P2=0xfe;
            while(((~P2)&0x0f)!=0)        // 此语句保证只扫描四行
            {
                if(((~P2)&0xf0)!=0)
                {
                    switch((~P2)&0xf0)
                    {
                        case 0x10:
                            j=0;break;
                        case 0x20:
                            j=1;break;
                        case 0x40:
                            j=2;break;
                        case 0x80:
                            j=3;break;
                    }
                    return(4*i+j);
                }
                else
                {
                    P3=P3<<1;           //循环4次
                    i++;
                }
            }
        }
    }
    return (key) ;   
}
第四种
" z0 ]. e5 h! W" y5 a, z; F9 i4 fuchar keyscan(void) % p  r# q3 N3 g
{; ?5 V! p. `7 l6 @  e
    uchar code K_Tab[4][4] = {
5 A* e7 s* h' l6 o- {6 i! c          0xee, 0xde, 0xbe, 0x7e, 0xed, 0xdd, 0xbd, 0x7d,- X6 O4 Q" ]1 }2 ^
          0xeb, 0xdb, 0xbb, 0x7b, 0xe7, 0xd7, 0xb7, 0x77};
8 i, ]! ^& v% f) W3 T; E- P    uchar temp1 = 0xfe, temp2, i, j;  a: Q2 @" h9 r2 o+ }  ~- I1 D  _
    for(i = 0; i < 4; i++)
0 r: {' v8 E- ~& `  R7 ^. k  e, u    {          //扫描低四位4 _! ?; u' Y/ L3 k
        P3 = temp1;                     //输出一行0* |+ Q* X7 S1 V7 @+ J0 b
        temp2 = P3;                     //马上就读入
' a. x% y/ U! _9 E8 s  s% L% M, y        if((temp2 & 0xf0) != 0xf0)     //如果有键按下
5 l" X6 ^6 v! T        {
9 R5 I& W: w/ j- G/ o            for(j = 0; j < 4; j++)        //就扫描高四位( u' h! H7 `8 f: o- l6 ~. X: V6 y8 p
                if(temp2 == K_Tab[j])    //查表
, L1 {, R3 c1 a: O: }# a            return i * 4 + j;         //查到了就返回按键的数值) B7 A: a) v6 b' _3 [' m2 X: W
        }+ W- {2 e; f/ P4 Q# K
        else temp1 = _crol_(temp1, 1);
9 y, L6 y5 X2 a$ S& B    }
% ^3 {8 q- i. p% b4 D; N# k    return 16;                        //没有查到,返回按键松开的代码
* n: G$ X& ~& l3 X- z% d}  . P( X  S3 w. S

6 T3 k+ i; u( h6 c% d

该用户从未签到

2#
发表于 2022-10-8 13:59 | 只看该作者
第一种里面的P2应该是P3吧,矩阵键盘好像是P3口控制的。

该用户从未签到

3#
发表于 2022-10-8 14:05 | 只看该作者
对于CPU占用不高的,可以用第一种比较直观

该用户从未签到

4#
发表于 2022-10-8 14:13 | 只看该作者
还是利用定时中断做消抖好点,CPU利用效率高。

该用户从未签到

5#
发表于 2022-10-8 14:29 | 只看该作者
应该使用状态机的思路,进行编程。
  • TA的每日心情
    擦汗
    2025-10-20 15:44
  • 签到天数: 62 天

    [LV.6]常住居民II

    6#
    发表于 2024-8-15 09:36 | 只看该作者
    还是这老兄台好,不搞隐藏
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-29 16:57 , Processed in 0.156250 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表