- UID
- 149303
- 性别
- 男
|
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的值吗?
|
|