用八个低电平有效的按钮 控制8个led灯开关。 前六个按钮正常。 后面两个 总是不正常不知道原因。求解 代码如下
应为KEY6 KEY7不正常所以没在if语句里
#include "key.h"
#include "delay.h"
//按键初始化
void KEY_Init(void)
{
RCC->APB2ENR|=1<<2;
GPIOA->CRH&=0x00000000;
GPIOA->CRH|=0x88888888; //默认下拉
GPIOA->ODR|=0xFF00; //设置上拉
}
//按键扫描处理
//mode:0不支持连续按,1支持连续按。
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1; //按键松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==0||KEY4==0||KEY5==0))
{
delay_ms(10);
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(KEY3==0)return 4;
else if(KEY4==0)return 5;
else if(KEY5==0)return 6;
else if(KEY6==0)return 7;
else if(KEY7==0)return 8;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1&&KEY5==1)key_up=1;
return 0;
}
======================================================
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "key.h"
#include "led.h"
int main(void)
{
u8 tabKey;
u8 i=0;
Stm32_Clock_Init(9); //初始化时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化为9600
KEY_Init();
LED_Init();
while(1)
{
i++;
tabKey=KEY_Scan(0); //获得键值
//printf("获得键值");
if(tabKey)
{
switch(tabKey)
{
case KEY_UP: //控制led0
LED0=~LED0;
printf("key_up\n");
break;
case KEY_DOWN:
LED1=~LED1;
printf("key_down\n");
break;
case KEY_LEFT:
LED2=~LED2;
printf("key_left\n");
break;
case KEY_RIGHT:
LED3=~LED3;
printf("key_right\n");
break;
case KEY_K5:
LED4=~LED4;
printf("key_k5\n");
break;
case KEY_K6:
LED5=~LED5;
printf("key_k6\n");
break;
case KEY_K7:
LED6=~LED6;
printf("key_back\n");
break;
case KEY_K8:
LED7=~LED7;
printf("key_enter\n");
break;
}
}else delay_ms(5);
if(i==100)
{
LED8=~LED8; //系统运行指示灯
i=0;
}
}
}
|