#include "includes.h" unsigned long g_ulKeyValue; unsigned char g_ucKeyFree=0; unsigned char g_ucKeyMode=0; unsigned char g_ucKeyPPTPress=0; unsigned char g_ucUKC=0; void CheckPwrKeyOn(void) {//长按电源键直到电筒灯亮后释放 unsigned int tick=0; if(KeyPwrStatus !=0) { POWER_ON_FAILED: SlwTrace(INF, "\r\nPwrOnFailed",1); DelayMs(10); PWR_EN_LOW; while(1); } while(KeyPwrStatus==0) { if(++tick >= 200000) { MODEM_LED2_HIGH; SlwTrace(INF, "\r\nPwrOnOk",1); // while(KeyPwrStatus==0){ //// DelayMs(30); //// MODEM_LED2_LOW; //// DelayMs(30); //// MODEM_LED2_HIGH; // IWDG_ReloadCounter(); // } //MODEM_LED2_LOW; PWR_EN_HIGH;// return; } } SlwTrace(INF,"\r\nPwr erro",1); goto POWER_ON_FAILED; } //检测关机 void SoftPwrOffCheck(void) { static unsigned int seconds; if(!seconds) seconds=uSysTickGet()+500;//首次进入 if(KeyPwrStatus==0) { if(uSysTickGet() > seconds) { SlwTrace(INF, "PwrOffOk",1); // MODEM_LED1_HIGH; if(g_ucTMMode==1)while(1); UISetNextStatus(UIS_POWEROFF_WAIT); // GuiClearAll(); // GuiShowBmp(0,0,"BYEBYE.bmp"); // MODEM_PWREN_LOW; // PWR_EN_LOW; // MODEM_LED1_LOW; // while(1); } }else seconds=uSysTickGet()+100;//200 } void KeyInit(void) { GPIO_InitTypeDef GPIO_InitStructure; //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOB,ENABLE);//复用功能IO 时钟使能 这里必须先使能复用IO的时钟,再关闭JTAG功能 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // JTAG-DP Disabled and SW-DP Enabled /*GPIO先全部设置为上拉输入*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //PPT GPIO_InitStructure.GPIO_Pin=KEY_PPT_PIN; GPIO_Init(KEY_PPT_PORT, &GPIO_InitStructure); // INFO VOL+ GPIO_InitStructure.GPIO_Pin=KEY_INFO_PIN; GPIO_Init(KEY_INFO_PORT, &GPIO_InitStructure); // FUNC VOL- GPIO_InitStructure.GPIO_Pin=KEY_FUNC_PIN; GPIO_Init(KEY_FUNC_PORT, &GPIO_InitStructure); //KEY_POWER 电源检测几秒 /*GPIO设置为浮空*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin=KEY_POWER_PIN; GPIO_Init(KEY_POWER_PORT, &GPIO_InitStructure); //HEADSET_PIN 耳机检测 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin=HEADSET_PIN; GPIO_Init(HEADSET_PORT, &GPIO_InitStructure); CheckPwrKeyOn(); g_ucKeyMode=0;//连续触发模式 } static unsigned long KeyScanPort(void) { unsigned long k1,k2; k1=GPIOB->IDR; k1&=KEY_ALL_PORTB; k1<<=16; return (k1); } /************************************************************ *GetKey 读键盘数据 建议10ms调用一次此函数,不同调用时间需要修改函数内的相关参数以达到比较好的效果 参数: g_ucKeyMode=1时,单次模式 g_ucKeyMode=0时,持续模式 返回值: 0--按键无变化 1 --按键有按下: 单次模式下,当按键第一次按下才返回一次该值; 持续模式下,按着按键不放将间隔返回该值 g_ulKeyValue保存当前按键值 -1 --按键有释放.不管单次模式还是持续模式,当按键释放时只返回一次 释放后,g_ulKeyValue保存上次按下的按键值 *************************************************************/ unsigned char PttKeyFlag; int GetKey(void) { static unsigned char sucCt=0;//连续模式下响应频率控制; static unsigned char sucFlag=0; static unsigned char sucPress=0; static unsigned char sucLastPress=0; static unsigned long Key=0; static unsigned long Key1=0; static unsigned long Key2=0; //去抖动 0 1 if(++sucFlag>2){ //1 sucFlag=0; } if(sucFlag==0){ Key1=KeyScanPort(); }else{ Key2=KeyScanPort(); } if(Key1!=Key2)return 0; //按键状态发生变更 if(Key!=Key1){ Key=Key1; if(Key!=(KEY_ALL_PORTB<<16)) { sucPress=1; //有按下 printf("KEY=%lx\r\n",Key); } else { sucPress=0; //无按下 } } if(sucPress){//有按键按下 if(g_ucKeyMode){ //单次模式 if(sucLastPress!=sucPress){ sucLastPress=sucPress; g_ulKeyValue=Key; if(g_ulKeyValue==KEY_PPT)PttKeyFlag=1; printf("##############\r\n"); return 1; }else{ return 0; } }else{ //持续模式 sucLastPress=sucPress; if(0==sucCt){ g_ulKeyValue=Key1; if(g_ulKeyValue==KEY_PPT)PttKeyFlag=1; sucCt=100;//10ms*100=1000ms printf("************\r\n"); return 1; }else{ sucCt--; return 0; } } }else{ //无按键按下 sucCt=0; if(sucLastPress){ sucLastPress=0; return -1; } } return 0; } void KeyCount(void) { //if(g_ucDKC<255)g_ucDKC++; if(g_ucUKC<255)g_ucUKC++; } int GetKeyVBAT(void) { static unsigned char sucCt=0;//连续模式下响应频率控制; static unsigned char sucFlag=0; static unsigned char sucPress=0; static unsigned char sucLastPress=0; static unsigned long Key=0; static unsigned long Key1=0; static unsigned long Key2=0; //去抖动 0 1 if(++sucFlag>2){ //1 sucFlag=0; } if(sucFlag==0){ Key1=GetKeyVbat(); }else{ Key2=GetKeyVbat(); } if(Key1!=Key2)return 0; //按键状态发生变更 if(Key!=Key1){ Key=Key1; if(Key<290) { sucPress=1; //有按下 // printf("KEY=%lx............\r\n",Key); } else { sucPress=0; //无按下 } } if(sucPress){//有按键按下 if(g_ucKeyMode){ //单次模式 if(sucLastPress!=sucPress){ sucLastPress=sucPress; if(Key==0){ g_ulKeyValue=KEY_PANEL_MENU; }else if(Key<60){ g_ulKeyValue=KEY_UP_DOWN_IP; }else if(Key<100){ g_ulKeyValue=KEY_PANEL_UP; }else if(Key<180){ g_ulKeyValue=KEY_PANEL_DOWN; }else g_ulKeyValue=KEY_PANEL_EXIT; return 1; }else{ return 0; } }else{ //持续模式 sucLastPress=sucPress; // printf("KEYVbat=%d............\r\n",Key); if(0==sucCt){ //g_ulKeyValue=Key1; if(Key==0){ g_ulKeyValue=KEY_PANEL_MENU; }else if(Key<60){ g_ulKeyValue=KEY_UP_DOWN_IP; }else if(Key<100){ g_ulKeyValue=KEY_PANEL_UP; }else if(Key<180){ g_ulKeyValue=KEY_PANEL_DOWN; }else g_ulKeyValue=KEY_PANEL_EXIT; sucCt=100;//10ms*100=1000ms return 1; }else{ sucCt--; return 0; } } }else{ //无按键按下 sucCt=0; if(sucLastPress){ sucLastPress=0; return -1; } } return 0; }