/******************************************************************************* * File Name: Key.c * Function Describe:device for the Keys * Relate Module: * Explain: Hardware version is HS110C * Writer: ShiLiangWen * Date: 2015.1.26 *******************************************************************************/ #define THIS_FILE_ID 14 //-------------------------------------------------------------------------------- #include "stm32f10x.h" #include "Key.h" #include //key value variable unsigned long g_ulKeyValue; unsigned char g_ucDKC=0; unsigned char g_ucUKC=0; unsigned char g_ucKeyFree=0; unsigned char g_ucKeyMode=0; unsigned char g_ucKeyPPTPress=0; short g_iEncode=0; unsigned char g_ucEncode[20]; ////////////////////////// function declare ////////////////////////////// unsigned long KeyScanPort(void); ////////////////////////// end declare ////////////////////////////// /******************************************************************************** KeyInit *******************************************************************************/ void KeyInit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//复用功能IO 时钟使能 这里必须先使能复用IO的时钟,再关闭JTAG功能 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // JTAG-DP Disabled and SW-DP Enabled RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); /*GPIO先全部设置为上拉输入*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //PPT UP GPIO_InitStructure.GPIO_Pin=KEY_PPT_PIN; GPIO_Init(KEY_PPT_PORT, &GPIO_InitStructure); //UP GPIO_InitStructure.GPIO_Pin=KEY_UP_PIN; GPIO_Init(KEY_UP_PORT, &GPIO_InitStructure); //DOWN GPIO_InitStructure.GPIO_Pin=KEY_DOWN_PIN; GPIO_Init(KEY_DOWN_PORT, &GPIO_InitStructure); //SW1 //GPIO_InitStructure.GPIO_Pin=KEY_ENCODE1_PIN; //GPIO_Init(KEY_ENCODE1_PORT, &GPIO_InitStructure); //SW2 //GPIO_InitStructure.GPIO_Pin=KEY_ENCODE2_PIN; //GPIO_Init(KEY_ENCODE2_PORT, &GPIO_InitStructure); g_ucKeyMode=0;//连续触发模式 RunMake(THIS_FILE_ID); } void EncodeInit(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin=KEY_ENCODE1_PIN|KEY_ENCODE2_PIN; GPIO_Init(GPIOB, &GPIO_InitStructure); EXTI_ClearITPendingBit(EXTI_Line1); EXTI_ClearITPendingBit(EXTI_Line2); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2); EXTI_InitStructure.EXTI_Line = EXTI_Line1 | EXTI_Line2; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } unsigned char EncodeKeyScan() { unsigned char v; unsigned long k1,k2; k1=KEY_ENCODE1_PORT->IDR; k1 &= KEY_ENCODE1_PIN; k2=KEY_ENCODE2_PORT->IDR; k2 &= KEY_ENCODE2_PIN; k2 >>= 1; k1 >>= 1; v=(unsigned char)(k1|k2); return v; } /******************************************************************************** * Function:KeyScanPort *******************************************************************************/ unsigned long KeyScanPort(void) { #ifdef USE_NEW_KEY_DRI unsigned long temp; temp=0; //PTT if(KEY_PPT_PORT->IDR & KEY_PPT_PIN) temp |= (1<IDR & KEY_UP_PIN) temp |= (1<IDR & KEY_DOWN_PIN) temp |= (1<IDR & KEY_PPT_MIC_PIN) temp |= (1<IDR; k3&=GPIO_Pin_11;//#define GPIO_IDR_IDR11 ((uint16_t)0x0800) if(k3==0) Mic_value=0xefff;//0x1000;//; else Mic_value=0xffff;//0;//0xffff; k1=GPIOA->IDR; k1&=((KEY_PPT_PIN)|KEY_UP_PIN); k1 &= Mic_value; //8332 k2=GPIOB->IDR; k2&=KEY_DOWN_PIN; return (k1|k2); #endif } /*************************************** *flag=1 按键按下 flag=-1按键释放 ****************************************/ void KeyToModem(int flag) { // //char buf[400]; //// RunMake(THIS_FILE_ID); // if(g_ulKeyValue==KEY_PPT){ // if(flag==1){ //// MODEM_DTR_LOW; // ModemSendAT("AT+POC=10000000\r\n");// // }else{ //// MODEM_DTR_HIGH; // ModemSendAT("AT+POC=10000001\r\n"); // } // } } /************************************************************ *GetKey 读键盘数据 建议10ms调用一次此函数,不同调用时间需要修改函数内的相关参数以达到比较好的效果 参数: g_ucKeyMode=1时,单次模式 g_ucKeyMode=0时,持续模式 返回值: 0--按键无变化 1 --按键有按下: 单次模式下,当按键第一次按下才返回一次该值; 持续模式下,按着按键不放将间隔返回该值 g_ulKeyValue保存当前按键值 -1 --按键有释放.不管单次模式还是持续模式,当按键释放时只返回一次 释放后,g_ulKeyValue保存上次按下的按键值 *************************************************************/ 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>1){ sucFlag=0; } if(sucFlag==0){ Key1=KeyScanPort(); }else{ Key2=KeyScanPort(); } if(Key1!=Key2)return 0; //按键状态发生变更 if(Key!=Key1){ Key=Key1; #ifdef USE_NEW_KEY_DRI if(Key1!=KEY_PIN_ALL){ #else if(Key!=(KEY_PPT_PIN|KEY_UP_PIN|KEY_DOWN_PIN)){ #endif sucPress=1; //有按下 g_ucUKC=0; }else{ sucPress=0; //无按下 g_ucDKC=0; } } if(sucPress){//有按键按下 if(g_ucKeyMode){ //单次模式 if(sucLastPress!=sucPress){ sucLastPress=sucPress; g_ulKeyValue=Key; return 1; }else{ return 0; } }else{ //持续模式 sucLastPress=sucPress; if(0==sucCt){ g_ulKeyValue=Key1; sucCt=100;//10ms*100=1000ms 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++; } void OnOff_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO , ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = ONOFF_CK_PIN; GPIO_Init(ONOFF_CK_PORT, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9); EXTI_InitStructure.EXTI_Line = EXTI_Line9; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } void EXTI9_5_IRQHandler(void) { if(SET==EXTI_GetFlagStatus(EXTI_Line9)) {//外部电源关了 if(modemInitReady==1) { PWR_EN_HIGH;//模块已初始化成功的,需要软件关机,先锁好电源 modemPwrOffNow=1; } EXTI_ClearFlag(EXTI_Line9); } } /******************************************************************************** * End of Module *******************************************************************************/