m0_74371705 2022-11-14 23:04 采纳率: 100%
浏览 4
已结题

关于矩阵代码的理解问题

矩阵键盘的代码理解问题:我在网上找的密码锁代码有下面的那一段,不大理解,请问它们的作用是什么?0xfe&0xf0结果不是0xf0吗?下面的的if不是运行不了吗?

用代码块功能插入代码,请勿粘贴截图
void keyscan()
{
    P3=0xfe;
    temp=P3;
    temp=temp&0xf0; 
    if(temp!=0xf0) 
    {
      delay(10); 
      if(temp!=0xf0)
        {    
            temp=P3;
            switch(temp)
            {
              case 0xee:
                   key=0;
                   wei++;
                   break;
    
              case 0xde:
                   key=1;
                   wei++;
                   break;
    
              case 0xbe:
                   key=2;
                   wei++;
                   break;
    
              case 0x7e:
                   key=3;
                   wei++;
                   break;
            }
            while(temp!=0xf0) 
            {
               temp=P3;
               temp=temp&0xf0;
               beep=0;
            }
            beep=1;
        }
    }
    P3=0xfd;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
              case 0xed:
                   key=4;
                   wei++;
                   break;
    
                case 0xdd:
                   key=5;
                   wei++;
                   break;
    
                case 0xbd:
                   key=6;
                   wei++;
                   break;
    
                case 0x7d:
                   key=7;
                   wei++;
                   break;
            }
            while(temp!=0xf0)
            {
               temp=P3;
               temp=temp&0xf0;
               beep=0;
            }
            beep=1;
        }
    }
    P3=0xfb;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
              case 0xeb:
                   key=8;
                   wei++;
                   break;
    
              case 0xdb:
                   key=9;
                   wei++;
                   break;
                   
              case 0xbb:
                   genggai=1;
                   wei=0;
                   break;
    
              case 0x7b:
                     if(allow)
                   ok=1;
                   break;
            }
            while(temp!=0xf0)
            {
               temp=P3;
               temp=temp&0xf0;
               beep=0;
            }
            beep=1;
          }
    }
    P3=0xf7;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
        {
            temp=P3;
            switch(temp)
            {
              case 0xe7:
                     retry=1;
                   break;
    
              case 0xd7:
                     close=1;
                   break;
             }
            while(temp!=0xf0)
             {
               temp=P3;
               temp=temp&0xf0;
               beep=0;
             }
             beep=1;
        }
    }

  • 写回答

1条回答 默认 最新

  • dceacho 2022-11-15 09:36
    关注

    P3是特殊寄存器和硬件相关
    例如
    P3=1;
    执行这个后,如果P3是悬空的什么都没接,那么你可以看到预期的结果,P30为高,其余为低
    但实际上它是硬件寄存器,如果P30连到地上去了,那么P30高不起来,P3的值并不会等于1
    所以简而言之就是赋值后它并不一定就等于那个值

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月25日
  • 已采纳回答 11月17日
  • 创建了问题 11月14日

悬赏问题

  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染