这是按键初始化 和按键扫描程序
void KEY_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOA
tiNG;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
}
void KEY_Scan(void)
{
GPIOB->ODR=0x0F18;
if(GPIOB->IDR!=0x0F18)
{
delay_ms(50);
if(GPIOB->IDR!=0x0F18)
{
GPIOB->ODR=0X0100;
switch(GPIOB->IDR&0XF000)
{
case 0x1000 : KeyValue=0;break;
case 0x2000 : KeyValue=1;break;
case 0x4000 : KeyValue=2;break;
case 0x8000 : KeyValue=3;break;
default :break;
}
GPIOB->ODR=0X0200;
switch(GPIOB->IDR&0XF000)
{
case 0x1000 : KeyValue=4;break;
case 0x2000 : KeyValue=5;break;
case 0x4000 : KeyValue=6;break;
case 0x8000 : KeyValue=7;break;
default :break;
}
GPIOB->ODR=0X0400;
switch(GPIOB->IDR&0XF000)
{
case 0x1000 : KeyValue=8;break;
case 0x2000 : KeyValue=9;break;
case 0x4000 : KeyValue=10;break;
case 0x8000 : KeyValue=11;break;
default :break;
}
GPIOB->ODR=0X0800;
switch(GPIOB->IDR&0XF000)
{
case 0x1000 : KeyValue=12;break;
case 0x2000 : KeyValue=13;break;
case 0x4000 : KeyValue=14;break;
case 0x8000 : KeyValue=15;break;
default :break;
}
}
}
}
我都试过了,按下的时候 设置为浮空输入的IO口的电平会被拉高。现在我怀疑是 读取 IO口状态 那块有问题
一周热门 更多>