本帖最后由 a18270826679 于 2016-7-21 10:05 编辑
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
int KEY_Scan(void) //êμÏÖ¾ØÕó¼üÅì¡£·μ»ØÖμÎa£¬¸÷°′¼üμļüÖ죬′˼üÖμóéóû§×Ô¼o¶¨òå¡£{
u8 KeyVal; //keyValÎa×îoó·μ»ØμļüÖμ¡£
GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10)==0x0)
return -1;
else
{
delay_ms(5);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10)==0x0)
return -1;
}
GPIO_ResetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
GPIO_SetBits(GPIOB,GPIO_Pin_3);
printf("0x%X\n",(GPIOB->IDR&0x0780)>>7);
switch((GPIOB->IDR&0x0780)>>7)
{
case 0x01: KeyVal=1; break;
case 0x02: KeyVal=2; break;
case 0x04: KeyVal=3; break;
case 0x08: KeyVal=4; break;
}
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10)!=0x0);
GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
printf("0x%X\n",(GPIOB->IDR&0x0780)>>7);
switch((GPIOB->IDR&0x0780)>>7)
{
case 0x01: KeyVal=5; break;
case 0x02: KeyVal=6; break;
case 0x04: KeyVal=7; break;
case 0x08: KeyVal=8; break;
}
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10)!=0x0);
GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
printf("0x%X",(GPIOB->IDR&0x0780)>>7);
switch((GPIOB->IDR&0x0780)>>7)
{
case 0x01: KeyVal=13; break;
case 0x02: KeyVal=9; break;
case 0x04: KeyVal=5; break;
case 0x08: KeyVal=1; break;
}
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10)!=0x0);
GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
GPIO_SetBits(GPIOB,GPIO_Pin_6);
printf("0x%X",(GPIOB->IDR&0x0780)>>7);
switch((GPIOB->IDR&0x0780)>>7)
{
case 0x01: KeyVal=12; break;
case 0x02: KeyVal=8; break;
case 0x04: KeyVal=4; break;
case 0x08: KeyVal=0; break;
}
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10)!=0x0);
return KeyVal;
}
原理图我是采用4*4 来实现3*4 这个代码实现了只能扫描一行,我觉得是行扫描那块没做好,
下面代码是可以实现的,但是他这个接口和我那个不一样。他采用的是PB8-PB15 我需要采用PB3-PB10
void KEY_Init(void) //初始化矩阵键盘要使用的GPIO口。 {
GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; //定义PB8到PB11为上拉输入、、。 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD; //定义PB12到PB15为下拉输入。 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //因为上面定义引脚为输出时,已经打开整个GPIOA的时钟了, //所以此处不再需要函数RCC_APB2PeriphClockCmd()来打开时钟了。 GPIO_Init(GPIOB,&GPIO_InitStructure); }
int KEY_Scan(void) //实现矩阵键盘。返回值为,各按键的键值,此键值由用户自己定义。 { u8KeyVal; //keyVal为最后返回的键值。 GPIO_Write(GPIOB,(GPIOB->ODR& 0xf0ff | 0x0f00)); //先让PB8到PB11全部输出高。
if((GPIOB->IDR& 0xf000)==0x0000) //如果PB12到PB15全为0,则没有键按下。此时,返回值为-1. return-1; else { delay_ms(5); //延时5ms去抖动。 if((GPIOB->IDR & 0xf000)==0x0000)//如果延时5ms后,PB12到PB15又全为0,则,刚才引脚的电位变化是抖动产生的. return -1; }
GPIO_Write(GPIOB,(GPIOB->ODR& 0xf0ff | 0x0100)); //让PB11到PB8输出二进制的0001.
switch(GPIOB->IDR& 0xf000)//对PB12到PB15的值进行判断,以输出不同的键值。 { case0x1000: KeyVal=15; break; case0x2000: KeyVal=11; break; case0x4000: KeyVal=7; break; case0x8000: KeyVal=3; break; }
GPIO_Write(GPIOB,(GPIOB->ODR& 0xf0ff | 0x0200)); //让PB11到PB8输出二进制的0. switch(GPIOB->IDR& 0xf000) //对PB12到PB15的值进行判断,以输出不同的键值。 { case0x1000: KeyVal=14; break; case0x2000: KeyVal=10; break; case0x4000: KeyVal=6; break; case0x8000: KeyVal=2; break; }
GPIO_Write(GPIOB,(GPIOB->ODR& 0xf0ff | 0x0400)); //让PB11到PB8输出二进制的1011. switch(GPIOB->IDR& 0xf000) //对PB12到PB15的值进行判断,以输出不同的键值。 { case0x1000: KeyVal=13; break; case 0x2000: KeyVal=9; break; case0x4000: KeyVal=5; break; case0x8000: KeyVal=1; break; }
GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff |0x0800)); //让PB11到PB8输出二进制的0111. switch(GPIOB->IDR& 0xf000) //对PB12到PB15的值进行判断,以输出不同的键值。 { case0x1000: KeyVal=12; break; case0x2000: KeyVal=8; break; case0x4000: KeyVal=4; break; case0x8000: KeyVal=0; break; } returnKeyVal; }
|