中级会员
 
- 积分
- 374
- 金钱
- 374
- 注册时间
- 2014-2-13
- 在线时间
- 98 小时
|

楼主 |
发表于 2014-9-2 21:56:18
|
显示全部楼层
原来的问题基本解决,主要是不能用PB8脚,板子上的PB8是已被蜂鸣器的使用。修改后发现新问题:
板子直接运行程序,1,5,9键就不输出,其他键可以。但单步调试后,一切正常。而后再直接跑程序,也正常。关机后,板子上直接跑程序,问题就又出来了。
我猜测是哪块设的不对,但有不知如何查。代码如下,求高人指点
u8 check_Key(void)
{
u16 cord_h,cord_l;//行列值中间变量 高位为行 ,低位为列;
u8 Val = 0xFF;
u8 i=5,j=5;
u8 const Key_Tab[4][4]= //键盘编码表 4x4
{
{'3','7','+','#'},
{'2','6','.','*'},
{'1','5','9','!'},
{'0','4','8','-'}
};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG,ENABLE);//使能PORTB,G功能时
JTAG_Set(SWD_ENABLE); //开启SWD
GPIOG->CRH&= 0x0FFFFFFF; //将G口的CRH的28-31脚置零,其余都保持原样
GPIOG->CRH|= 0x80000000; //G口的15脚上拉输入
GPIOB->CRL&= 0x00000FFF; //0000 0000 0000 0000 0000 1111 1111 1111 pin0-2都保持原样
GPIOB->CRL|= 0x33888000; //0011 0011 1000 1000 1000 0000 0000 0000除了PIN3-5脚上啦输入,pin6-7脚推挽输出,pin0-2都保持原样
GPIOB->CRH&= 0xFFFFF00F; //除了PIN9-10脚推挽输出,其余都保持原样
GPIOB->CRH|= 0x00000330; //0000 0000 0000 0000 00000 0011 0011 0000 除了PIN9-10脚推挽输出,其余都保持原样
GPIOG->ODR&= 0x7FFF; //GPIOG15为1
GPIOG->ODR|= 0x8000; //GPIOG15为1
GPIOB->ODR&= 0xF907; //1111 1001 0000 0111列线pin6-7,9-10脚输出全为0
GPIOB->ODR|= 0x0038; //0000 0000 0011 1000列线pin6-7,9-10脚输出全为0 ,3-5脚为1
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 GPIOG15....GPIOB3-5
{
//Delay_Nms(100); //去抖
delay_ms(10);//去抖动
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;
}
GPIOG->CRH&= 0x0FFFFFFF; //将G口的CRH的28-31脚置零,其余都保持原样
GPIOG->CRH|= 0x30000000; //除了G口的PIN15脚外(推挽输出),其余都保持原样
GPIOB->CRL&= 0x00000FFF; //除了PIN3-5脚(推挽输出),pin6-7脚上啦输入,pin0-2都保持原样
GPIOB->CRL|= 0x88333000; //除了PIN3-5脚(推挽输出),pin6-7脚上啦输入,pin0-2都保持原样
GPIOB->CRH&= 0xFFFFF00F; //除了PIN9-10脚上拉输入,其余都保持原样
GPIOB->CRH|= 0x00000880; //除了PIN9-10脚上拉输入,其余都保持原样
GPIOG->ODR&= 0x7FFF; //0xxx xxxx xxxx xxxx G口PIN15输出0,其余保持原样
GPIOG->ODR|= 0x0000; //0xxx xxxx xxxx xxxx G口PIN15输出0,其余保持原样
GPIOB->ODR&= 0xF907; //1111 1001 0000 0111 B口PIN3-5清0,6-7,9-10清0其余保持原样
GPIOB->ODR|= 0x06c0; //0000 0110 1100 0000 B口PIN3-5输出0,6-7,9-10输出1,其余保持原样
delay_ms(2);// 此延时比不可少;
cord_l = (GPIOB->IDR&0x0600)>>3; //读入列线值 取出GPIOB的9-10 0000 0110 1100 0000
cord_l=cord_l|((GPIOB->IDR&0x00C0)>>2); // 取出GPIOB的6-7
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;
}
return (Key_Tab[j]);
}
}
return 0xFF; //返回该值
}
|
|