实战项目模块之1------单个按键短按切换不同工作模式
实际项目中,尤其是小家电产品,经常出现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.25us
INTCON = 0; //暂禁止所有中断
OPTION = 0B00001000; //Bit3=1,WDT MODE,PS=000=WDT RATE 1:1
PORTA = 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: //模式3
LED1=0;
LED2=0;
LED3=1;
break;
}
}
}