我开始做了4*4的矩阵键盘,用的是pc0-pc7,按键是正常的,现在由于需要我把他缩成3*3的键盘,用的是pb10~pb15,但是值出来是错的,没按都出来键值,是不是pb口这几个口复用了,待会把代码粘上,有人遇到过么,我现在板子做出来了,所以不能改io口了。
IO口初始化函数:
void KEY_Init(void) //IO??????
{
GPIO_InitTypeDef GPIO_InitStructure;
//??????KEY0-->GPIOA.13,KEY1-->GPIOA.15 ???????
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//????PORTA,PORTE?±??
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //??·?PB3 ???? PB4 //
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); //??·?PA13 14 15//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PE2~4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //?è???????????
GPIO_Init(GPIOE, &GPIO_InitStructure);//??????GPIOE2,3,4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14| GPIO_Pin_15; //???ó°??ü??????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //?¨?????ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //?è???????????
GPIO_Init(GPIOB, &GPIO_InitStructure); //???ó°??ü??????P13~P15
}
按键扫描函数:
int Key_Scan(void)
{
int KEY_Value=-1;
GPIO_Write(GPIOB,((GPIOB->ODR&0x1fff)|0xE000));
if((GPIOB->IDR&0x1C00)==0X0000)
return -1;
else
{
delay_ms(5); //???±5ms?ó ??????
if((GPIOB->IDR&0x1C00)==0X0000)
return -1;
}
GPIO_Write(GPIOB,((GPIOB->ODR&0x1fff)|0x2000));
switch(GPIOB->IDR&0x1C00) //PB
{
case 0x0400: KEY_Value=9; break;
case 0x0800: KEY_Value=6; break;
case 0x1000: KEY_Value=3; break;
}
GPIO_Write(GPIOB,((GPIOB->ODR&0x1fff)|0x4000));
switch(GPIOB->IDR&0x1C00)
{
case 0x0400: KEY_Value=8; break;
case 0x0800: KEY_Value=5; break;
case 0x1000: KEY_Value=2; break;
}
GPIO_Write(GPIOB,((GPIOB->ODR&0x1fff)|0x8000));
switch(GPIOB->IDR&0x1C00)
{
case 0x0400: KEY_Value=7; break;
case 0x0800: KEY_Value=4; break;
case 0x1000: KEY_Value=1; break;
}
return KEY_Value;
}
现在我能按 456 789键值 但是123按不出来 发现PB12口没有用
|