首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[原创]2812的输入问题

[原创]2812的输入问题

2812的输入问题

小弟新用2812
在做IO输入的实验时遇到一些问题,望各位赐教!我用GPIOB的0~3为输入,GPIOA的0~7接7段数码管输出显示。
我的程序为
void main(void)
{   
    const int table[]={0xC0,0xF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};
    InitSysCtrl();

    DINT;
    IER = 0x0000;
    IFR = 0x0000;
    InitPieCtrl();

    InitPieVectTable();        
        
// Run GPIO test
        var1= 0x0000;                // 设置为普通IO
        var2= 0xFFFF;                // 设置为输出
        var3= 0x0000;                // 输入量化寄存器
        
        Gpio_select();        
        // Toggle I/Os  using DATA register for ever
        
        while(1)
        {  
           int p;
           
           p=keyscan();
           if(p==1)
           {
           keyserve();
           GpioDataRegs.GPADAT.all=table[count];
           delay_loop();
           }                                             
   }
        
}         

void Gpio_select(void)
{
         EALLOW;
        
  GpioMuxRegs.GPAMUX.all=0;
    GpioMuxRegs.GPBMUX.all=0;   

  GpioMuxRegs.GPBDIR.all&=0;                // GPIOA 输入
    GpioMuxRegs.GPADIR.all=0xff;                // GPIOB 输出

  GpioMuxRegs.GPAQUAL.all=0;                  //
    GpioMuxRegs.GPBQUAL.all=0;   

   EDIS;
     
}   
int keyscan()
{
      int k,j;
      k=GpioDataRegs.GPBDAT.all&0X000F;    /*读入输入状态,屏蔽相应位*/
      if(k==0x000F) k=0;
      else k=1;
      if(k==1)
       {
          for(j=30000;j>0;j--) j--;
          k=GpioDataRegs.GPBDAT.all&0x000F;
          if(k==0x000F)
              k=0;
          else k=1;
       }
       return(k);
}
void keyserve()
{
      int m;
      m=GpioDataRegs.GPBDAT.all&0X000F;
      switch(m)
      {
          case 0x000E:count=count+1;
          if (count==15)
          count=0;
                break;
          case 0X000D:count=count-1;
          if(count==0)
          count=15;
                break;
          case 0X000B:count=0;
                break  ;
          case 0X0007:count=15;
                break   ;  
         default:break;

       }
}

但是,不管我的输入为什么,GPADAT寄存器的各个引脚值始终为1,并且在这些输入引脚悬空的时候,量他的引脚电平也是1,为什么?
    在用GPIO作为输入的时候,不就是设置GPxMUX的相应位为0,设置GPxDIR的位为0,然后读取GPADAT的值吗?
谁帮助解决一下啊
返回列表