新手入门
- 积分
- 12
- 金钱
- 12
- 注册时间
- 2016-2-16
- 在线时间
- 3 小时
|
1金钱
各位大牛,请教简单的问题,这是按键输入的实验,用库函数已成功验证了,可是我用下面的寄存器操作时,却总是调试不好,本人小白刚入门,不知道是哪里的程序设计有问题?
主函数:
int main()
{
u8 key;
u8 m = 1,n = 0;
all_init();
delay_init(8);
LED1(n);
while(1)
{
key = key_scan(0);
if(key)
{
switch(key)
{
case 1:
m = !m;
LED0(m);break;
case 2:
n = !n;
LED1(n);break;
}
}
else delay_ms(10);
}
}
子函数:
void all_init(void)
{
RCC->APB2ENR |= 1<<3; //使能GPIOB时钟
RCC->APB2ENR |= 1<<6; //使能GPIOE时钟
//PB5
GPIOB->CRL &= 0XFF0FFFFF;
GPIOB->CRL |= 0X00300000;
GPIOB->ODR |= 1<<5;
//PE3,PE4,PE5
GPIOE->CRL &= 0XFF000FFF;
GPIOE->CRL |= 0X00388000;
GPIOE->ODR |= 7<<3;
}
u8 key_scan(u8 mode)
{
static u8 KEY_CHECK = 1;
if(mode) KEY_CHECK = 1;
if(KEY_CHECK&&((!KEY0)||(!KEY1)))
{
delay_ms(10);
KEY_CHECK = 0;
if(!KEY0) return 1;
else if (!KEY1) return 2;
}
else if(KEY0&&KEY1) KEY_CHECK = 1;
return 0;
}
头文件:
#define KEY0 (GPIOE->IDR&(1<<4))?1:0 //PE4 按下为低电平
#define KEY1 (GPIOE->IDR&(1<<3))?1:0 //PE3 按下为低电平
#define PIN5 (unsigned int)1<<5 //位操作需定义为无符号型
#define LED0(x) GPIOB->ODR = (GPIOB->ODR&(~PIN5))|(x?PIN5:0) //PB5 低电平使能
#define LED1(x) GPIOE->ODR = (GPIOE->ODR&(~PIN5))|(x?PIN5:0) //PE5 低电平使能
void all_init(void); //全部IO口初始化
u8 key_scan(u8); //按键扫描
#endif
|
|