首页 基于安信可TB-02-03F-04的825xSdk上按键短按及长按的功能实现

基于安信可TB-02-03F-04的825xSdk上按键短按及长按的功能实现

举报
开通vip

基于安信可TB-02-03F-04的825xSdk上按键短按及长按的功能实现     基于安信可TB-02/03F/04的825xSdk上按键短按及长按的功能实现                  基于安信可TB-02/03F/04的825xSdk上按键短按及长按的功能实现前言驱动代码编写移植使用测试效果前言本例程基于10ms的中断定时器扫描,实现了短按、长按的按键识别功能。驱动代码编写写一个头文件button.h:#ifndef_BUTTON_H_#define_BUTTON_H_typedefenum{B_START=0,//启动B_STOP=1,//停止}BUTTON_State;t...

基于安信可TB-02-03F-04的825xSdk上按键短按及长按的功能实现
     基于安信可TB-02/03F/04的825xSdk上按键短按及长按的功能实现                  基于安信可TB-02/03F/04的825xSdk上按键短按及长按的功能实现前言驱动代码编写移植使用测试效果前言本例程基于10ms的中断定时器扫描,实现了短按、长按的按键识别功能。驱动代码编写写一个头文件button.h:#ifndef_BUTTON_H_#define_BUTTON_H_typedefenum{B_START=0,//启动B_STOP=1,//停止}BUTTON_State;typedefenum{NO_ACTION=0x00,//无动作SHORT_PRESS=0x01,//短按LONG_PRESS=0x02,//长按}BUTTON_Type;typedefstructbutton_hander{unsignedcharBST_BUF;//按键状态存储值unsignedintBTI_CNT;//按键计数器值unsignedcharbtr;//按键返回状态值unsignedcharbtn;//按键值unsignedcharlevel;//按键电平值unsignedcharevent;//按键事件值}BUTTON_Hander;voidButton_Init(void);//按键初始化,放在user_init函数里面voidButton_Timer_Irq_Proc(void);//按键中断处理函数,放在irq_handler函数里面#endif命名一个button.c文件,添加公共及驱动头文件#include"button.h"#include"drivers.h"#include"tl_common.h"定义按键的GPIO#defineBUTTON_PINGPIO_PB6BUTTON_HanderBP;写一个按键处理函数,主要检测IO电平变化/*按键处理函数*/staticunsignedcharButton_Process(GPIO_PinTypeDefpin){BP.level=gpio_read(pin);//电平检测if(BP.level){BP.level=1;}else{BP.level=0;}BP.btn=BP.level;switch(BP.BST_BUF){caseB_START:if(BP.btn==0)//按键按下{BP.BST_BUF=B_STOP;BP.btr=NO_ACTION;}else{BP.BST_BUF=B_START;BP.btr=NO_ACTION;}break;caseB_STOP:if(BP.btn==1)//按键释放{if(BP.BTI_CNT>=10&&BP.BTI_CNT<100)//100ms~1s短按{BP.btr=SHORT_PRESS;//短按事件BP.BTI_CNT=0;}elseif(BP.BTI_CNT>=100&&BP.BTI_CNT<300)//1s-3s长按{BP.btr=LONG_PRESS;//长按事件BP.BTI_CNT=0;}else{BP.btr=NO_ACTION;BP.BTI_CNT=0;}BP.BST_BUF=B_START;//切回按键初始状态}else{BP.BTI_CNT++;BP.btr=NO_ACTION;}break;}returnBP.btr;}写一个按键事件函数,区分短按和长按的功能/*按键事件函数*/staticintButton_Event(GPIO_PinTypeDefpin){BP.event=Button_Process(pin);switch(BP.event){caseSHORT_PRESS://短按{printf("SHORT_PRESS!\r\n");BP.event=NO_ACTION;BP.BTI_CNT=0;break;}caseLONG_PRESS://长按{printf("LONG_PRESS!\r\n");BP.event=NO_ACTION;BP.BTI_CNT=0;break;}default:break;}}写一个10ms的定时器中断初始化函数/*定时器中断初始化*/voidButton_Timer_Init(void){reg_irq_mask|=FLD_IRQ_TMR0_EN;//timer010msintervalirqreg_tmr0_tick=0;//clearcounterreg_tmr0_capt=10*CLOCK_SYS_CLOCK_1MS;//set10msreg_tmr_sta=FLD_TMR_STA_TMR0;//clearirqstatusreg_tmr_ctrl|=FLD_TMR0_EN;//starttimerirq_enable();}写一个中断处理函数,把按键事件函数放在里面处理/*中断处理函数*/_attribute_ram_code_voidButton_Timer_Irq_Proc(void){if(reg_tmr_sta&FLD_TMR_STA_TMR0){reg_tmr_sta=FLD_TMR_STA_TMR0;//clearirqstatusButton_Event(BUTTON_PIN);//触发按键事件,低电平有效}}写一个按键初始化函数,对参数进行初始化,GPIO进行初始化/*button初始化函数*/voidButton_Init(void){BP.BST_BUF=B_START;//按键状态初始化BP.BTI_CNT=0;//触发次数初始化BP.btr=NO_ACTION;//按键返回值初始化BP.level=0;//电平值初始化BP.event=NO_ACTION;//按键事件初始化gpio_set_func(BUTTON_PIN,AS_GPIO);gpio_set_output_en(BUTTON_PIN,0);//enableoutputgpio_set_input_en(BUTTON_PIN,1);gpio_setup_up_down_resistor(BUTTON_PIN,PM_PIN_PULLUP_10K);printf("buttonioinit\r\n");Button_Timer_Init();}移植使用在project.mk里的添加$(OUT_PATH)/button.o\加入编译在maic.c的头文件添加如下头文件#include"button.h"把Button_Timer_Irq_Proc();放在maic.c的irq_handler函数里_attribute_ram_code_voidirq_handler(void){/*限于篇幅,此处代码有省*///中断Button_Timer_Irq_Proc();irq_blt_sdk_handler();}把Button_Init();放在main.c的main函数里_attribute_ram_code_intmain(void)//mustruninramcode{blc_pm_select_internal_32k_crystal();cpu_wakeup_init();intdeepRetWakeUp=pm_is_MCU_deepRetentionWakeup();//MCUdeepretentionwakeUprf_drv_init(RF_MODE_BLE_1M);gpio_init(!deepRetWakeUp);//analogresistancewillkeepavailableindeepSleepmode,sononeedinitializeagain#if(CLOCK_SYS_CLOCK_HZ==16000000)clock_init(SYS_CLK_16M_Crystal);#elif(CLOCK_SYS_CLOCK_HZ==24000000)clock_init(SYS_CLK_24M_Crystal);#elif(CLOCK_SYS_CLOCK_HZ==32000000)clock_init(SYS_CLK_32M_Crystal);#endifblc_app_loadCustomizedParameters();//loadcustomizedfreq_offsetcapvalue/*按键初始化*/Button_Init();/*限于篇幅,此处代码有省*/if(deepRetWakeUp){/***/}else{/***/}irq_enable();while(1)//main_loop{#if(MODULE_WATCHDOG_ENABLE)wd_clear();//clearwatchdog#endifblt_sdk_main_loop();/***/}}测试效果长按1次,短按8次,再长按2次,串口打印如下: -全文完-
本文档为【基于安信可TB-02-03F-04的825xSdk上按键短按及长按的功能实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
资教之佳
暂无简介~
格式:doc
大小:119KB
软件:Word
页数:13
分类:互联网
上传时间:2023-06-27
浏览量:3