liucheng 发表于 2011-12-17 21:04:51

AVR中的key=PIND; j=key&0xFD;和j=PIND&0xFD;j值为什么不一样呢

部分程序如下:
uchar key_press(void)
{
    uchar i;
    DDRD=0XFF;
       PORTD=0XF0;//判断是否有键按下
       
       DDRD=0X0F;
       
        // i=PIND;//??PIND由两部分组成,高四位是读入的,低四位是刚输出的,如果输入的四根线没变化,则也是刚输出的
       if( PIND==0XF0)
       {
           DDRD=0XFF;//定义为输出
           return 0;
       }
       else
       {
           DDRD=0XFF;//定义为输出
           return 1;
       }
}

uchar key_scan(void)
{
    uchar key,i=0X7F,j;
    delay(10);//???
       if(key_press())
       {
                  do
                        {
                              i=(i<<1|i>>7);//????
                               PORTD=i;//前面已定义为输出
                               DDRD=0X0F;
               /***************************************/
                               key=PIND;
                               j=key&0XF0;
                               //j=PIND&0XF0;
                /***********************************************/
               
             }       while(j==0XF0);
               
                        while(key_press());
                        switch(key)
                        {
                case 0xEE: key=0x0; break;
                     case 0xDE: key=0x1; break;
                     case 0xBE: key=0x2; break;
              case 0x7E: key=0x3; break;
              case 0xED: key=0x4; break;
              case 0xDD: key=0x5; break;
              case 0xBD: key=0x6; break;
              case 0x7D: key=0x7; break;
                     case 0xEB: key=0x8; break;
              case 0xDB: key=0x9; break;
              case 0xBB: key=0xA; break;
              case 0x7B: key=0xB; break;
              case 0xE7: key=0xC; break;
              case 0xD7: key=0xD; break;
              case 0xB7: key=0xE; break;
              case 0x77: key=0xF; break;
                     default:   key=16;       
                       }
       }
       else
       {
          key=16;
       }
       return key;//key是显示在数码管的值

wblqx 发表于 2011-12-17 21:35:17

AVR新手,感觉楼主的Port输出状态定义的就不对。做按键输入的话,应该是输入状态,带内部上拉,这样比较好吧。
页: [1]
查看完整版本: AVR中的key=PIND; j=key&0xFD;和j=PIND&0xFD;j值为什么不一样呢