金牌会员
 
- 积分
- 1238
- 金钱
- 1238
- 注册时间
- 2013-1-9
- 在线时间
- 121 小时
|
1金钱
本帖最后由 anazel 于 2016-2-23 09:30 编辑
程序如下:
PA6,PA7,PA8接行
PB5,PB6,PB7接列
u16 keyscan(void) //实现矩阵键盘。返回值为各按键的键值,此键值由用户自己定义。
{
int KeyVal; //keyVal为最后返回的键值。
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfe3f | 0x01c0)); //先让PA6,PA7,PA8全部输出高。
if((GPIOB->IDR & 0x00e0)==0x0000) //如果PB5,PB6,PB7全为0,则没有键按下。此时,返回值为0.
return 0;
else
{
delay_ms(5); //延时5ms去抖动。
if((GPIOB->IDR & 0x00e0)==0x0000)//如果延时5ms后,PB5到PB7又全为0,则,刚才引脚的电位变化是抖动产生的.
return 0;
}
//GPIO_Write(GPIOA,(GPIOA->ODR & 0xfe3f | 0x0040)); //让PA8,PA7,PA6输出二进制的001.
GPIOA->BSRR = 0x0040;
switch(GPIOB->IDR & 0x00e0)//对PB5,PB6,PB7的值进行判断,以输出不同的键值。
{
case 0x0020: KeyVal = 1; break;
case 0x0040: KeyVal = 2; break;
case 0x0080: KeyVal = 3; break;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfe3f | 0x0080)); //让PBA,PA7,PA6输出二进制的010.
switch(GPIOB->IDR & 0x00e0)//对PB5,PB6,PB7的值进行判断,以输出不同的键值。
{
case 0x0020: KeyVal=4; break;
case 0x0040: KeyVal=5; break;
case 0x0080: KeyVal=6; break;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfe3f | 0x0100)); //让PB8,PA7,PA6输出二进制的100.
switch(GPIOB->IDR & 0x00e0)//对PB5,PB6,PB7的值进行判断,以输出不同的键值。
{
case 0x0020: KeyVal=7; break;
case 0x0040: KeyVal=8; break;
case 0x0080: KeyVal=9; break;
}
return KeyVal;
}
这样写可以正常扫描出键值,如果把 GPIOA->BSRR = 0x0040;这句话换成
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfe3f | 0x0040)); //让PA8,PA7,PA6输出二进制的001.
那么只有键值8判断不出来,其他的都能正确判断出来,不知道什么原因。
|
|