中级会员
 
- 积分
- 296
- 金钱
- 296
- 注册时间
- 2015-4-29
- 在线时间
- 26 小时
|
5金钱
程序如下,大部分时候都能扫到,但个别时候扫描不到,老师说是因为32的I/O口不是准双向I/O口,要自己设置,程序设置的不对,有谁知道是哪里设置不对吗,谢谢了!
/********************************************
函数名: 4*4矩阵按键
输入: 无
输出: 无
功能: 按下任意按键后,有且只有唯一的一个键值Key_data
********************************************/
void keyscanjuzhen(void)
{
u16 temp1=0,temp2=0;
RCC->APB2ENR |= 1<<6; //使能PORTE时钟
GPIOE->CRL &= 0XFFFF0000 ;
GPIOE->CRL |= 0X00003333 ; //PE0~PE3 推挽输出
GPIOE->CRL &= 0X0000FFFF ; //PE4~PE7 输入
GPIOE->CRL |= 0X88880000 ; //PE4~PE7默认上拉
GPIOE->ODR = 0xf0 ; //PE0~PE3置0
if( ( (GPIOE->IDR>>4) & 0X0F) != 0x0f) //判断按键是否按下
{
delay_ms(5); //按键消抖
if( ( (GPIOE->IDR>>4) & 0X0F) != 0x0f)//判断按键是否按下
{
temp1= ( GPIOE->IDR >> 4 ) & 0x0f ; //判断哪个按键按下
switch( temp1 )
{
case (0x0e): Key_data=13;break;
case (0x0d): Key_data=9; break;
case (0x0b): Key_data=5; break;
case (0x07): Key_data=1; break;
default:break;
}
}
}
GPIOE->CRL &= 0X0000FFFF ;
GPIOE->CRL |= 0X33330000 ; //PE4~PE7 推挽输出
GPIOE->CRL &= 0XFFFF0000 ; //PE0~PE3 输入
GPIOE->CRL |= 0X00008888 ; //PE0~PE4 默认下拉
GPIOE->ODR = 0x0f ; //PE4~PE7置0
if( ( GPIOE->IDR & 0x0f ) < 0x0f ) //判断按键是否按下
{
delay_ms(5); //按键消抖
if( ( GPIOE->IDR & 0x0f ) < 0x0f ) //判断按键是否按下
{
temp2 = GPIOE->IDR & 0x0f ; //判断哪个按键按下
switch(temp2)
{
case (0x0e): Key_data += 3;break;
case (0x0d): Key_data += 2;break;
case (0x0b): Key_data += 1;break;
case (0x07): Key_data += 0; break;
default:break;
}
}
}
lcd_pos(3,0); //设置显示位置为第四行的第1个字符
lcd_wdat(0x30+Key_data); //显示字
}
|
|