我用B口的低八位与八个独立按键相连,按键为低电平有效,用IDR寄存器扫描按键,我先将B口的第八位设置为输出,然后都置1,接着设置为输入。然后用whie(1)扫描IDR,课问题是程序每次只能检测到一次按键,是什么问题啊?
我猜想可能是按键释放后IDR的值没有恢复为全1状态,请问是这样的吗?在B口的低八位为输入状态下,我释放按键,IDR会自动变成与ODR的值相同吗?请指教。
程序如如下:
初始化程序
void LED_Init(void)
{
//使能
RCC->APB2ENR|=1<<3; //使能 PORTB时钟
//设置模式
GPIOB->CRL=0X00000000;
GPIOB->CRL=0X33333333;//PB0~8 推挽输出
GPIOB->ODR=0xff; //PB低8位上拉
GPIOB->CRL=0X88888888;//PB0~7输入
GPIOB->CRH=0X33333333;//PB8~15 推挽输出
//输出
}
按键扫描程序
u8 KEY_Scan(void)
{
switch(GPIOB->IDR)
{
case 0xfe:return(1);break;
case 0xfd:return(2);break;
case 0xfb:return(3);break;
case 0xf7:return(4);break;
case 0xef:return(5);break;
case 0xdf:return(6);break;
case 0xbf:return(7);break;
case 0x7f:return(8);break;
}
}
主程序
int main(void)
{
u8 t;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
JTAG_Set(JTAG_SWD_DISABLE);
while(1)
{
t=KEY_Scan();//得到键值
if(t)
{
switch (t)
{
case 1:
LED0=!LED0;
break;
case 2:
LED1=!LED1;
break;
case 3:
LED2=!LED2;
break;
case 4:
LED3=!LED3;
break;
case 5:
LED4=!LED4;
break;
case 6:
LED5=!LED5;
break;
case 7:
LED6=!LED6;
break;
case 8:
LED7=!LED7;
break;
}
}
}
}
|