头像-171830

pzl51

个人成就

获得 0 次赞

帮助过0人

多种模式的流水灯用按键切换不了

int main(void) { vu8 key=0; delay_init(); //延时函数初始化 LED_Init(); //LED端口初始化 KEY_Init(); //初始化与按键连接的硬件接口 LED0=0; //先点亮红灯 while(1) { key=KEY_Scan(0); //得到键值 switch(key) { case KEY2_PRES: // LED_liushui(3); break; case KEY1_PRES: // LED_liushui(2); break; case KEY0_PRES: // LED_liushui(1); break; } } } void LED_Init(void) { // GPIO_InitTypeDef GPIO_InitStructure; // // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟 // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置 // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz // GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 // GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高 // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出 // GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz // GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOA,GPIO_Pin_0); //PA.0 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //LED3-->PA.7 端口配置, 推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOA,GPIO_Pin_7); //PA.7 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //LED3-->PA.1 端口配置, 推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOA,GPIO_Pin_1); //PA.1 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PE.5 端口配置, 推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOA,GPIO_Pin_2); //PA.2 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //LED3-->PA.1 端口配置, 推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOA,GPIO_Pin_3); //PA.3 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //LED3-->PA.4 端口配置, 推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOA,GPIO_Pin_4); //PA.4 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED2-->PA.5 端口配置, 推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOA,GPIO_Pin_5); //PA.5 输出高 } void xiaoguo1(void) { LED0=0; LED1=1; LED2=1; LED3=1; LED4=1; LED5=1; LED6=1; } void xiaoguo2(void) { LED0=0; LED1=0; LED2=1; LED3=1; LED4=1; LED5=1; LED6=1; } void xiaoguo3(void) { LED0=0; LED1=0; LED2=0; LED3=1; LED4=1; LED5=1; LED6=1; } void xiaoguo4(void) { LED0=0; LED1=0; LED2=0; LED3=0; LED4=1; LED5=1; LED6=1; } void xiaoguo5(void) { LED0=0; LED1=0; LED2=0; LED3=0; LED4=0; LED5=1; LED6=1; } void LED_liushui(int i) { if(i==1) { LED0=0; LED1=0; LED2=0; LED3=0; LED4=1; LED5=1; LED6=1; } else if(i==2) { while(1) { xiaoguo5(); delay_ms(3000); xiaoguo4(); delay_ms(3000); xiaoguo3(); delay_ms(3000); xiaoguo2(); delay_ms(3000); xiaoguo1(); delay_ms(3000); } } else if(i==3) { while(1) { xiaoguo1(); delay_ms(3000); xiaoguo2(); delay_ms(3000); xiaoguo3(); delay_ms(3000); xiaoguo4(); delay_ms(3000); xiaoguo5(); delay_ms(3000); } } } void KEY_Init(void) //IO初始化 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; //设置成浮空输入 GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4 } //按键处理函数 //返回按键值 //mode:0,不支持连续按;1,支持连续按; //0,没有任何按键按下 //1,KEY0按下 //2,KEY1按下 //3,KEY2按下 //4,KEY3按下 WK_UP //注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!! u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==1||KEY1==1||KEY2==1)) { delay_ms(10);//去抖动 key_up=0; if(KEY0==1)return KEY0_PRES; else if(KEY1==1)return KEY1_PRES; else if(KEY2==1)return KEY2_PRES; //else if(WK_UP==1)return WKUP_PRES; }else if(KEY0==0&&KEY1==0&&KEY2==0)key_up=1; return 0;// 无按键按下 }