中级会员
积分 374
金钱 374
注册时间 2014-2-13
在线时间 98 小时
3 金钱
键盘经常出现 j=5 的情况,调试了很久始终不能解决,请帮忙指点下。
u8 check_Key(void)
{
u16 cord_h,cord_l;//行列值中间变量 高位为行 ,低位为列;
u8 i=5,j=5;
u8 const Key_Tab[4][4]= //键盘编码表 4x4
{
{'3','7','+','#'},
{'2','6','.','*'},
{'1','5','9','!'},
{'0','4','8','-'}
}; //#代表电源开关,*代表复位,!代表回车
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG,ENABLE);//使能PORTB,G功能时钟
JTAG_Set(JTAG_SWD_DISABLE); //由于JTAG口用到PB3-PB4,与键盘冲突,所以要先关掉
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_15; //G口的15脚上拉输入
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOG, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; //B口的3-5脚上拉输入
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //B口的pin6-pin9脚推挽输出
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
delay_us(1);
GPIO_SetBits(GPIOG,GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
delay_us(1); //现改为1ms,未解决连按的问题
cord_h = GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15);
cord_h =cord_h +((GPIOB->IDR & 0x0038)>>2);
if(cord_h != 0x000F) //先检测有无按键按下 //1000 0000 0011 1000 GPIOG15....GPIOB3-5
{
//Delay_Nms(100); //去抖
delay_ms(100);//去抖动 原为10ms,后改为100
cord_h = (GPIOG->IDR & 0x8000)>>15; //读入行线G口PIN15值 //1000 0000 0000 0000
cord_h = cord_h + ((GPIOB->IDR & 0x0038)>>2); //读入行线B口PIN3-5值 //0000 0000 0011 1000
if(cord_h != 0x000F) // 1000 0000 0011 1000
{
switch(cord_h)
{
case 0x000e:i=0;break; //0x0e 0000_1110
case 0x000d:i=1;break; //0x0d 0000_1101
case 0x000b:i=2;break; //0xb0 0000_1011
case 0x0007:i=3;break; //0x70 0000-0111
default:break;
}
printf("i is %d\r\n",i);
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_15; //G口的p15推挽输出
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStruct);
delay_us(1); //现改为1ms,未解决连按的问题
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; //B口的pin3-pin5脚推挽输出
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //B口的pin6-pin9上拉输入
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStruct);
delay_us(1); //原来为1us
GPIO_ResetBits(GPIOG,GPIO_Pin_15); //G口PIN15输出0
GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5); // B口PIN3-5清0
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9); //B口pin6-pin9设置为1
delay_ms(1);// 此延时比不可少; 原为3,后改为30,现改为100(反应慢),改为50
cord_l = (GPIOB->IDR&0x03C0)>>2;
switch(cord_l)
{
case 0x00e0:j=0;break;
case 0x00d0:j=1;break;
case 0x00b0:j=2;break;
case 0x0070:j=3;break;
default:break;
}
printf("j is %d\r\n",j); //这句经常 j=5,说明键盘没有捕捉到
return (Key_Tab[j]);
}
}
return 0xFF; //返回该值
}
我来回答