线反转法扫描矩阵程序

2020-01-13 18:23发布

uchar key(void)
{
    uchar key,key1,key2,k;
    P1=0XF0;
    k=0xff;
    if((P1&0XF0)!=0XF0)
    {
        delay();
        if((P1&0XF0)!=0XF0)
        key1=P1&0XF0;
        P1=0X0F;
        if((P1&0X0F)!=0X0F)
        {
            delay();
            if((P1&0X0F)!=0X0F)
            {
                key2=P1&0X0F;
                key=key1|key2;
                if(key!=0xff)
                {
                    switch(key)
                    {
                        case 0xee: k=0;break;                       
                        case 0xed: k=1;break;                        
                        case 0xeb: k=2;break;                       
                        case 0xe7: k=3; break;
                        case 0xde: k=4;break;                       
                        case 0xdd: k=5;break;                        
                        case 0xdb: k=6;break;                       
                        case 0xd7: k=7; break;
                         case 0xbe: k=8;break;                       
                        case 0xbd: k=9;break;                        
                        case 0xbb: k=10;break;                       
                        case 0xb7: k=11; break;
                         case 0x7e: k=12;break;                       
                        case 0x7d: k=13;break;                        
                        case 0x7b: k=14;break;                       
                        case 0x77: k=15; break;
                    }
                }
            }
        }
    }
    return(k);
}


只做了键盘扫描程序,说明问题,
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
73条回答
yao1
2020-01-20 02:59
回复【58楼】yao1
-----------------------------------------------------------------------

代码太长 重新简化
int keyscan()
{
       unsigned char k k_temp;
       P1=0xf0;      //低位置0,准备查询按键
       k=P1;         //取得当前P1口状态
       if(k!=0xf0)   //如果有变化则表示有按键按下
       {
              delay(10);    //延迟 消抖
              k_temp=p1;
              if(k==k_temp)  //确实有键按下
              {
                     k=0xfe;
                     do         //循环扫描每一行
                     {
                            p1=k;
                            if(k!=p1)
                            {
                           
                                  switch(P1)  //判断按键 并返回键值
                                  {
                                     //第1行
                                     case 0x7e:{return 0;break;}
                                     case 0xbe:{return 0;break;}
                                     case 0xde:{return 0;break;}
                                     case 0xee:{return 0;break;}
                                     //第2行
                                     case 0x7d:{return 0;break;}
                                     case 0xbd:{return 0;break;}
                                     case 0xdd:{return 0;break;}
                                     case 0xed:{return 0;break;}
                                     //第3行
                                     case 0x7b:{return 0;break;}
                                     case 0xbb:{return 0;break;}
                                     case 0xdb:{return 0;break;}
                                     case 0xeb:{return 0;break;}
                                     //第4行
                                     case 0x77:{return 0;break;}
                                     case 0xb7:{return 0;break;}
                                     case 0xd7:{return 0;break;}
                                     case 0xe7:{return 0;break;}
                             
                                  }                                                                                
                            }
                            k=_crol_(k,1);   //移位 进入下一行扫描               
                     }
                     while(k!=0xef); //超过列范围 退出扫描                        
              }         
       }
}

一周热门 更多>