实际项目中,尤其是小家电产品,经常出现1个按键短按开机-再按1档-再按2档-再按关机的任务框架。本案例基于辉芒芯片,记录按键逻辑与切换不同工作模式的方法.
#include "SYSCFG.h"
//***********************宏定义****************************
#define unchar unsigned char
#define unint unsigned int
#define LED1 PA1
#define LED2 PA4
#define LED3 PA0
#define KEY1 PA3
#define SEN1 PA2#define key_short 10 //修改此参数可以调整按键响应时间
/*-------------------------------------------------* 函数名:POWER_INITIAL* 功能: 上电系统初始化* 输入: 无* 输出: 无--------------------------------------------------*/
void POWER_INITIAL (void)
{ OSCCON = 0B01110001; //IRCF=111=16MHz/4T=4MHz,0.25usINTCON = 0; //暂禁止所有中断OPTION = 0B00001000; //Bit3=1,WDT MODE,PS=000=WDT RATE 1:1PORTA = 0B00000000; TRISA = 0B00001100; //PA输入 0-输出 1-输入WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉 MSCKCON = 0B00000000;//Bit4=0,禁止LVR(60e01x O版之前) //Bit4=0,LVREN使能时,开启LVR(60e01x O版及O版之后) //Bit4=1,LVREN使能时,工作时开启LVR,睡眠时自动关闭LVR(60e01x O版及O版后)
}
/*-------------------------------------------------* 函数名:DelayUs* 功能: 短延时函数 * 输入: Time延时时间长度 延时时长Time us* 输出: 无 -------------------------------------------------*/
void DelayUs(unsigned char Time)
{unsigned char a;for(a=0;a<Time;a++){NOP();}
}
/*------------------------------------------------- * 函数名:DelayMs* 功能: 短延时函数--16M-4T--大概快1%左右.* 输入: Time延时时间长度 延时时长Time ms* 输出: 无 -------------------------------------------------*/
void DelayMs(unsigned int Time)
{unsigned int a,b;for(a=0;a<Time;a++){for(b=0;b<5;b++){DelayUs(98); //快1%}}
}
void main()
{unchar mode_flag;unint key_cnt;POWER_INITIAL(); //系统初始化mode_flag=0;key_cnt=0;while(1){if(!KEY1) //只要检测到按键按下就开始计数{ key_cnt++; } while((KEY1)&&(key_cnt>0))//等待按键松后开并且要按键计数大于0{if(key_cnt>=key_short) //如果检测到按键按下计数大于设定值,表示按下成功mode_flag++; //切换到下一个模式key_cnt=0; //计数清0,退出循环 }if(mode_flag>2) //有多少个模式就写多少值{mode_flag=0; //让模式重新回到第一个状态} switch ( mode_flag ) //根据模式的标志位,进入到对应的工作状态,开启相应功能{case 0: //模式1 待机/关机状态LED1=1;LED2=0;LED3=0; break;case 1: //模式2 LED1=0;LED2=1;LED3=0; break; case 2: //模式3LED1=0;LED2=0;LED3=1; break; }}
}