[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#define key1 (GPIOE->IDR |= (1<<2))
#define key2 (GPIOE->IDR |= (1<<3))
#define key3 (GPIOE->IDR |= (1<<4))
//LED初始化
void led_init()
{
//使能GPIOB和GPIOE的时钟
RCC->APB2ENR |= 1<<3;
RCC->APB2ENR |= 1<<6;
//设置PB5为推挽输出,并为高电平
GPIOB->CRL &= 0xff0fffff;
GPIOB->CRL |= 0x00300000;
GPIOB->ODR |= 1<<5;
//设置PE5为推挽输出,并为高电平
GPIOE->CRL &= 0xff0fffff;
GPIOE->CRL |= 0x00300000;
GPIOE->ODR |= 1<<5;
}
//独立键盘初始化,LED初始化已将GPIOE的时钟开启
void key_init()
{
//设置PE2~4为上拉输入
GPIOE->CRL &= 0xfff000ff;
GPIOE->CRL |= 0x00088800;
GPIOE->ODR |= 7<<2;
}
//键盘扫描函数
u8 key_scan(u8 mode)
{
static u8 key_up = 1;
if(mode)
{
key_up = 1;
}
if(key_up&&(key1 == 0||key2 == 0||key3 == 0))
{
delay_ms(10);
key_up = 0;
if(key1 == 0)
{
return 1;
}
else if(key2 == 0)
{
return 2;
}
else if(key3 == 0)
{
return 3;
}
}
else if(key1 == 1&&key2 == 1&&key3 == 1)
{
key_up = 1;
}
return 0;
}
//主函数
int main()
{
u8 t;
Stm32_Clock_Init(9);
delay_init(72);
led_init();
key_init();
while(1)
{
//获取键值,并作出相应动作
t = key_scan(0);
if(t)
{
switch(t)
{
case 1:
{
GPIOB->BRR |= 1<<5;
GPIOE->BSRR |= 1<<5;
break;
}
case 2:
{
GPIOE->BRR |= 1<<5;
GPIOB->BSRR |= 1<<5;
break;
}
case 3:
{
GPIOB->BRR |= 1<<5;
GPIOB->BRR |= 1<<5;
break;
}
}
}
else
{
delay_ms(10);
}
}
}
[/mw_shl_code]
程序如上,我的设想是不输入时,ODR的值应该等于IDR的值等于1,然后按下按键时,把IDR拉低。
但是我用软件仿真的时候,发现PE2~4设置为上拉输入,但是IDR依然为0,放到硬件上也不行。求教这是问什么和要怎么改才可以正常运行。
|