任务一:初始两个LED的状态为亮,当第1次按下KEY0时,LED0灭,LED1保持不变,当第2次按下KEY0时,LED1熄灭,LED0亮,第3次按下KEY0时,两个LED熄灭,第1次按下KEY1时,LED0,LED1同时以1HZ的频率闪,当第2次按下KEY1时,,LED0,LED1以同时2HZ的频率闪,当第3次按下KEY1时,LED0跟LED1交互翻转(频率为1HZ),当按下KEY_UP时,实现复位功能,回到初始状态(如果已经被锁定,那么,就不能实现复位功能),LED0,LED1全亮。任务二:在任务一的基础上完成,连续按下KEY0七次后进入锁定模式,此时按下任何按键的任务都无法执行,如需解锁,要连续按下KEY1五次,解锁后,再按下其他按键就能正常地进行其对应的按键任务。(注:锁定(解锁)过程中,若按了其他按键,则需要重新连续按KEY0七次(KEY1五次))
我在编写代码的过程中,使用了自加,实现了KEY0三次按键应实现的功能,但KEY2无法实现,任务二不知道以什么思路,以下是我的代码
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
int i=0;
int key=0;
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
LED0=0;
LED1=0; //两个灯初始为亮
while(1)
{
key=KEY_Scan(0); //得到键值
if(key)
{
if( key==WKUP_PRES) //复位
{ LED0=0;
LED1=0;
}
else if( key==KEY0_PRES)
{
i+=1;//自加
if(i==1)
{
LED0=1;
}
if(i==2)
{
LED0=0;
LED1=1;
}
if(i==3)
{
LED0=1;
LED1=1;
}
if(i==7)
{
return 0;//退出程序
}
}
else if(key==KEY1_PRES)
{
i+=1;
if(i==1)
{
while(1){ GPIO_SetBits(GPIOB,GPIO_Pin_5);//跑马灯
GPIO_SetBits(GPIOE,GPIO_Pin_5);
delay_ms(100);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
delay_ms(100);}
}
else if(i==2)//跑马灯
{
while(1){GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
delay_ms(200);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
delay_ms(200);}
}
else if(i==3)//翻转
{
LED0!=LED0;
LED1!=LED1;
delay_ms(100);
}
}
}
else
{
delay_ms(10);
}
}
}
引用头文件均为正点原子官方提供
“某个LED以1HZ的频率闪烁”意思是1s闪烁一次,即亮500ms,灭500ms,所以需要用到定时器