当前位置: 首页 > article >正文

实战项目模块之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;           
        }
    }
}

http://www.kler.cn/a/465600.html

相关文章:

  • leecode718.最长重复子数组
  • 融合表面信息和等变扩散的分子对接模型 SurfDock - 评测
  • 我们公司只有3个人,一个前端,一个后端
  • 友元和运算符重载
  • 【Python学习(六)——While、for、循环控制、指数爆炸】
  • JavaScript系列(4)--数值类型专题
  • 《HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发
  • 【前端系列】Pinia状态管理库
  • 测试岗位面试常见的数据库问题及解答
  • gitlab高级功能之 CICD Steps
  • 微前端Webpack集成Vite子应用避坑指南
  • 微信小程序获取后端数据
  • PS4代理伺服器指南
  • JavaScript 基础2
  • 【网络安全】PostMessage:分析JS实现XSS
  • .e01, ..., .e0n的分卷压缩包怎么解压
  • 多目标优化算法——基于分解的多目标进化算法(MOEA-D)
  • [C++]vector(超详细)
  • Docker入门常用命令总结
  • 软考教材重点内容 信息安全工程师 第 12 章网络安全审计技术原理与应用
  • 牛客网刷题 ——C语言初阶——OR76 两个整数二进制位不同个数
  • 计算效率提升 10 倍,存储成本降低 60%,灵犀科技基于 Apache Doris 建设统一数据服务平台
  • Swift Combine 学习(三):Subscription和 Subscriber
  • React Router 用法概览
  • Redis的数据过期清除策略
  • 周亚辉投资笔记2025系列第1篇:机器人时代的社会结构模型与十年后中国首富预测