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 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式
  • ¥15 如果要做一个老年人平板有哪些需求