key_up按键为状态标志设置按键(设置状态和工作状态,初始为工作状态)
设置状态模式:
key_2:切换按键(蜂鸣器,led1,led2)
key_1:增加次数
key_0:减少次数
工作状态模式:
key_2:切换按键(蜂鸣器,led1,led2)
外设按设置的次数做出响应(初始状态为蜂鸣器响两声,led0闪一下,了的1闪三下)
注:key_2按键在工作状态和设置状态独立
led.c
#include "led.h"
#include "stm32f4xx.h"
#include "delay.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_Inithhhgh; //GPIO初始化
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//时钟使能
GPIO_Inithhhgh.GPIO_Mode=GPIO_Mode_OUT;
GPIO_Inithhhgh.GPIO_OType=GPIO_OType_PP;
GPIO_Inithhhgh.GPIO_Pin=GPIO_Pin_9 | GPIO_Pin_10;
GPIO_Inithhhgh.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Inithhhgh.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOF,&GPIO_Inithhhgh);
}
void led1(u8 a) //设置灯的亮灭,四个函数两两相同
{
u8 i;
for(i=0;i<a;i++)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9);
delay_ms(100);
GPIO_SetBits(GPIOF,GPIO_Pin_9);
delay_ms(100);
}
}
void led2(u8 a)
{
u8 i;
for(i=0;i<a;i++)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay_ms(100);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay_ms(100);
}
}
void led_on(u8 a)
{
switch(a)
{
case 0:
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9);
}break;
case 1:
{
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
}break;
}
}
void led_off(u8 b)
{
switch(b)
{
case 0:
{
GPIO_SetBits(GPIOF,GPIO_Pin_9);
}break;
case 1:
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
}break;
}
}
key.c
#include "key.h"
#include <stm32f4xx.h>
#include "delay.h"
void key_init(void)
{
GPIO_InitTypeDef GPIO_Initwk;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_Initwk.GPIO_Mode=GPIO_Mode_IN;
GPIO_Initwk.GPIO_Pin=GPIO_Pin_2 |GPIO_Pin_3|GPIO_Pin_4;
GPIO_Initwk.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Initwk.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOE,&GPIO_Initwk);
GPIO_Initwk.GPIO_Pin=GPIO_Pin_0;
GPIO_Initwk.GPIO_PuPd=GPIO_PuPd_DOWN;
GPIO_Init(GPIOA,&GPIO_Initwk);
}
uint8_t KEY_Scan(void)
{
delay_ms(20);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
return 1;
delay_ms(20);
if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))
return 2;
delay_ms(20);
if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3))
return 3;
delay_ms(20);
if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2))
return 4;
delay_ms(20);
return 0;
}
uint8_t KEY1_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY_UP==1))
{
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(KEY_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY_UP==0)key_up=1;
return 0;// 无按键按下
}
buzzer.h
#include "beep.h"
#include "delay.h"
void BEEP_Init(void)
{
GPIO_InitTypeDef GPIO_Inithhhgh;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
GPIO_Inithhhgh.GPIO_Mode=GPIO_Mode_OUT;
GPIO_Inithhhgh.GPIO_OType=GPIO_OType_PP;
GPIO_Inithhhgh.GPIO_Pin=GPIO_Pin_8;
GPIO_Inithhhgh.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Inithhhgh.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOF,&GPIO_Inithhhgh);
}
void BEPP_ON(u8 a)
{
u8 i;
for(i=0;i<a;i++)
{
GPIO_SetBits(GPIOF,GPIO_Pin_8);
delay_ms(100);
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
delay_ms(100);
}
}
void BEPP_2(u8 a)
{
u8 i;
for(i=0;i<a;i++)
{
GPIO_SetBits(GPIOF,GPIO_Pin_8);
delay_ms(30);
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
delay_ms(30);
}
}
#include <stm32f4xx.h>
#include <stdio.h>
#include "led.h"
#include "delay.h"
#include "key.h"
#include "beep.h"
u8 key_up=0;
u8 key_3=1;
u8 SETkey_3=3;
u8 flag_num1=2;
u8 flag_num2=2;
u8 flag_num3=2;
u8 flag=1;
int main()
{
uint8_t key_scan=0;
LED_Init();
key_init();
BEEP_Init();
delay_init(168);
while(1)
{
key_scan=KEY1_Scan(0);
switch(key_scan)//判断按键
{
case 4:
key_up^=1;
BEPP_2(2);
break;
case 3:
flag=1;
if(key_up==0)
{
SETkey_3++;
if(SETkey_3%4==0)
{
SETkey_3=1;
}
}
else if(key_up==1)
{
key_3++;
if(key_3%4==0)
{
key_3=1;
}
if(key_3==1)
{
BEPP_2(1);
}
else if(key_3==2)
{
led1(1);
}
else if(key_3==3)
{
led2(1);
}
}
break;
case 2:
if(key_up==1)
{
if(key_3==1)//BEEP
{
flag_num1++;
if(flag_num1>=10)flag_num1=10;
}
else if(key_3==2)//LED1
{
flag_num2++;
if(flag_num2>=10)flag_num2=10;
}
else if(key_3==3)//LED2
{
flag_num3++;
if(flag_num3>=10)flag_num3=10;
}
}
break;
case 1:
if(key_up==1)
{
if(key_3==1)
{
flag_num1--;
if(flag_num1<=0)flag_num1=0;
}
else if(key_3==2)
{
flag_num2--;
if(flag_num2<=0)flag_num2=0;
}
else if(key_3==3)
{
flag_num3--;
if(flag_num3<=0)flag_num3=0;
}
}
break;
}
if(key_up==0&&flag==1)//工作模式
{
flag=0;
if(SETkey_3==1)
{
BEPP_ON(flag_num1);
}
else if(SETkey_3==2)
{
led1(flag_num2);
}
else if(SETkey_3==3)
{
led2(flag_num3);
}
}
else//设置模式
{
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
GPIO_SetBits(GPIOF,GPIO_Pin_9);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
}
}
}